全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

开放封闭原则_动力节点Java学院整理

定义:软件实体(类、模块、函数等)应该是可以扩展的,但是不可修改。对于扩展是开放的,对于更改是封闭的。关键是抽象,将一个功能的通用部分和实现细节部分清晰的分离开来。

这里要求我们写代码要有抽象的概念。什么是抽象?指由实体抽离出概念的思考过程。就是从众多的对象中抽离出共同的本质的特征。在写代码的过程中,需要抽象类的地方,只需要抓住这个类的本质功能,不要老想着它在这个工程中的具体功能。

我们继续看开放封闭原则,这个原则要求,将一个功能的共用部分和实现部分清晰地分离开来。因为在最初搭建架构的时候你不能预测到所有将要发生的变化,那么这个类也就不是一尘不变的,随着在各个模块中具体实现的时候,你发现抽象的类适合这个功能,但是对另一个功能又不适合。那么是否要返回去修改抽象类呢?这个代价是很大的,需要重新全盘思考,还要调整具体细节。如果程序还没发布还好一些,一旦程序发布了,那么返回修改抽象类,影响将更大。所以在开始抽象的时候就要防止这样的现象发生,要遵循开放封闭原则。抽象类、接口是一种标准,在程序中一旦定义好,就不能轻易去修改,需求有变化,怎么办呢?可以扩展这个接口,重写方法,或者继承后增加新的方法,但是一定不要去修改。

下面用两个例子来说明开放封闭原则。

1、连接数据库为例。

比如在程序中用到的不同类型的数据库连接,Access和Oracle。直接连接如下:

class ConnectAccess 
{ 
  public string ConnectString() 
  { 
    string dataPath = "数据库路径"; 
    return string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Persist Security Info=True;Jet OLEDB:Database Password={1}", dataPath, "密码"); 
  } 
} 
class ConnectOracle 
{ 
  public string ConnectString() 
  { 
    return @"server=localhost;database=命名空间;uid=用户名;pwd=密码"; 
  } 
} 

调用

static void Main(string[] args) 
 { 
   //连接Access 
  ConnectAccess connAccess = new ConnectAccess(); 
 
  OleDbConnection accessConnection = new OleDbConnection(connAccessConnectString()); 
 
   //连接Oracle 
  ConnectOracle connOracle = new ConnectOracle(); 
 
  OracleConnection oracleConnection = new OracleConnection(connOracleConnectString()); 
 } 

这样每次都要去考虑OleDbConnection的参数到底用哪个。下面修改一下。抽象一个接口。

interface ConnectDataBase 
{ 
  string ConnectString(); 
} 
 
class ConnectAccess : ConnectDataBase 
{ 
  #region ConnectDataBase 成员 
 
  public string ConnectString() 
  { 
    string dataPath = "数据库路径"; 
 
    return stringFormat("Provider=MicrosoftJetOLEDB0;Data Source={0};Persist Security Info=True;Jet OLEDB:Database Password={1}", dataPath, "密码"); 
  } 
 
  #endregion 
} 
 
class ConnectOracle : ConnectDataBase 
{ 
  #region ConnectDataBase 成员 
 
  public string ConnectString() 
  { 
    return @"server=localhost;database=命名空间;uid=用户名;pwd=密码"; 
  } 
 
  #endregion 
} 

调用

static void Main(string[] args) 
{ 
  ConnectDataBase conn = null; 
 
  //连接Access 
  conn = new ConnectAccess(); 
 
  OleDbConnection accessConnection = new OleDbConnection(connConnectString()); 
 
  //连接Oracle 
  conn = new ConnectOracle(); 
 
  OracleConnection oracleConnection = new OracleConnection(connConnectString()); 
} 

改过后,只需关心conn用哪一个类实例化,就可以了。不过大家可能看到,由于Oracle的连接必须OracleConnection,可能优势不容易看出来。

2、基本类型作为方法参数为例。

一般的设计原则之所以强调方法参数尽量避免基本类型,原因正在于此。比较如下两个方法定义:

//定义1  
bool Connect(string userName, string password, string wifiAddress, int port) 
{ 
  return false; 
} 
//定义2  
bool Connect(Account account) 
{ 
  return false; 
} 
public class Account 
{ 
  public string UserName 
  { 
    get; 
    set; 
  } 
  public string Password 
  { 
    get; 
    set; 
  } 
  public string WifiAddress 
  { 
    get; 
    set; 
  } 
  public int Port 
  { 
    get; 
    set; 
  } 
} 

