Welcome everyone

装饰者模式

设计模式 汪明鑫 732浏览 0评论

前言

装饰者模式顾名思义,做一个装饰

对原有逻辑进行一个包装,锦上添花

动态的把新功能附加到对象上,就像插件一样,即插即用

是继承的替代方案,但比只用的继承的承弹性更大,更灵活,且遵循设计模式原则

 

类图

 

  • Component:抽象组件(可以是抽象类或者接口),被装饰的原始对象
  • ConcreteComponent:具体实现类,被装饰的具体对象
  • Decorator:抽象装饰者,职责就是为了装饰我们的组件对象,内部一定要有一个指向组件对象的引用
  • ConcreteDecoratorA:装饰者具体实现类,只对抽象装饰者做出具体实现
  • ConcreteDecoratorB:同上

例子

我们在网上买了一些餐具,

餐具会经过泡沫,纸,盒子,袋子,贴上快递信息等等进行打包

最后在快递到我们手里

 

这一包装的过程就可以理解成装饰者模式

 

直接上代码:

首先我们有一个抽象的餐具类

/**
 * 餐具
 *
 * @author wmx
 * @date 2019-08-27
 */
public abstract class Tableware {

    //包装盒子
    abstract void packing();
}

 

我们买的是盘子,再来个盘子

/**
 * 餐盘
 *
 * @author wmx
 * @date 2019-08-27
 */
public class Dish extends Tableware {

    //买的盘子会用盒子装着
    @Override
    void packing() {
        System.out.println("用盒子包着");
    }
}

 

下面就是重头戏,包装类

/**
 * 包装类
 *
 * @author wmx
 * @date 2019-08-27
 */
public class PackingDecorator extends Tableware{

    Tableware tableware;

    public PackingDecorator(Tableware tableware){
        this.tableware = tableware;
    }

    @Override
    void packing() {
        tableware.packing();
    }
}

 

具体的包装类

/**
 * 包装泡沫
 *
 * @author wmx
 * @date 2019-08-27
 */
public class PackingSpumeDecorator extends PackingDecorator {

    public PackingSpumeDecorator(Tableware tableware) {
        super(tableware);
    }

    public void packingWithSpume() {
        System.out.println("包一圈泡沫");
    }

    @Override
    void packing() {
        packingWithSpume();
        tableware.packing();
    }
}

 

/**
 * 包装袋子
 *
 * @author wmx
 * @date 2019-08-27
 */
public class PackingBagDecorator extends PackingDecorator{

    public PackingBagDecorator(Tableware tableware) {
        super(tableware);
    }

    public void packingWithBag() {
        System.out.println("包一个袋子");
    }

    @Override
    void packing() {
        tableware.packing();
        packingWithBag();
    }

}

 

商店类 — 进行包装

/**
 * 商店包装商品
 *
 * @author wmx
 * @date 2019-08-27
 */
public class Store {
    public static void main(String[] args) {
        //顾客买了个盘子
        Tableware dish = new Dish();

        //包装泡沫
        dish = new PackingSpumeDecorator(dish);
        //包装袋子
        dish = new PackingBagDecorator(dish);

        //我们如果想接着包装,可以继续扩展,继承PackingDecorator

        dish.packing();

    }
}

 

输出:

包一圈泡沫
用盒子包着
包一个袋子

 

我们来捋一下类之间的关系:

 

 

盘子包装的过程:

转载请注明:汪明鑫的个人博客 » 装饰者模式

喜欢 (0)

说点什么

您将是第一位评论人!

提醒
avatar
wpDiscuz