看看我們的示例代碼吧:
package 裝飾模式;
//被裝飾的類的抽象父類
public abstract class Component {
public abstract void operation();
}
package 裝飾模式;
//需要被裝飾的具體類
public class Hourse extends Component {
@Override
public void operation() {
System.out.println("這是一個普通的屋子庵佣。");
}
}
package 裝飾模式;
//抽象裝飾類
public abstract class Decorator extends Component {
//Component對象的引用
private Component component;
public Decorator(Component component) {
this.component=component;
}
@Override
public void operation() {
this.component.operation();
}
}
package 裝飾模式;
//具體裝飾類
public class DoorDecorator extends Decorator {
public DoorDecorator(Component component){
super(component);
}
@Override
public void operation() {
super.operation();
System.out.println("裝飾了屋子的門,屋子變漂亮了。");
}
}
package 裝飾模式;
//具體裝飾類
public class FurnitureDecorator extends Decorator{
public FurnitureDecorator(Component component) {
super(component);
}
@Override
public void operation() {
super.operation();
System.out.println("裝飾了屋子的家具劝篷,屋子變更漂亮了哨鸭。");
}
}
package 裝飾模式;
//客戶端
public class Client {
public static void main(String[]args){
Component hourse=new Hourse();
hourse.operation();
//給屋子的門進行裝飾
hourse=new DoorDecorator(hourse);
hourse.operation();
//給屋子的家具進行裝飾
hourse=new FurnitureDecorator(hourse);
hourse.operation();
}
}
輸出:
這是一個普通的屋子。
這是一個普通的屋子娇妓。
裝飾了屋子的門像鸡,屋子變漂亮了。
這是一個普通的屋子哈恰。
裝飾了屋子的門只估,屋子變漂亮了。
裝飾了屋子的家具着绷,屋子變更漂亮了蛔钙。
關于裝飾模式的總結:
1、通過采用組合荠医、而非繼承的手法吁脱,Decorator模式實現(xiàn)了在運行時動態(tài)的擴展對象功能的能力,而且可以根據(jù)需要擴展多個功能彬向。避免了單獨使用繼承帶來的“靈活性差”和“多子類衍生問題”兼贡。
2、Component類在Decorator模式中充當抽象接口的角色娃胆,不應該去實現(xiàn)具體的行為遍希。而且Decorator類對于
Component類應該透明——換言之Component類無需知道Decorator類,Decorator類是從外部來擴展Component類的功能里烦。
3凿蒜、Decorator類在接口上表現(xiàn)為is-a Component的繼承關系,即Decorator類繼承了Component類所具有的接口招驴。但在實現(xiàn)上又表現(xiàn)為has-a Component的組合關系篙程,即Decorator類又使用了另外一個Component類。我們可以使用一個或多個Decorator對象來“裝飾”一個Component對象别厘,且裝飾后的對象仍然是一個Component
對象虱饿。我的理解是:當我們實例化一個Component對象后,要給這個對象擴展功能触趴,這時我們把這個Component對象當作參數(shù)傳給Decorator的子類的構造函數(shù)——也就是擴展方法的功能類氮发。對于引用類型傳參時,實際上只是傳遞對象的地址冗懦,也就是在原來的對象上擴展功能爽冕。
4、Decorator模式并非解決“多子類衍生的多繼承”問題披蕉,Decorator模式應用的要點在于解決“主體類在多個方向上的擴展功能”——是為“裝飾”的含義颈畸。Decorator是在運行時對功能進行組合乌奇。