设计模式之装饰者模式

装饰吗,就是本来就是一个简单的物品,为了满足我们的需求或者审美,不断地修饰,达到我们预期的要求等等。例如女生本来是素面的,天然美多好啊,但是为了美,不断地化妆,p图,所以现实和我们见到的总是有差距,所以中国的四大邪术中就有很多关于中国美女的化妆术等传说,当然了,只是开个玩笑。。。。

例如我们现在想做一道菜,招呼客人,那我们先抽象出来做饭这个事情

package com.yitian.decorate;

/**
 * @Author: yitianRen
 * @Description: 做饭
 * @Date: 11:14 2019/9/19
 * @Param:
 * @Return:
*/
public interface Cook {

    public void cook();

}

例如我想吃辣子鸡了【口水直流(。◕ˇ∀ˇ◕)】,那我们先得有个鸡?。

package com.yitian.decorate;

/**
 * @Description TODO
 * @Author yitianRen
 * @Date 2019/9/19 11:14
 * @Version 1.0
 **/
public class PepperyChicken implements Cook {
    @Override
    public void cook() {
        System.out.print("小公鸡");
    }
}

光有鸡就可以了?生吃?那怎么行呐,来让我们用葱姜辣椒?爆炒一下?,同样实现了Cook接口。

package com.yitian.decorate;

/**
 * @Description 装饰着爆炒公鸡
 * @Author yitianRen
 * @Date 2019/9/19 11:15
 * @Version 1.0
 **/
public class Decorate implements Cook {

    Cook cook;

    public Decorate(Cook cook) {
        this.cook = cook;
    }

    @Override
    public void cook() {
        System.out.print("葱姜辣椒爆炒(");//葱姜爆炒
        cook.cook();//小公鸡
        System.out.print(")");//收工
    }
}

初具小成得辣子鸡已经有了,让我看一下:

package com.yitian.decorate;

/**
 * @Description TODO
 * @Author yitianRen
 * @Date 2019/9/19 11:19
 * @Version 1.0
 **/
public class DecorateMain {

    public static void main(String[] args) {
        new Decorate(new PepperyChicken()).cook();
        /*
            葱姜辣椒爆炒(小公鸡)
            Process finished with exit code 0

            */
    }

}

哎呀怎么一点味道都没有呢???盐呢  调料呢?好吧,我们还要继续调整装饰,但是都有一个共同点就是都可以对鸡进行操作,那我们把操作抽取,按照工序一道一道来-》

把装饰抽出来,做一个抽象类,不做任何事情,爆炒啊或者调料都由子类操作:

package com.yitian.decorate;

/**
 * @Description 装饰着爆炒公鸡
 * @Author yitianRen
 * @Date 2019/9/19 11:15
 * @Version 1.0
 **/
public abstract class Decorate implements Cook {

    Cook cook;

    public Decorate(Cook cook) {
        this.cook = cook;
    }

    @Override
    public void cook() {
        cook.cook();//不做任何事情
    }
}

建一个葱姜蒜:

package com.yitian.decorate;

/**
 * @Description TODO
 * @Author yitianRen
 * @Date 2019/9/19 13:55
 * @Version 1.0
 **/
public class GreenOnion extends Decorate {

    public GreenOnion(Cook cook) {
        super(cook);
    }

    public void cook() {
        System.out.print("葱姜辣椒爆炒(");//葱姜爆炒
        cook.cook();//小公鸡
        System.out.print(")");
    }
}

建一个调料:

package com.yitian.decorate;

/**
 * @Description TODO
 * @Author yitianRen
 * @Date 2019/9/19 14:06
 * @Version 1.0
 **/
public class Flavour extends Decorate {

    public Flavour(Cook cook) {
        super(cook);
    }

    public void cook() {
        System.out.print("加入调料入味(");//调料
        cook.cook();//小公鸡
        System.out.print(")");
    }
}

来吧让我们做一道热气腾腾得小公鸡吧:

package com.yitian.decorate;

/**
 * @Description TODO
 * @Author yitianRen
 * @Date 2019/9/19 11:19
 * @Version 1.0
 **/
public class DecorateMain {

    public static void main(String[] args) {
        Cook cook=new Flavour(new GreenOnion(new PepperyChicken()));
        cook.cook();
        /* 输出
            加入调料入味(葱姜辣椒爆炒(小公鸡))
            Process finished with exit code 0
        */
    }

}

如果还不满意我们可以再加入更多工序。

我们观察这种装饰器模式结构,是不是似曾相识呢?没错,其实装饰器模式在JDK里就有很多应用,比如Java IO包里的众多流处理类。

new BufferedReader(new InputStreamReader(new FileInputStream(filePath)));

当然,流处理类当然要比我们的例子复杂的多,但其基本思想和我们去繁就简的例子异途同归,这些对象就好像是俄罗斯套娃一样层层包裹,层层装饰,每套一层就会多出一些功能出来,我们更可以自由搭配,实现不同的组合功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值