今天的博客主题
设计原则和模式 --》设计原则之依赖倒置原则
开闭原则 OCP (Open-Closed Principle)
开闭原则就是说一个类、方法、模块对扩展和修改两个行为上的一个原则。
具体就是 对扩展开放、对修改关闭 这样的。
特别强调的是用抽象构建框架、用实现扩展细节。
这样可以提高软件系统的可复用性、可维护性。
开闭原则 是面向对象设计原则中最基础的设计原则。
指导我们如何建立出一个稳定灵活的系统。
找一个现实生活中的例子来描述下 开闭原则
eg:盖房子,地基是关闭的,可不能修改,但是地基上面的楼房可以扩展啊,加高加宽装修。
就好比我们系统做完之后,后续的版本更新迭代,尽可能的不去修改源码,但可以增加新功能。
实现开闭原则的核心是面向抽象编程!
代码示例:
以电商手机模块为例。创建一个手机接口:
public interface IMobilePhone {
Integer getId(); // 手机ID
String getModel(); // 手机型号
Double getPrice(); // 手机价格
}
手机是有很多种的、华为、小米、苹果等等,那创建一个华为手机的类
public class HuaWeiPhone implements IMobilePhone{
private Integer id;
private String model;
private Double price;
public HuaWeiPhone(Integer id, String model, Double price) {
this.id = id;
this.model = model;
this.price = price;
}
public Integer getId() {
return this.id;
}
public String getModel() {
return this.model;
}
public Double getPrice() {
return this.price;
}
}
现在要给华为手机做活动,直接修改 HuaWeiPhone 里的 getPrice() 会有风险,因为你清楚别的地方有没有引用到。
那就不能改这个地方了,怎么办呢?加新功能,写一个华为手机活动优惠的一个类
public class HuaWeiDiscountPhone extends HuaWeiPhone {
public HuaWeiDiscountPhone(Integer id, String model, Double price) {
super(id, model, price);
}
// 手机原价
public Double getOriginPrice(){
return super.getPrice();
}
// 手机优惠价 88折
public Double getPrice(){
return super.getPrice() * 0.88;
}
}
到这里基本上就算是可以了,看下整体的类图(忽略我 idea 背景。。。)
是不是很简单,实现并不难。难的是怎么把这种思想给运用?什么时候用?用在哪里?