一、什么是开放封闭原则

  开放封闭原则(Open-Closed Principle):一个软件实体 应当对扩展开放,则修改关闭。

  在设计一个模块时,应当使得这个模块可以在不被修 改的前提下被扩展。也就是说,应当可以在不必修改源 代码的情况下修改这个模块的行为。

  设计的目的便在于面对需求的改变而保持系统的相对 稳定,从而使得系统可以很容易的从一个版本升级到另 一个版本。

二、怎样做到开放封闭原则

  实际上,绝对封闭的系统是不存在的。无论模块是怎 么封闭,到最后,总还是有一些无法封闭的变化。而我 们的思路就是:既然不能做到完全封闭,那我们就应该 对那些变化封闭,那些变化隔离做出选择。我们做出选 择,然后将那些无法封闭的变化抽象出来,进行隔离, 允许扩展,尽可能的减少系统的开发。当系统变化来临 时,我们要及时的做出反应。

  我们并不害怕改变的到来。当变化到来时,我们首 先需要做的不是修改代码,而是尽可能的将变化抽象出 来进行隔离,然后进行扩展。面对需求的变化,对程序 的修改应该是尽可能通过添加代码来实现,而不是通过 修改代码来实现。

  实际上,变化或者可能的变化来的越早,抽 象就越容易,相对的,代码的维护也就越容易; 而当项目接近于完成而来的需求变化,则会使抽 象变得很困难——这个困难,并不是抽象本身的 困难,抽象本身并没有困难,困难在于系统的架构已经完成,修改牵扯的方面太多而使得抽象 工作变得很困难。

三、繁忙的银行业务员

四、轻松的银行业务员

三、开放封闭原则的优越性

  1.通过扩展已有的软件系统,可以提供新的行 为,以满足对软件的新需求,是变化中的软件有 一定的适应性和灵活性。

  2.已有的软件模块,特别是最重要的抽象模 块不能再修改,这就使变化中的软件系统有一定 的稳定性和延续性。

没使用开关封闭集合

 //银行业务员
public class BankWorker {
//负责存款业务
public void saving() {
System.out.println("进行存款操作");
} //负责取款业务
public void drawing() {
System.out.println("进行取款操作");
} //负责转账业务
public void zhuanzhang() {
System.out.println("进行转账操作");
} //负责基金的申购
public void jijin() {
System.out.println("进行基金申购操作");
}
}

测试

 public class MainClass {
public static void main(String[] args) {
BankWorker bankWorker = new BankWorker();
//存款
bankWorker.saving(); //取款
bankWorker.drawing(); //转账
bankWorker.zhuanzhang(); //基金
bankWorker.jijin();
}
}

=================================================================

银行业务员接口,是所有银行业务员的抽象父类

 public class MainClass {
public static void main(String[] args) {
BankWorker bankWorker = new BankWorker();
//存款
bankWorker.saving(); //取款
bankWorker.drawing(); //转账
bankWorker.zhuanzhang(); //基金
bankWorker.jijin();
}
}

负责取款业务的业务员

 //负责取款业务的业务员
public class DrawingBankWorker implements BankWorker{ public void operation() {
System.out.println("进行取款操作");
}
}

办基金

 //办基金
public class JiJinBankWorker implements BankWorker { public void operation() {
System.out.println("进行基金申购操作");
}
}

负责存款业务的业务员

 //负责存款业务的业务员
public class SavingBankWorker implements BankWorker { public void operation() {
System.out.println("进行存款操作");
}
}

负责转账业务的业务员

 //负责转账业务的业务员
public class ZhuanZhangBankWorker implements BankWorker { public void operation() {
System.out.println("进行转账操作");
}
}

测试

 public class MainClass {
public static void main(String[] args) {
BankWorker bankWorker = new SavingBankWorker();
bankWorker.operation(); BankWorker bankWorker2 = new DrawingBankWorker();
bankWorker2.operation(); BankWorker bankWorker3 = new ZhuanZhangBankWorker();
bankWorker3.operation(); BankWorker bankWorker4 = new JiJinBankWorker();
bankWorker4.operation();
}
}

