在线咨询
微博
网吧论坛
游戏告警
网吧特权
全站搜索
APP下载
开网吧
开网咖
注册
网吧转让
网吧供求
关注微信
网吧联盟论坛
网吧系统
┊
网吧经营
┊
网吧无盘
网吧计费
┊
网吧心声
┊
网咖天下
网吧论坛
┊
网吧专题
┊
网吧游戏
首 页
网吧网咖
天下网咖
网吧无盘
网吧技术
网吧经营
电竞酒店
网吧方案
网吧路由
系统开号
推荐大家使用天下网吧小程序
办理Steam特权,网吧加速器,开号服务
网吧无盘系统开号
网吧管理
网吧政策
网吧经营
网吧热点
网吧配机
网吧装修
网吧转让
网吧观点
网吧系统
技术论坛
网吧系统
无盘技术
软件技术
硬件技术
网络技术
网吧路由
网吧安全
网吧故障
网吧计费
技术论坛
无盘教程
无盘优化
无盘工具
无盘配机
无盘故障
无盘论坛
VLAN方案
无线方案
方案实例
方案分析
装修方案
游戏管理
整体方案
无盘方案
软件方案
网络方案
网吧政策
网吧经营
网吧展示
网吧装修
网吧配机
产品评测
产品导购
最新动态
配机展示
网咖桌椅
网咖经营
电竞网咖
网咖VR
网咖水吧
网咖转型
网咖配机
网咖动态
网咖微信营销
网咖欣赏
路由教程
路由下载
路由脚本
路由经验
路由施工
路由工具
路由论坛
宁夏
浙江
贵州
其它省市
四川
电竞酒店网络
电竞酒店装修
行业动态
电竞酒店管理
电竞酒店系统
推荐网吧
网吧黄页
网吧装修
环境设施
网吧电脑
网吧软件
系统桌面
国外网吧
您现在的位置:
天下网吧
>>
网吧天地
>>
天下码农
>>
微信小程序
>> 正文
开放封闭原则--OCP
2010-12-22
vczx
佚名
【
大
中
小
】
一、OCP简介(OCP
--Open-Closed Principle
):
Software entities(classes,modules,functions,etc.) should be open for extension, but closed for modification。
软件实体应当对扩展开放,对修改关闭,即软件实体应当在不修改(在.Net当中可能通过代理模式来达到这个目的)的前提下扩展。
Open for extension:当新需求出现的时候,可以通过扩展现有模型达到目的。
Close for modification:对已有的二进制代码,如dll,jar等,则不允许做任何修改。
二、OCP举例:
1、例子一
假如我们要写一个工资税类,工资税在不同国家有不同计算规则,如果我们不坚持OCP,直接写一个类封装工资税的算税方法,而每个国家对工资税的具体实现细节是不尽相同的!如果我们允许修改,即把现在系统需要的所有工资税(中国工资税、美国工资税等)都放在一个类里实现,谁也不能保证未来系统不会被卖到日本,一旦出现新的工资税,而在软件中必须要实现这种工资税,这个时候我们能做的只有找出这个类文件,在每个方法里加上日本税的实现细节并重新编译成DLL!虽然在.NET的运行环境中,我们只要将新的DLL覆盖到原有的DLL即可,并不影响现有程序的正常运行,但每次出现新情况都要找出类文件,添加新的实现细节,这个类文件不断扩大,以后维护起来就变的越来越困难,也并不满足我们以前说的单一职责原则(SRP),因为不同国家的工资税变化都会引起对这个类的改变动机!
如果我们在设计这个类的时候坚持了OCP的话,把工资税的公共方法抽象出来做成一个接口,封闭修改,在客户端(使用该接口的类对象)只依赖这个接口来实现对自己所需要的工资税,以后如果系统需要增加新的工资税,只要扩展一个具体国家的工资税实现我们先前定义的接口,就可以正常使用,而不必重新修改原有类文件!
2、例子二
下面这个例子就是既不开放也不封闭的,因为Client和Server都是具体类,如果我要Client使用不同的一个Server类那就要修改Client类中所有使用Server类的地方为新的Server类。
class Client
{
Server server;
void GetMessage()
{
server.Message();
}
}
class Server
{
void Message();
}
下面为修改后符合OCP原则的实现,我们看到Server类是从ClientInterface继承的,不过ClientInterface却不叫ServerInterface,原因是我们希望对Client来说ClientInterface是固定下来的,变化的只是Server。这实际上就变成了一种策略模式(Gof Strategy)
interface ClientInterface
{
public void Message();
//Other functions
}
class Server:ClientInterface
{
public void Message();
}
class Client
{
ClientInterface ci;
public void GetMessage()
{
ci.Message();
}
public void Client(ClientInterface paramCi)
{
ci=paramCi;
}
}
//那么在主函数(或主控端)则
public static void Main()
{
ClientInterface ci = new Server();
//在上面如果有新的Server类只要替换Server()就行了.
Client client = new Client(ci);
client.GetMessage();
}
3、例子三
使用Template Method实现OCP:
public abstract class Policy
{
private int[] i ={ 1, 1234, 1234, 1234, 132 };
public bool Sort()
{
SortImp();
}
protected virtual bool SortImp()
{
}
}
class Bubbleimp : Policy
{
protected override bool SortImp()
{
//冒泡排序
}
}
class Bintreeimp : Policy
{
protected override bool SortImp()
{
//二分法排序
}
}
//主函数中实现
static void Main(string[] args)
{
//如果要使用冒泡排序,只要把下面的Bintreeimp改为Bubbleimp
Policy sort = new Bintreeimp();
sort.Sort();
}
三、OCP优点:
1、降低程序各部分之间的耦合性,使程序模块互换成为可能;
2、使软件各部分便于单元测试,通过编制与接口一致的模拟类(Mock),可以很容易地实现软件各部分的单元测试;
3、利于实现软件的模块的呼唤,软件升级时可以只部署发生变化的部分,而不会影响其它部分;
四、使用OCP注意点:
1、实现OCP原则的关键是抽象;
2、两种安全的实现开闭原则的设计模式是:Strategy pattern(策略模式),Template Methord(模版方法模式);
3、依据开闭原则,我们尽量不要修改类,只扩展类,但在有些情况下会出现一些比较怪异的状况,这时可以采用几个类进行组合来完成;
4、将可能发生变化的部分封装成一个对象,如: 状态, 消息,,算法,数据结构等等 , 封装变化是实现"开闭原则"的一个重要手段,如经常发生变化的状态值,如温度,气压,颜色,积分,排名等等,可以将这些作为独立的属性,如果参数之间有关系,有必要进行抽象。对于行为,如果是基本不变的,则可以直接作为对象的方法,否则考虑抽象或者封装这些行为;
5、在许多方面,OCP是面向对象设计的核心所在。遵循这个原则可带来面向对象技术所声称的巨大好处(灵活性、可重用性以及可维护性)。然而,对于应用程序的每个部分都肆意地进行抽象并不是一个好主意。应该仅仅对程序中呈现出频繁变化的那部分作出抽象。拒绝不成熟的抽象和抽象本身一样重要;
欢迎访问最专业的网吧论坛,无盘论坛,网吧经营,网咖管理,网吧专业论坛
https://bbs.txwb.com
关注天下网吧微信/下载天下网吧APP/天下网吧小程序,一起来超精彩
本文来源:
vczx
作者:佚名
上一篇文章:
分区表、分区索引和全局索引部分总结
下一篇文章:
ASP.NET常用语句1--20条
相关文章
ETCP谭龙在首届中国城市停车大会承诺全面开放
3.0版检测体系上线 人人车推出“全民开放检测
黄金红包今日开放公测 微信又一个大招来了
首汽约车推加盟平台:面向企业开放 明年预期规
品牌开放化Logo产品化 飞猪:品牌不该是固化
星河互联2016创业伙伴大会:全面开放创服平台
在Win10电脑连接开放Wifi的注意事项
红豆Live宣布将向微博签约自媒体开放 垂直内容
网易进军智能硬件市场 插线板、充电器等5款产
网咖空调开放,先进行空调清洗
推荐专题 ┊
更多专题..
网吧卫生
网吧电脑配置
开网吧
网吧键盘
网吧配置
网吧GHOST
ROS
网吧软件故障解决
网众无盘
网吧游戏菜单
网吧活动
网吧优化
网吧精品
网吧新手
声明
声明:本站所发表的文章、评论及图片仅代表作者本人观点,与本站立场无关。若文章侵犯了您的相关权益,请及时与我们联系,我们会及时处理,感谢您对本站的支持!联系邮箱:support@txwb.com,系统开号,技术支持,服务联系QQ:
1175525021
本站所有有注明来源为天下网吧或天下网吧论坛的原创作品,各位转载时请注明来源链接!
天下网吧 网吧天下
推荐文章
网吧语音呼叫哪款好用?体验简约
免费绿色简单的网吧语音呼叫系统,天下网吧会员的经典作品,功能强大,使用简单,上手
解决网吧Steam登陆慢的批处理源码
本批处理是解决Steam登陆慢的问题专门编写。原理是修改hosts文件让相关域……
网吧语音呼叫哪款好用?体验简约绿
解决网吧Steam登陆慢的批处理源码
疫情当下,网吧自救讨论之二:租电
疫情下网吧转让增多,疫情期间接手
洛阳网吧求助信,疫情下的网吧行业
网吧做好系统安全,防盗号三要三不
网吧和电竞酒店使用的系统教程和下
网吧千兆低成本升级方案:2.5G到桌
网吧员工服务态度怎么抓上去,我网
关于WIN10下网吧客户端中文输入法与
最新文章
又是一家疫情期间违规营业的网吧
之前天下网吧注意到相关的新闻并发布了预警内容提醒各位疫情期间请按相关规定操作。……
部分网吧英雄联盟卡顿现象持续,
自从3-31日英雄联盟停机更新维护以来,不少网吧在天下网吧上反映卡顿的问题。天……
又是一家疫情期间违规营业的网吧:负责
部分网吧英雄联盟卡顿现象持续,官方称
2022-04-02日网吧游戏更新信息,敬请关注
web端看图神器viewer.js,修复移动端触
网吧Steam每次启动都提示更新,查找日志
网吧疫情停业的网吧自救方案,有人已经
「韬光养晦」二十多年,Intel发力PC端独
设置网吧Steam节点到ChongQing,实现游
2022-04-01日网吧游戏更新信息,敬请关注
macOS Monterey 12.3.1值得升级吗?MBP
本周热门
本月热门
阅读排行
网吧疫情停业的网吧自救方案,有人
网吧语音呼叫哪款好用?体验简约绿
解决网吧Steam登陆慢的批处理源码
又是一家疫情期间违规营业的网吧:
部分网吧英雄联盟卡顿现象持续,官
2022-04-02日网吧游戏更新信息,敬请
web端看图神器viewer.js,修复移动
网吧Steam每次启动都提示更新,查找
LOL酒桶打野E闪 雷柏VT30电竞
雷柏VH650耳机推荐听大片—八佰
网吧和电竞酒店使用的系统教程和下
最近网吧老被盗号,分享一款工具可
英雄联盟进不去,卡「重新连接」界
带120台以上的大型网吧/电竞酒店游
网吧的英雄联盟掉帧、卡顿,CF卡顿
2022年网咖最常玩的游戏是啥?来看
最近显卡降价了,2060快降到发行价
杨天祥与他的网吧故事——网吧行业
2022年网吧可以用电子身份证了吗?
开网吧一天能赚多少钱的数据分析
网吧员工服务态度怎么抓上去,我网
网吧千兆低成本升级方案:2.5G到桌
网吧和电竞酒店使用的系统教程和下
最近网吧老被盗号,分享一款工具可
英雄联盟进不去,卡「重新连接」界
2022年开网吧服务器电脑配置方案三
自从干了网吧,成了人下人了,见谁
从23个习惯中可以看出你是不是老网
带120台以上的大型网吧/电竞酒店游
网吧的英雄联盟掉帧、卡顿,CF卡顿
正在加载..