开闭原则最早由伯特兰·迈耶提出:一个类的实现只应该因错误而修改,新的改变或者特性应该通过新建不同的类实现。新建的类可以通过继承的方式来重用原类的代码。衍生的子类可以或不可以拥有和原类相同的接口。
网上查了开闭原则相关的例子,大多都是《Android源码设计模式解析与实战》中的图片缓存的例子,并不是那么的通俗易懂,所以决定写一个更加通俗易懂的例子,以免对新人造成不必要的困扰!哈哈...
有这么一个需求:用来计算每个月的花销,例如:买衣服,买菜,外卖...
根据这个需求,首先我们可以定义一个花销的接口:
public interface Spend {
double getSpend();
}
买衣服的类:
public class ShoppingClothes implements Spend {
private double spend;
public ShoppingClothes(double spend) {
this.spend = spend;
}
@Override
public double getSpend() {
return spend;
}
}
买食品的类:
public class ShoppingFood implements Spend {
private double spend;
public ShoppingFood(double spend) {
this.spend = spend;
}
@Override
public double getSpend() {
return spend;
}
}
最后我们写一个计算总花销的类:
public class SpendManager {
public double getSumSpend(List<Spend> spendList) {
double spend = 0;
if (spendList == null) {
throw new RuntimeException("你还是人吗?居然一分钱都不花?");
}
for (int i = 0; i < spendList.size(); i++) {
spend += spendList.get(i).getSpend();
}
return spend;
}
}
终于写完啦!so easy! 我们来测试一下吧!
private void testSpend() {
List<Spend> spendList = new ArrayList<>();
ShoppingFood shoppingFood = new ShoppingFood(500);
spendList.add(shoppingFood);
Log.e("testSpend", "本月买外卖的花销为:" + shoppingFood.getSpend());
ShoppingClothes shoppingClothes = new ShoppingClothes(500);
spendList.add(shoppingClothes);
Log.e("testSpend", "本月买衣服的花销为:" + shoppingClothes.getSpend());
SpendManager _SpendManager = new SpendManager();
Log.e("testSpend", "本月的总花销为:" + _SpendManager.getSumSpend(spendList));
}
打印结果:
testSpend:: 本月买外卖的花销为:500.0
testSpend:: 本月买衣服的花销为:500.0
testSpend:: 本月的总花销为:1000.0
写了这么多,大家肯定着急了?说好的开闭原则,你就给我看这个?各位好汉别着急,小的这就给您上菜!
我们每个月不可能只是吃饭,买衣服,肯定还有其他的花销。
为了节约各位帅哥、美女的时间,这里我们就再创建一个其他花销的类:
public class Other implements Spend{
private double spend;
public Other(double spend) {
this.spend = spend;
}
@Override
public double getSpend() {
return spend;
}
}
我们修改一下测试方法:
private void testSpend() {
List<Spend> spendList = new ArrayList<>();
ShoppingFood shoppingFood = new ShoppingFood(500);
spendList.add(shoppingFood);
Log.e("testSpend", "本月买外卖的花销为:" + shoppingFood.getSpend());
ShoppingClothes shoppingClothes = new ShoppingClothes(500);
spendList.add(shoppingClothes);
Log.e("testSpend", "本月买衣服的花销为:" + shoppingClothes.getSpend());
Other other = new Other(1000);
spendList.add(other);
Log.e("testSpend", "本月买其他的花销为:" + shoppingClothes.getSpend());
SpendManager _SpendManager = new SpendManager();
Log.e("testSpend", "本月的总花销为:" + _SpendManager.getSumSpend(spendList));
}
打印结果为:
testSpend:: 本月买外卖的花销为:500.0
testSpend:: 本月买衣服的花销为:500.0
testSpend:: 本月其他的花销为:1000.0
testSpend:: 本月的总花销为:2000.0
有没有发现,我们修改了需求,只是增加了其他花销的类,其他的类都没有进行修改!这就是最简单开闭原则的体现!
欢迎评论~
感谢阅读~