设计模式[7]-装饰者模式-Decorator Pattern

1. 装饰者模式

装饰者模式(Decorator Pattern)是结构性设计模式,其目的是动态地增强类的功能,却没有采用继承该类的方式。装饰者模式通过增加装饰者类的做法,扩大了类的结构。

装饰者模式的角色一共有三种。

  • Component(抽象组件): 装饰者和被装饰对象实现的共同接口。

  • ConcreteComponent(具体组件):是被装饰的对象。

  • Decorator(装饰类): 负责装饰具体组件,即为被装饰的对象增强功能。本模式的核心。

如果具体的组件有多个,同时又要增加不同的功能,即需要多个装饰者的时候,可以把装饰类拆分成 抽象装饰者和具体装饰者。

2. 装饰者模式举例

下面我们举一个商店卖商品的例子,不使用继承的手段,给商店增强“叫卖”的功能。

序号 类名 角色 说明
1 Store Component 抽象组件,商店
2 FoodStore ConcreteComponent 具体组件类,食品商店
3 StoreDecorator Decorator 装饰类,给商店增强功能
4 DecoratorMain 客户端 演示调用
设计模式[7]-装饰者模式-Decorator Pattern_第1张图片
Paste_Image.png

1. Store类

// 抽象组件,商店
public interface Store {
    // 售卖
    void sell();
}

2. FoodStore类

// 具体组件类,食品商店
public class FoodStore  implements Store{

    @Override
    public void sell() {
        System.out.println("卖蛋糕咯");
    }
}

3. StoreDecorator

//具体装饰者,扩展食品商店的功能
public class StoreDecorator implements Store{

    private Store store;

    //装饰者类应该包含一个以被装饰者对象为参数的构造函数。
    // 注意对比代理模式中的代理类,构造器是不同的。
    public StoreDecorator(Store store) {
        this.store = store;
    }

    // 给Store来点功能扩展,加上叫卖
    public void sell() {
        System.out.println("瞧一瞧,你不吃亏;看一看,你不上当。");
        store.sell();
        System.out.println("欢迎下次再来");
    }
}

4. DecoratorMain

// 客户端,演示调用
public class DecoratorMain {

    public static void main(String[] args) {
        Store store = new FoodStore();
        StoreDecorator decorator = new StoreDecorator(store);
        decorator.sell();
    }
}

3. 装饰器模式总结

优点:
可以动态扩展一个对象的功能,比继承的方式更为灵活;可以用多个装饰者装饰同一个对象。

缺点:
装饰类多了,对象都很相似,容易看花眼。

(完)

你可能感兴趣的:(设计模式[7]-装饰者模式-Decorator Pattern)