设计模式之装饰器模式

Posted liwangcai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之装饰器模式相关的知识,希望对你有一定的参考价值。

1.之前的博客中说过Mybatis中的二级缓存(CachingExecutor为装饰器模式的实现),现在就来说一下装饰器模式。

2.装饰器模式的作用: 动态的为一个对象添加新的功能,以往我们要增加功能要不修改源代码,要不就是生成自类,非常不灵活。就添加一个功能而言使用装饰器模式更加方便。

(1).比如说我现在有一个接口为Noodles可以做一碗面,自类中实现为刀削面,方便面。但是我们现在想加个配料(比如鸡蛋,火腿啥的)

技术图片

(2).Noodles接口

public interface Noodles {
    //可以制作一碗面
    public void createABlowOfNoodles();
}

(3)DaoXiaoNoodles

public class DaoXiaodNoodles implements Noodles {
    @Override
    public void createABlowOfNoodles() {
        System.out.println("制作一碗刀削面");
    }
}

(4)InstanceNoodles

public class InstanceNoodles implements Noodles {
    @Override
    public void createABlowOfNoodles() {
        System.out.println("制作一碗方便面");
    }
}

(5)BoodlesDecorator (抽象装饰器类,持有被装饰类的引用)

public abstract class NoodlesDecorator implements Noodles {
    protected Noodles noodles;   //持有一个Noodles的引用,为被装饰的对象

    public NoodlesDecorator(Noodles noodles) {  //传入被装饰的对象
        this.noodles = noodles;
    }

    @Override
    public void createABlowOfNoodles() {
        noodles.createABlowOfNoodles();
    }
}

(6)EggNoodles

//在面里加个鸡蛋
public class EggNoodles extends NoodlesDecorator{
    public EggNoodles(Noodles noodles) {
        super(noodles);
    }

    @Override
    public void createABlowOfNoodles() {
        noodles.createABlowOfNoodles();   //在装饰器类的实现类中去调用被代理类的方法
        addEgg();              //实现附加功能
    }

    private void addEgg(){         //在面里加一个鸡蛋。。。
        System.out.println("加一个鸡蛋");
    }
}

(7)HamNoodles

//在面里加一根火腿
public class HamNoodles extends NoodlesDecorator{
    public HamNoodles(Noodles noodles) {
        super(noodles);
    }

    @Override
    public void createABlowOfNoodles() {
        noodles.createABlowOfNoodles();
        addHam();
    }

    private void addHam() {      //在面里加个火腿
        System.out.println("加一根火腿");
    }
}

最后我们来看一下怎么使用

public class Test {
    public static void main(String[] args) {
        Noodles noodles = new EggNoodles(new HamNoodles(new InstanceNoodles()));//制作一碗加蛋,加肠的面
        noodles.createABlowOfNoodles();
    }
}

输出为

技术图片

 

以上是关于设计模式之装饰器模式的主要内容,如果未能解决你的问题,请参考以下文章

学习设计模式之装饰器模式

设计模式之装饰器模式

设计模式之装饰器模式

设计模式之装饰器模式

设计模式之装饰器模式

《设计模式》之装饰器模式