一、开闭原则的定义
开闭原则明确的告诉我们:软件实现应该对扩展开放,对修改关闭,其含义是说一个软件实体应该通过扩展来实现变化,而不是通过修改已有的代码来实现变化的。那什么是软件实体呢?
软件实体可以指一个软件模块、一个由多个类组成的局部结构或一个独立的类。
抽象化是开闭原则的关键。
二、开闭原则举例
以销售水果为例,可以 销售苹果、梨等水果,水果有的特性,名城、价格等
水果接口:
public interface Fruit {
public String name();
public double price();
}
苹果类:
public class Apple implements Fruit {
private String name;
private double price;
public Apple(String name, double price) {
this.name = name;
this.price = price;
}
@Override
public String name() {
return this.name;
}
@Override
public double price() {
return this.price;
}
}
public class Pear implements Fruit {
private String name;
private double price;
public Pear(String name, double price) {
this.name = name;
this.price = price;
}
@Override
public String name() {
return this.name;
}
@Override
public double price() {
return this.price;
}
}
实现:
Fruit fruit = new Apple("红富士", 2.5);
String name = fruit.name();
double price = fruit.price();
Toast.makeText(this, name + " " + price, Toast.LENGTH_SHORT).show();
但是在实际的过程中,我们需要做一些打折的操作,那在当前的设计下应该如何做呢?
1、修改接口
修改接口会使接口和实现类都有变动,接口应该是稳定且可靠,不应该经常发生改变,否则接口作为契约的作用就失去了。因此,此方案否定。
2、修改实现类
可以直接在价格方法中处理,但是此方法也有问题,那就是要得到打折前的价格呢?此方案不是最优选择
3、通过扩展实现变化
public class OffAppleFruit extends Apple {
public OffAppleFruit(String name, double price) {
super(name, price);
}
// 复写价格方法
@Override
public double price() {
if (price > 2) {
return price * 0.8;
}
return super.price();
}
}