相比较而言,定义2多了一个Account类的定义,Connect()方法明显更加稳定。如果Connect()方法wifiAddress发生改变,定义1必须修改该方法的接口,对应的,所有调用Connect()方法的对象都会受到影响;而定义2只需要修改Account类,由于Connect()方法的接口保持不变,而对于Connect()方法的调用者并不需wifiAddress,这样的修改就完全不会影响调用者,从而降低需求变化带来的影响。

总之开放封闭原则最关键的是抽象,但是也并不是说一旦抽象接口、类确定就一定不能修改。只是,我们在抽象的时候就要全面思考,争取做到不用修改,一旦需求有变化,只需在实现的时候有变动。当然,需求是千变万化的,一旦需要改动抽象的部分,那么只要前面严格遵循了该原则,影响也会小得多。当然了如果修改了,一定要进行单元测试,凡是用到的地方都要测试正确。


# 开放封闭原则  # 开放封闭原则例子  # Java设计模式常用原则解析  # 单一职责原则_动力节点Java学院整理  # 高内聚低耦合原则_动力节点Java学院整理  # 合成聚合复用原则_动力节点Java学院整理  # ocp开闭原则_动力节点Java学院整理  # Java中的设计模式与7大原则归纳整理  # 浅谈Java设计模式之开放封闭原则  # 简单讲解Java设计模式编程中的单一职责原则  # 理解Java设计模式编程中的迪米特原则  # 详解java设计模式之六大原则  # 只需  # 抽象类  # 要去  # 为例  # 的是  # 是一种  # 还没  # 也会  # 都要  # 也就  # 调用者  # 要有  # 更大  # 得多  # 不容易  # 就不能  # 是说  # 千变万化  # 重写  # 只需要 


相关文章: 如何制作网站标识牌,动态网站如何制作(教程)?  外贸公司网站制作哪家好,maersk船公司官网?  七夕网站制作视频,七夕大促活动怎么报名?  专业商城网站制作公司有哪些,pi商城官网是哪个?  seo网站制作优化,网站SEO优化步骤有哪些?  天津个人网站制作公司,天津网约车驾驶员从业资格证官网?  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  岳西云建站教程与模板下载_一站式快速建站系统操作指南  动图在线制作网站有哪些,滑动动图图集怎么做?  专业网站制作服务公司,有哪些网站可以免费发布招聘信息?  建站之星下载版如何获取与安装?  建站主机选购指南:核心配置优化与品牌推荐方案  深圳 网站制作,深圳招聘网站哪个比较好一点啊?  模具网站制作流程,如何找模具客户?  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  非常酷的网站设计制作软件,酷培ai教育官方网站?  制作网站的基本流程,设计网站的软件是什么?  建站主机与服务器功能差异如何区分?  北京的网站制作公司有哪些,哪个视频网站最好?  如何在Golang中使用encoding/gob序列化对象_存储和传输数据  制作国外网站的软件,国外有哪些比较优质的网站推荐?  再谈Python中的字符串与字符编码(推荐)  如何通过建站之星自助学习解决操作问题?  ,sp开头的版面叫什么?  如何快速查询域名建站关键信息?  如何在云指建站中生成FTP站点?  香港服务器如何优化才能显著提升网站加载速度?  建站之星如何快速解决建站难题?  定制建站哪家更专业可靠?推荐榜单揭晓  可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?  如何快速启动建站代理加盟业务?  黑客如何利用漏洞与弱口令入侵网站服务器?  定制建站方案优化指南:企业官网开发与建站费用解析  如何用AWS免费套餐快速搭建高效网站?  javascript中对象的定义、使用以及对象和原型链操作小结  企业网站制作公司网页,推荐几家专业的天津网站制作公司?  济南网站建设制作公司,室内设计网站一般都有哪些功能?  如何基于云服务器快速搭建网站及云盘系统?  如何通过主机屋免费建站教程十分钟搭建网站?  北京网站制作网页,网站升级改版需要多久?  如何在景安云服务器上绑定域名并配置虚拟主机?  香港网站服务器数量如何影响SEO优化效果?  建站之星代理商如何保障技术支持与售后服务?  如何在万网主机上快速搭建网站?  建站上传速度慢?如何优化加速网站加载效率?  如何快速搭建高效WAP手机网站吸引移动用户?  如何高效利用亚马逊云主机搭建企业网站?  Python文件管理规范_工程实践说明【指导】  公司网站制作费用多少,为公司建立一个网站需要哪些费用?  建站VPS能否同时实现高效与安全翻墙? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。