装饰吗,就是本来就是一个简单的物品,为了满足我们的需求或者审美,不断地修饰,达到我们预期的要求等等。例如女生本来是素面的,天然美多好啊,但是为了美,不断地化妆,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)));
当然,流处理类当然要比我们的例子复杂的多,但其基本思想和我们去繁就简的例子异途同归,这些对象就好像是俄罗斯套娃一样层层包裹,层层装饰,每套一层就会多出一些功能出来,我们更可以自由搭配,实现不同的组合功能。