老四持续为设计模式挖坑,今天浅析一下设计模式中涉及到的面向对象设计原则之一,开放-封闭原则。还是那句话,对于程序员来讲,精彩的代码是如何想出来的,要比看到精彩的代码更加令人期待。
定义
开放-封闭原则(The Open-Closed Principle,简称 OCP):开闭原则由 Bertrand Meyer 于 1988 年提出,一个软件实体应当对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展。
此设计原则其实要求我们面对变化的需求要保证系统的稳定性,它要求我们面对新的需求产生的时候,不是修改原有的代码,而是通过新增模块或者代码的方式动态的、有策略的实现、应对变化的需求。比如说你已经定义了一个会跳会跑的动作类实体,在里面你已经判断狗会跑猫会跳,但是突然你要加一个鸟会飞,这个时候你不得不修改动作实体,导致程序设计框架变更。如果我们在开发工作发生不久之后就掌握可能发生的变化,提前设计会给以后的开发带来很大程度上的便捷。否则,可能发生的变化所等待的事件越长,要创建正确的抽象就越困难。
开放-封闭原则是面向对象设计的核心所在
遵循这个原则可以带来面向对象技术所声称的巨大好处,也就是可维护、可扩展、可复用、灵活性好。开发人员应该仅对程序中呈现出频繁变化的那些部分做出抽象,然而,对于应用程序中的每个部分都刻意地进行抽象同样不是一个好主意。拒绝不成的抽象和抽象本身一样重要。
代码如下,更多完整项目请在文末获取。
普通的对象:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
package com.glorze.general; /** * 面向对象普通操作类 * 客户在银行的操作 * @ClassName BankAction * @author: glorze.com * @since: 2018年3月11日 下午5:05:51 */ public class BankAction { /** * 存钱 * @Title: saveMoney * @return void * @author: 高老四博客 * @since: 2018年3月11日 下午5:06:56 */ public void saveMoney(){ System.out.println("高老四来银行存钱"); } /** * 取钱 * @Title: drawMoney * @return void * @author: 高老四博客 * @since: 2018年3月11日 下午5:07:02 */ public void drawMoney(){ System.out.println("高老四来银行取钱"); } /** * 转账 * @Title: transferAccounts * @return void * @author: 高老四博客 * @since: 2018年3月11日 下午5:09:16 */ public void transferAccounts(){ System.out.println("一大批读者给老四转账,嘿嘿!"); } public static void main(String[] args) { BankAction bankAction = new BankAction(); bankAction.saveMoney(); bankAction.drawMoney(); bankAction.transferAccounts(); } } |
符合开闭原则的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
package com.glorze.openclosed; /** * 跟BankAction不同,所谓开房封闭原则就是将银行的动作抽象出来,定义抽象类或者接口 * @ClassName BankActionInterface * @author: glorze.com * @since: 2018年3月11日 下午5:14:12 */ public interface BankActionInterface { /** * 银行客户的操作 * @Title: operation * @return void * @author: 高老四博客 * @since: 2018年3月11日 下午5:16:38 */ void operation(); } |
然后通过新建立的操作类实现接口,从而符合开放-封闭原则。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
package com.glorze.openclosed; /** * 存钱 * @ClassName SaveMoney * @author: glorze.com * @since: 2018年3月11日 下午5:22:19 */ public class SaveMoney implements BankActionInterface { @Override public void operation() { System.out.println("高老四来银行存钱"); } } |
完整项目下载地址文末自助获取。
更博不易,如果觉得文章对你有帮助并且有能力的老铁烦请捐赠盒烟钱,点我去赞助。或者扫描文章下面的微信/支付宝二维码打赏任意金额(点击「给你买杜蕾斯」),也可扫描小站放的支付宝领红包二维码,线下支付享受优惠的同时老四也可以获得对应赏金,老四这里抱拳谢谢诸位了。捐赠时请备注姓名或者昵称,因为您的署名会出现在赞赏列表页面,您的捐赠钱财也会被用于小站的服务器运维上面,再次抱拳感谢。
资源下载
隐藏内容:******,购买后可见!
下载价格:0 G币
您需要先登录后,才能购买资源
欢迎访问高老四博客(glorze.com),本站技术文章代码均为老四亲自编写或者借鉴整合,其余资源多为网络收集,如涉及版权问题请与站长联系。如非特殊说明,本站所有资源解压密码均为:glorze.com。