裝飾嗎,就是本來就是一個簡單的物品,爲了滿足我們的需求或者審美,不斷地修飾,達到我們預期的要求等等。例如女生本來是素面的,天然美多好啊,但是爲了美,不斷地化妝,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)));
當然,流處理類當然要比我們的例子複雜的多,但其基本思想和我們去繁就簡的例子異途同歸,這些對象就好像是俄羅斯套娃一樣層層包裹,層層裝飾,每套一層就會多出一些功能出來,我們更可以自由搭配,實現不同的組合功能。