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

这里要求我们写代码要有抽象的概念。什么是抽象?指由实体抽离出概念的思考过程。就是从众多的对象中抽离出共同的本质的特征。在写代码的过程中,需要抽象类的地方,只需要抓住这个类的本质功能,不要老想着它在这个工程中的具体功能。
我们继续看开放封闭原则,这个原则要求,将一个功能的共用部分和实现部分清晰地分离开来。因为在最初搭建架构的时候你不能预测到所有将要发生的变化,那么这个类也就不是一尘不变的,随着在各个模块中具体实现的时候,你发现抽象的类适合这个功能,但是对另一个功能又不适合。那么是否要返回去修改抽象类呢?这个代价是很大的,需要重新全盘思考,还要调整具体细节。如果程序还没发布还好一些,一旦程序发布了,那么返回修改抽象类,影响将更大。所以在开始抽象的时候就要防止这样的现象发生,要遵循开放封闭原则。抽象类、接口是一种标准,在程序中一旦定义好,就不能轻易去修改,需求有变化,怎么办呢?可以扩展这个接口,重写方法,或者继承后增加新的方法,但是一定不要去修改。
下面用两个例子来说明开放封闭原则。
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小时内与您取得联系。