Android开闭原则(一)

开闭原则最早由伯特兰·迈耶提出:一个类的实现只应该因错误而修改,新的改变或者特性应该通过新建不同的类实现。新建的类可以通过继承的方式来重用原类的代码。衍生的子类可以或不可以拥有和原类相同的接口。

网上查了开闭原则相关的例子,大多都是《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

有没有发现,我们修改了需求,只是增加了其他花销的类,其他的类都没有进行修改!这就是最简单开闭原则的体现!

欢迎评论~

感谢阅读~

发布了8 篇原创文章 · 获赞 5 · 访问量 3640

猜你喜欢

转载自blog.csdn.net/u011065084/article/details/90443280