码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式之装饰器模式

时间:2019-04-20 21:12:38      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:cte   void   实现   .com   oid   使用   rri   就是   alt   

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();
    }
}

输出为

技术图片

 

设计模式之装饰器模式

标签:cte   void   实现   .com   oid   使用   rri   就是   alt   

原文地址:https://www.cnblogs.com/liwangcai/p/10742669.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!