1 前言
O(∩_∩)O 首先呢,在這先祝各位濕兄濕姐圣誕節(jié)快樂,多多吃蘋果。
今天呢,我們來講講裝飾模式,裝飾模式就是包裝模式,簡單的說就是通過一種對客戶端透明的方式來拓展對象的功能,是繼承關(guān)系的一種替代方案。

就拿我們經(jīng)常吃的的蘋果來說吧,在平安夜之前,蘋果就是蘋果,但到了平安夜之際,蘋果就搖身一變成為平安果,這就是裝飾的力量,不論是從外觀還是內(nèi)在的含義,經(jīng)過裝飾后都將大大的改變。
在jdk中,裝飾模式使用的也是很頻繁的,比如常見的I/O流,我們可以把一個簡單的字節(jié)流轉(zhuǎn)換成一個字節(jié)流,再將字節(jié)流轉(zhuǎn)換成緩沖流等。
接著呢,我們先來看看傳統(tǒng)的繼承關(guān)系來實現(xiàn)轉(zhuǎn)換過程。
2 繼承轉(zhuǎn)換
首先,我們先實現(xiàn)一個普通蘋果
實現(xiàn)
<!--蘋果接口--!>
public interface Apple {
public void show();
public void func();
}
<!--普通蘋果實現(xiàn)--!>
public class CommonApple implements Apple{
@Override
public void show() {
this.func();
}
@Override
public void func() {
System.out.println("普通蘋果");
}
}

這樣我們的普通蘋果就出來了,先吃著。平安夜來了,我們要一個刻字的蘋果該怎么辦呢?
刻字蘋果實現(xiàn)
public class LetterApple implements Apple{
@Override
public void show() {
this.func();
}
@Override
public void func() {
System.out.println("刻字蘋果");
}
}

可以看到實現(xiàn)一個刻字蘋果只需要在創(chuàng)建一個類去實現(xiàn)蘋果就可以了,但我們不可能拿著一個沒有包裝盒的蘋果去送對象吧,所以呢,我們還需要實現(xiàn)一個包裝好的刻字蘋果。
包裝好的刻字蘋果
public class PackingAndLetterApple implements Apple{
@Override
public void show() {
this.func();
}
@Override
public void func() {
System.out.println("包裝蘋果");
System.out.println("刻字蘋果");
}
}

這樣我們雖然是得到了包裝好的刻字蘋果,但是我們可以發(fā)現(xiàn)這種實現(xiàn)方式過于粗暴,代碼過于冗余,每當我們需要一個復雜的功能時都需要重新去實現(xiàn)一個類。
** 而裝飾模式就全完可以解決這個問題,當我們需要一個包裝好的刻字蘋果時,我們只需要先將普通蘋果裝飾成刻字蘋果再裝飾成包裝蘋果**就可以了。
3 裝飾模式
裝飾模式的幾個角色
- 抽象組件角色:一個抽象接口,是裝飾者和被裝飾者的父接口。
- 抽象裝飾角色:包含一個組件的應用,并定義與抽象組件一樣的方法。
- 具體組件角色:為抽象組件的實現(xiàn)類。
- 具體裝飾角色:為抽象裝飾角色的實現(xiàn)類,負責具體的裝飾。

具體的實現(xiàn):
實現(xiàn)一個包裝的刻字蘋果
抽象組件角色:Apple.class
public interface Apple {
public void show();
public void func();
}
抽象裝飾角色:AppleDecorator.class
public abstract class AppleDecorator implements Apple{
private Apple apple;
public AppleDecorator(Apple apple) {
this.apple = apple;
}
public Apple getApple() {
return apple;
}
具體組件角色:LetterAppleDecorator.class / PackingAppleDecorator.class
public class LetterAppleDecorator extends AppleDecorator{
private Apple apple;
public LetterAppleDecorator(Apple apple) {
super(apple);
}
@Override
public void show() {
this.getApple().show();
this.func();
}
@Override
public void func() {
System.out.println("刻字蘋果");
}
}
public class PackingAppleDecorator extends AppleDecorator{
private Apple apple;
public PackingAppleDecorator(Apple apple) {
super(apple);
// TODO Auto-generated constructor stub
}
@Override
public void show() {
this.getApple().func();
this.func();
}
@Override
public void func() {
System.out.println("高檔包裝蘋果");
}
}
具體裝飾角色:CommonApple.class
public class CommonApple implements Apple{
@Override
public void show() {
this.func();
}
@Override
public void func() {
System.out.println("蘋果");
}
}
測試:MainClass.clas
public class MainClass {
public static void main(String[] args) {
Apple apple = new CommonApple();
apple.func();
System.out.println("`````````````````````````````````````````");
apple = new LetterAppleDecorator(apple);
apple.func();
System.out.println("`````````````````````````````````````````");
apple = new PackingAppleDecorator(apple);
apple.func();
System.out.println("`````````````````````````````````````````");
}
}

4 優(yōu)缺點
優(yōu)點
- Decorator模式和繼承都是為了拓展對象的功能,但是很明顯Decorator模式更加靈活。
- 當對一個對象有多種裝飾時,那么開發(fā)者也同時可以實現(xiàn)不同的行為組合。
缺點:
- 裝飾模式會導致類的增多,會使程序變復雜,雖然變的比較靈活,但是響應的操作也會變復雜。

最后呢,還是祝大家圣誕節(jié)快樂,都能收到自己喜歡的禮物<a>(? ω ?)</a>。
喜歡的話戳一下喜歡唄。
有什么建議的話希望大家能在下方回復(●'?'●),
上一篇:建造者模式
下一篇:策略模式(待更)