裝飾器模式
一、什麼是裝飾器模式
裝飾器模式(Decorator Pattern)允許向一個現有的對象添加新的功能,同時又不改變其結構。這種類型的設計模式屬於結構型模式,它是作爲現有的類的一個包裝。
這種模式創建了一個裝飾類,用來包裝原有的類,並在保持類方法簽名完整性的前提下,提供了額外的功能。
在不想增加更多子類的情況下擴展類,動態地給一個對象添加一些額外的職責。就增加功能來說,裝飾器模式相比生成子類更爲靈活。
二、裝飾器模式的具體實現
1、結構圖
2、分析
裝飾器模式由組件和裝飾者組成。
- 抽象組件(Component):需要裝飾的抽象對象。
- 具體組件(ConcreteComponent):是我們需要裝飾的對象。
- 抽象裝飾類(Decorator):內含指向抽象組件的引用及裝飾者共有的方法。
- 具體裝飾類(ConcreteDecorator):被裝飾的對象。
3、java 代碼實現:
抽象組件:
package com.designpattern.decoratorPattern;
/**
* Component 組件 抽象角色
* @author zhongtao on 2018/10/23
*/
public interface House {
/**
* 裝飾風格
*/
void style();
}
具體組件:
/**
* 具體組件
* @author zhongtao on 2018/10/23
*/
public class ChineseStyle implements House {
@Override
public void style() {
System.out.println("中式風格裝修");
}
}
/**
* 具體組件
* @author zhongtao on 2018/10/23
*/
public class EuropeanStyle implements House {
@Override
public void style() {
System.out.println("歐式風格裝修");
}
}
抽象裝飾類:
package com.designpattern.decoratorPattern;
/**
* 抽象裝飾類
*
* @author zhongtao on 2018/10/23
*/
public class HouseDecorator implements House {
public House house;
public HouseDecorator(House house) {
this.house = house;
}
@Override
public void style() {
house.style();
}
}
具體裝飾類:
package com.designpattern.decoratorPattern;
/**
* 具體裝飾類
*
* @author zhongtao on 2018/10/23
*/
public class RedDecorator extends HouseDecorator {
public RedDecorator(House house) {
super(house);
}
public void style() {
this.house.style();
System.out.println("紅色裝飾牆");
}
}
測試裝飾器模式:
package com.designpattern.decoratorPattern;
import org.junit.Test;
/**
* 測試裝飾器模型
*
* @author zhongtao on 2018/10/22
*/
public class DecoratorPatternTest {
/**
* 測試裝飾器模型
*/
@Test
public void testDecoratorPattern(){
ChineseStyle chineseStyle = new ChineseStyle();
House redChineseStyle = new RedDecorator(new ChineseStyle());
House redEuropeanStyle = new RedDecorator(new EuropeanStyle());
System.out.println("中式裝修");
chineseStyle.style();
System.out.println("\n中式加紅色牆");
redChineseStyle.style();
System.out.println("\n歐式加紅色牆");
redEuropeanStyle.style();
}
}
測試結果:
---中式裝修---
中式風格裝修
---中式加紅色牆---
中式風格裝修
紅色裝飾牆
---歐式加紅色牆---
歐式風格裝修
紅色裝飾牆
三、裝飾器的優缺點
1、優點
- 裝飾類和被裝飾類可以獨立發展,不會相互耦合。
- 裝飾器模式是繼承的一個替代模式。
- 裝飾器模式可以動態擴展一個實現類的功能。
2、缺點
- 多層裝飾比較複雜。