1开放封闭原则OCP的更多相关文章

  1. 开放-封闭原则(OCP)开-闭原则 和 依赖倒转原则,单一职责原则

    单一职责原则 1.单一职责原则(SRP),就一个类而言,应该仅有一个引起它变化的原因 2.如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会消弱或抑制这个类完成其他职责的能力. ...

  2. 开放封闭原则(OCP)

    开放封闭原则 转:http://baike.baidu.com/view/2493421.htm转:http://dev.csdn.net/article/38/38826.shtm 开放封闭原则(O ...

  3. 设计模式学习--面向对象的5条设计原则之开放封闭原则--OCP

    一.OCP简介(OCP--Open-Closed Principle):Software entities(classes,modules,functions,etc.) should be open ...

  4. 开放-封闭原则(OCP)

    对于僵化性的臭味,应用OCP原则之后,再进行同样的改动时,只需添加新代码,而不必改动已正常运行的代码. 扩展模块行为的方式通常是修改模块的Code,不允许修改的模块常常被认为是具有固定的行为. Ope ...

  5. C++ 设计模式 开放封闭原则 简单示例

    C++ 设计模式 开放封闭原则 简单示例 开放封闭原则(Open Closed Principle)描述 符合开放封闭原则的模块都有两个主要特性: 1. 它们 "面向扩展开放(Open Fo ...

  6. 设计模式之开放-封闭原则(引申出Objective-C中继承、Category、Protocol三者的区别,这点面试常问)

    开放封闭原则(OCP原则The Open-Closed Principle)是面向对象的核心设计所在.它是说,软件开发实体(类.模块.函数等)应该可以扩展,但是不能修改. 这个原则有两个特征,一个是说 ...

  7. Observer观察者模式与OCP开放-封闭原则

    目录 场景引入 在联网坦克项目中使用观察者模式 总结 在学习Observer观察者模式时发现它符合敏捷开发中的OCP开放-封闭原则, 本文通过一个场景从差的设计开始, 逐步向Observer模式迈进, ...

  8. (转) 面向对象设计原则(二):开放-封闭原则(OCP)

    原文:https://blog.csdn.net/tjiyu/article/details/57079927 面向对象设计原则(二):开放-封闭原则(OCP) 开放-封闭原则(Open-closed ...

  9. 开放-封闭原则(OCP)

    怎样的升级才能面对需求的改变却可以保持相对稳定,从而使得系统可以在第一个版本以后不断推出新的版本呢?开放-封闭原则(The Open-Closed Principle, OCP)为我们提供了指引.软件 ...

随机推荐

  1. redis:order set有序集合类型的操作(有序集合)

    1. order set有序集合类型的操作(有序集合) 有序集合是在无序集合的基础上加了一个排序的依据,这个排序依据叫score,因此声明一个集合为有序集合的时候要加上score(作为排序的依据) 1 ...

  2. 唐平中讲座笔记 Reinforcement mechanism design 20171107

    渣排版预警,纯草稿... 唐平中.研究方向是经济学和ai方向,机制设计和拍卖设计. 内容:广告优化的方法论,自动优化. [内容] Basics on mechanism design and resr ...

  3. 小甲鱼Python第四讲课后习题

    1while语句中,当条件为真时,它会一直循环下去,比如下面的例子,不过可以用Ctral + C来强制结束 while 'C': print("i love you") 2.观察打 ...

  4. all to do list

    要做的任务: 1. docker 学习 2. python docker应用 3. python 异步爬虫 4. python 词云 5. Java根据代码自动生成接口文档(Swagger)  > ...

  5. poj2376 Cleaning Shifts(区间贪心,理解题意)

    https://vjudge.net/problem/POJ-2376 题意理解错了!!真是要仔细看题啊!! 看了poj的discuss才发现,如果前一头牛截止到3,那么下一头牛可以从4开始!!! # ...

  6. 初始化bootstrap treeview树节点

    最近在做启明星图库时,使用了Jquery Bootstrap  Treeview插件.但是,遇到了一个初始化的问题.先看效果如下: 当用户打开图库时,左边分类第一个类别是“所有分类”,默认需要选中. ...

  7. centos7下使用rpm包安装clickhouse

    clickhouse是由俄罗斯Yandex公司开发的列式存储数据库,于2016年开源,clickhouse的定位是快速的数据分析,对于处理海量数据的情况性能非常好,在网上也有很多测试的案例,在大数据的 ...

  8. 与临时对象的斗争(上)ZZ

    C++ 是一门以效率见长的语言(虽然近来越来越多的人“不齿”谈及效率,我深以为不然,在某一次的程序编写中不对效率锱铢必较并不意味意味着我们就不应该追求更多的更好的做法).总之吧,相比起其它语言,程序员 ...

  9. 找回停掉docker的文件

    如果容器还能重启,就restart, 如果状态是DEAD的话, Error response from daemon: Container is marked for removal and cann ...

  10. PHP异步扩展Swoole笔记(2)

    dispatch_mode, 数据包分发策略 可以选择7种类型,默认为21,轮循模式,收到会轮循分配给每一个Worker进程2,固定模式,根据连接的文件描述符分配Worker.这样可以保证同一个连接发 ...