裝飾者模式
Decorator模式(別名Wrapper):動態將職責附加到對象上,若要擴展功能,裝飾者提供了比繼承更具彈性的代替方案。
UML圖
裝飾者包含四個基本類
抽象構件角色(Component):給出一個抽象接口,以規範準備接收附加責任的對象。
具體構件角色(Concrete Component):定義將要接收附加責任的類。
裝飾角色(Decorator):持有一個構件(Component)對象的引用,並定義一個與抽象構件接口一致的接口。
具體裝飾角色(Concrete Decorator):負責給構件對象“貼上”附加的責任。
舉個栗子
裝飾者模式跟玩芭比娃娃有點像
Component就像是芭比娃娃玩具(外面的包裝)
ConcreteComponent就好比剛剛從包裝裏面拿出來的芭比娃娃
Decorator就好比放芭比衣服和裝飾的盒子
下面具體的實現就是芭比的衣服、頭髮之類的裝飾。
然後就拿起芭比娃娃給她穿衣服、帶頭髮就好了
//整套芭比娃娃玩具
interface Component{
void toDo();
}
//芭比娃娃實體
class ConcreteComponent implements Component{
@Override
public void toDo() {
System.out.println("我是芭比娃娃");
}
}
//裝飾箱
class Decorator implements Component{
private Component component;
public Decorator(Component component){
this.component=component;
}
@Override
public void toDo() {
component.toDo();
}
}
//芭比的衣服
class Clothes extends Decorator{
public Clothes (Component component) {
super(component);
}
@Override
public void toDo() {
super.toDo();
System.out.println("穿上衣服");
}
}
//芭比的鞋子
class Shoe extends Decorator{
public Shoe (Component component) {
super(component);
}
@Override
public void toDo() {
super.toDo();
System.out.println("穿鞋子");
}
}
public class Client {
public static void main(String[] args){
Component cct=new ConcreteComponent();
cct=new Shoe (new Clothes (cct));
cct.toDo();
}
}
/*輸出
我是芭比娃娃
穿上衣服
穿鞋子
*/
顯而易見的是被裝飾類在編譯的只有主要的一些功能,而在運行的時候卻可以動態的給它加上其他的功能職責,而且繼續增加其他的職責也不需要改動原類,只需要繼續增加裝飾類即可,完美實現了開閉原則。還有一個優點是這種動態增加比繼承要靈活許多。
有意思的是當我看到這句代碼的時候
cct=new Shoe (new Clothes (cct));
我突然發現跟我們的IO流太像了,經過查找資料發現,io正是運用了裝飾者模式的一個典型例子,上圖