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

[经验分享] 面向对象设计原则:开放-封闭原则(OCP)

[复制链接]

尚未签到

发表于 2015-6-17 08:47:45 | 显示全部楼层 |阅读模式
  ●定义
  软件实体(类、模块、函数等)应该是可以扩展的,但是不可修改的。
  “开放-封闭”原则(The open-Closed Principle)可以说是面向对象设计的核心所在。
  “开放-封闭”原则的两个重要特点是“对扩展开放,对修改关闭”,即允许对程序作出扩展(以扩展的方式响应需求的变化),但拒绝对程序作出修改(即修改之前运行良好的程序)。
  实现“开放-封闭”原则的重要机制就是“抽象”与“多态”。通过对“变化”进行抽象隔离,使程序具有更好的扩展性与可维护性。
  ●以具体的代码演示OCP
  没有遵循OCP原则的示例
  客户将要使用的电脑(方正)
  public class FangZhengComputer
{
public FangZhengComputer()
{
    //...构造函数
}
public string OutCpuInfo()
{
    return "fangzheng's Cpu!" ;
}
//...other Method
}
  客户使用电脑(客户代码)
  FangZhengComputer  myComputer = new FangZhengComputer() ;
myComputer.OutCpuInfo() ;
  上面代码中客户使用的是方正电脑。现在,客户要使用联想电脑(需求变化),那我们的程序应该怎么变化?很明显,我们可能会增加一种电脑类型(有人也许会直接将方正电脑改变联想电脑),然后去更改客户端的代码。这样做带来的后果在某些情况下是很难让人接受的。
  遵循OCP原则的示例
  上面的代码其弊端在于:客户端直接依赖于一个具体的实现,当具体实现发生变化时,客户端代码也要发生变化。现在,我们将“变化”的部分(即 new FangZhengComputer() ;)进行抽象隔离。
  首先定义一个抽象类,它是客户使用电脑的基类
  public abstract class Computer
{
   public abstract string OutCpuInfo();
   //other Method
}
  然后定义一个联想电脑类,它从Computer类继承
  public class LianXiangComputer : Computer
{
   public override string OutCpuInfo()
   {
    return "LianXiangComputer's Cpu!" ;
   }
   //other Method
}
  客户端调用:
  Computer myComputer = new Computer () ;
  这时,客户端依赖就不是一个具体的实现了,它依赖的是一个抽象,所以当Computer类的某个子类发生变化时,客户端代码是不需要发生变化的。这样,如果客户今天又要使用宏基电脑,那只需要从Computer 类继承一个子类就可以了,这就是扩展,同时,之前的代码(包括客户端的和已经存在的电脑类型)都不需要发生变化。
  (我们上面的代码不是很完全,可以利用工厂加上配置文件来动态指定所要使用的电脑类型)

运维网声明 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-78040-1-1.html 上篇帖子: OCP-1Z0-051-题目解析-第3题 下篇帖子: 微软最终加入OCP阵营,开源其云服务器设计
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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