设为首页 收藏本站
查看: 1609|回复: 0

[经验分享] 浅谈设计原则OCP

[复制链接]

尚未签到

发表于 2015-11-8 14:19:36 | 显示全部楼层 |阅读模式
OCP(The Open-Close Principle, 开放-封闭原则)

软件实体(类、模块、函数等)应该是可扩展的,但是不可修改

特征:

  对于扩展是开放的(Open for extension)
  


  模块的行为可以扩展,当应用的需求改变时,可以对模块进行扩展,以满足新的需求
  


  对于更改是封闭的(Closed for modification)
  


  对模块行为扩展时,不必改动模块的源代码或二进制代码
  


  OCP的关键在于抽象


  OCP的关键在于抽象
  

抽象技术:abstract class, Interface

  

抽象预见了可能的所有扩展(闭) 【PS:抽象出不变的】

  

由抽象可以随时导出新的类(开) 【PS:  变化的交给子类】



  


   DSC0000.jpg     DSC0001.jpg


  



范例:手与门

如何在程序中模拟用手去开门和关门?


行为:



开门(open)



关门(close)



判断门的状态(isOpened)                   DSC0002.jpg













  设计与实现
  


  public class Door {
private boolean _isOpen=false;
public boolean isOpen(){
return _isOpen;
}
public void open(){
_isOpen = true;
}
public void close(){
_isOpen = false;
}
}


  



public class Hand {
public Door door;
void do() {
if (door.isOpen())
door.close();
else
door.open();
}
}

public class SmartTest {
public static void main(String[] args) {
Hand myHand = new Hand();
myHand.door = new Door();
myHand.do();
}
}

虽然实现了,但是如果有新的需求我们要改写代码  


  新的需求……


  
  需要手去开关抽屉,冰箱……?
  


  我们只好去修改程序!




DSC0003.jpg


  


  public class Hand {
public Door door;
public Drawer drawer;
void do(int item) {
switch (item){
case 1:
if (door.isOpen())
door.close();
else   door.open();
break;
case 2:
if (drawer.isOpen())
drawer.close();
else  drawer.open();
break;
}
}
}


符合OCP的设计方案


  
   DSC0004.jpg


  


  public interface Excutable {
public boolean isOpen();
public void open();
public void close();
}

  



新的实现  
  public class Door implements Excutable {
private boolean _isOpen = false;
public boolean isOpen() {
return _isOpen;
}
public void open() {
_isOpen = true;
}
public void close() {
_isOpen = false;
}
}


  



public class Drawer implements Excutable {
private boolean _isOpen = false;
public boolean isOpen() {
return _isOpen;
}
public void open() {
_isOpen = true;
}
public void close() {
_isOpen = false;
}
}


public class Hand {
public Excutable item;
void do() {
if (item.isOpen())
item.close();
else
item.open();
}
}



  其实笔者认为,开闭原则无非就是想表达这样一层意思:用抽象构建框架,用实现扩展细节。因为抽象灵活性好,适应性广,只要抽象的合理,可以基本保持软件架构的稳定。而软件中易变的细节,我们用从抽象派生的实现类来进行扩展,当软件需要发生变化时,我们只需要根据需求重新派生一个实现类来扩展就可以了。当然前提是我们的抽象要合理,要对需求的变更有前瞻性和预见性才行。【PS:具有前瞻性的设计类结构,而不是盲目在于实现,抽象的好,自然就可以直接派生了】





版权声明:本文为博主原创文章,未经博主允许不得转载。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-136647-1-1.html 上篇帖子: 六大原则之“开闭原则(OCP)“笔记 下篇帖子: 开-闭”原则(OCP)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表