设计模式(1)-- 七大软件设计原则-开闭原则
前言
学习设计原则,学习设计模式的基础。在实际开发过程中,并不是一定要求所有代码都遵循设计原则,我们要考虑人力、时间、成本、质量,不是刻意追求完美,要在适当的场景遵循设计原则,体现的是一种平衡取舍,帮助我们设计出更加优雅的代码结构。
开闭原则(Open-Closed Principle, OCP)
定义 : 一个软件实体如类,模块和函数应该对扩展开放,对修改关闭,开闭原则也是其他五个原则的基石
开闭原则是指一个软件实体如类、模块和函数应该对扩展开放, 对修改关闭。所谓的开闭,也正是对扩展和修改两个行为的一个原则。强调的是用抽象构建框架,用实现扩展细节。可以提高软件系统的可复用性及可维护性。
开闭原则是面向对象设计中最基础的设计原则。它指导我们如何建立稳定灵活的系统,例如:我们版本更新,我尽可能不修改源代码,但是可以增加新功能。
在现实生活中对于开闭原则也有体现。比如,很多互联网公司都实行弹性制作息时间,规定每天工作 8 小时。意思就是说,对于每天工作 8 小时这个规定是关闭的,但是你什么时候来,什么时候走是开放的。早来早走,晚来晚走。
下面我们以华为手机为例,首先创建一个华为手机接口:IHuaWei:
package com.wbg.dpsp.openClose; /** * @author WBG * @date 2020/8/2 0:14 * @describe 华为手机 */ public interface IHuaWei { String getUUID();//主键 String getName();//名称 Double getPrice();//价格 }
华为手机分为2G\3G\4G\5G,我们来创建一个G5手机
package com.wbg.dpsp.openClose; /** * @author WBG * @date 2020/8/2 0:23 * @describe //华为5G */ public class HuaWei5G implements IHuaWei { private String UUID; private String name; private Double price; public HuaWei5G() { } public HuaWei5G(String UUID, String name, Double price) { this.UUID = UUID; this.name = name; this.price = price; } public String getUUID() { return this.UUID; } public String getName() { return this.name; } public Double getPrice() { return this.price; } }
华为5G需要做一个活动,价格优惠,如果修改HuaWei5G中的getPrice()方法,则会影响其他地方调用,我们如何在不修改原有代码前提前下,实现价格优惠这个功能呢?现在,我们再写一个处理优惠逻辑的类:HuaWei5GDiscount
package com.wbg.dpsp.openClose; /** * @author WBG * @date 2020/8/2 0:25 * @describe 华为5G促销活动 */ public class HuaWei5GDiscount extends HuaWei5G { public HuaWei5GDiscount() { super(); } public HuaWei5GDiscount(String UUID, String name, Double price) { super(UUID, name, price); } //打折活动 public Double getDiscountPrice() { //六折优惠 return super.getPrice() * 0.85; } }
测试结果:
package com.wbg.dpsp.openClose; /** * @author WBG * @date 2020/8/2 0:30 * @describe */ public class Test { public static void main(String[] args) { IHuaWei iHuaWei = new HuaWei5GDiscount("202008020031001","华为麦芒 9",2199.00); HuaWei5GDiscount huaWei5GDiscount = (HuaWei5GDiscount) iHuaWei; System.out.println("手机标识号:" + huaWei5GDiscount.getUUID() + "手机名称:《" + huaWei5GDiscount.getName() + "》" + "\n原价:" + huaWei5GDiscount.getPrice() + "\n售价:" + huaWei5GDiscount.getDiscountPrice()); } }
类结构图: