安卓关于设计模式_装饰者模式

装饰者模式:

动态的将责任附加到对象上,若要扩充功能,装饰者提供了比继承更具有弹性的代码方案。因为基类加入新的功能时不一定适合所有的子类,这也导致了继承不能解决所有的问题。

设计原则(开放-关闭):

 类应该对扩展开放(能够扩展),对修改关闭(不能修改现有的代码)。

特点:

 1. 装饰者和被装饰着具有相同的超类,这样才能保证装饰者与被装饰者是相同的类型;
 2. 可以用一个或者多个装饰者包装一个对象;
 3. 既然装饰者和被装饰着具有相同的超类,所以在任何需要原始对象(被包装的)的场合,可以用装饰过的对象代替它;
 4. 装饰者可以在所委托被装饰者的行为之前或之后,加上自己的行为,以达到待定的目的("关键点")。


用例:

场景描述:

假设我们做的是一个卖衣服有的功能,我们目前的衣服有Jockets、Clothes等,正常情况下每件衣服都有特定的价格cost()。但是最近双11来了,所以公司要求做促销活动,比如买一件衣服再加10元就能送袜子,加50元就能送鞋子等等。

思路:

1. 在Jockets、Clothes等衣服类里面都加上各种活动商品,并重新计算价格。如果商品种数少还勉强可以,但是如果有很多商品了,那就傻眼了,所以这种不可行;

2. 在衣服的超类Goods里面去加上各种活动商品的价格,这样做看似可行,但是如果活动品的价格改变了怎么办? 客户要双份的活动品又该怎么办? 这样只能在超类的cost()方法里面做处理了,这就改变了我们现有的代码,违反了我们的开放关闭原则,而且如果商品多了一不小心还会出错,所以放弃了这种实现;

3. 利用装饰者模式,这也是我采用的方式:

实现:

1. 首先创建一个商品的超类Goods:

public abstract class Goods {
    protected String DES = "this is a good";
    public String des(){
        return DES;
    }
    public abstract double cost();
2. 创建衣服商品类(被装饰者)来继承这个超类:

public class Jackets extends Goods {
    public Jackets(){
        DES = "this is jackets";
    }
    @Override
    public double cost() {
        return 200;
    }
3. 因为装饰者和被装饰者必须是相同的类型,所以先创建一个Gadget来继承Goods:

public abstract class Gadget extends Goods{
    public abstract String des();//对商品的描述作用
}
4. 创建袜子、鞋子等(装饰者)类来继承Gadget:

public class Shoes extends Gadget {
    private Goods goods;//拿到装饰者的引用对象
    public Shoes(Goods goods){
        this.goods = goods;
    }
    @Override
    public String des() {
        return goods.des() + "And a shoes";
    }
    @Override
    public double cost() {
        return goods.cost() + 20;
    }
5. 这样装饰者也被装饰者就大致创建好了,接下来就是使用了,比如要想知道Jackets加上Shoes的价格:

Goods goods = new Jackets();
goods = new Shoes(goods);
tv_test.setText("描述:" + goods.des() + "价格: " + goods.cost());


下面附带UML:



发布了34 篇原创文章 · 获赞 0 · 访问量 9333
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章