开闭原则最早由伯特兰·迈耶提出:一个类的实现只应该因错误而修改,新的改变或者特性应该通过新建不同的类实现。新建的类可以通过继承的方式来重用原类的代码。衍生的子类可以或不可以拥有和原类相同的接口。
网上查了开闭原则相关的例子,大多都是《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
有没有发现,我们修改了需求,只是增加了其他花销的类,其他的类都没有进行修改!这就是最简单开闭原则的体现!
欢迎评论~
感谢阅读~