文章目录
一、开闭原则简介
二、开闭原则代码示例
1、商品接口
2、普通商品类
3、折扣商品类
4、测试类
一、开闭原则简介
开闭原则 :
定义 : 一个 软件实体 , 类 / 模块 / 函数 , 对 扩展 开放 , 对 修改 关闭 ;
抽象与实现 : 用 抽象 构建框架 , 用 实现 扩展细节 ;
优点 : 提高 软件系统 的 可复用性 及 可维护性 ;
开闭原则 是 面向对象 设计 中 , 最基础的 设计原则 , 它指导我们建立稳定灵活的系统 ;
开发新功能时 , 尽量 不修改原有的代码 , 尽量 使用扩展增加新功能 ;
实现 开闭原则 的核心思想 是面向抽象编程 , 不是面向实现编程 ;
定义的 对象类型 是 抽象类类型 或 接口类型 , 调用的方法 是 抽象类 或 接口 中的方法 ;
抽象是 稳定的 , 让类依赖于抽象 , 对于修改来说就是封闭的 ;
通过 面向对象 的 继承 , 以及 多态机制 , 可以实现 对 抽象 的 继承 , 通过 重写改变其固有方法 , 或 实现新的扩展方法 ;
二、开闭原则代码示例
1、商品接口
package openclose; /** * 商品接口 */ public interface IGood { Integer getId(); String getName(); Double getPrice(); }
2、普通商品类
package openclose; /** * 普通的商品类 */ public class NormalGood implements IGood { private Integer id; private String name; private Double price; public NormalGood(Integer id, String name, Double price) { this.id = id; this.name = name; this.price = price; } @Override public Integer getId() { return this.id; } @Override public String getName() { return this.name; } @Override public Double getPrice() { return this.price; } @Override public String toString() { return "NormalGood{" + "id=" + id + ", name='" + name + '\'' + ", price=" + price + '}'; } }
3、折扣商品类
如果要添加一个商品打折功能 , 不能直接修改 IGood 接口 , 或 NormalGood 类 , 只要修改了 , 就给之前的功能带来了隐患 ;
根据开闭原则 , 对修改关闭 , 对扩展开放 ;
这里直接定义 NormalGood 类的子类 , 在继承 NormalGood 类的基础上 , 开发扩展的新功能 ;
package openclose; /** * 打折商品类 * 加入一个 商品 打折的功能 * 不能直接修改 IGood 接口 , 或 NormalGood 类 * 只要修改了 , 就给之前的功能带来了隐患 * 这里直接定义 NormalGood 类的子类 * 在继承 NormalGood 类的基础上 , 开发扩展的新功能 */ public class DiscountGood extends NormalGood { public DiscountGood(Integer id, String name, Double price) { super(id, name, price); } @Override public Double getPrice() { return super.getPrice() * 0.5; } }
4、测试类
package openclose; public class Main { public static void main(String[] args) { IGood normalGood = new NormalGood(8, "普通商品", 88.0); System.out.println("商品信息 : " + normalGood); IGood discountGood = new DiscountGood(9, "Java 折扣课程", 88.0); System.out.println("折扣商品信息 : " + discountGood + " , 折扣价格 : " + discountGood.getPrice()); } }
执行结果 :
商品信息 : NormalGood{id=8, name='普通商品', price=88.0} 折扣商品信息 : NormalGood{id=9, name='Java 折扣课程', price=88.0} , 折扣价格 : 44.0