裝飾模式
定義
指在不改變現有對象結構的情況下,動態地給該對象增加一些職責(即增加其額外功能)的模式,它屬於對象結構型模式
結構
- 抽象構件(Component)角色:定義一個抽象接口以規範準備接收附加責任的對象
- 具體構件(Concrete Component)角色:實現抽象構件,通過裝飾角色爲其添加一些職責
- 抽象裝飾(Decorator)角色:繼承抽象構件幷包含具體構件的實例,可以通過其子類擴展具體構件的功能
- 具體裝飾(ConcreteDecorator)角色:實現抽象裝飾的相關方法,並給具體構件對象添加附加的責任
實現
package decorator;
public class DecoratorPattern
{
public static void main(String[] args)
{
Component p=new ConcreteComponent();
p.operation();
System.out.println("---------------------------------");
Component d=new ConcreteDecorator(p);
d.operation();
}
}
//抽象構件角色
interface Component
{
public void operation();
}
//具體構件角色
class ConcreteComponent implements Component
{
public ConcreteComponent()
{
System.out.println("創建具體構件角色");
}
public void operation()
{
System.out.println("調用具體構件角色的方法operation()");
}
}
//抽象裝飾角色
class Decorator implements Component
{
private Component component;
public Decorator(Component component)
{
this.component=component;
}
public void operation()
{
component.operation();
}
}
//具體裝飾角色
class ConcreteDecorator extends Decorator
{
public ConcreteDecorator(Component component)
{
super(component);
}
public void operation()
{
super.operation();
addedFunction();
}
public void addedFunction()
{
System.out.println("爲具體構件角色增加額外的功能addedFunction()");
}
}
優點和缺點
優點
- 採用裝飾模式擴展對象的功能比採用繼承方式更加靈活
- 可以設計出多個不同的具體裝飾類,創造出多個不同行爲的組合
缺點
- 裝飾模式增加了許多子類,如果過度使用會使程序變得很複雜
應用場景
- 當需要給一個現有類添加附加職責,而又不能採用生成子類的方法進行擴充時
- 當需要通過對現有的一組基本功能進行排列組合而產生非常多的功能時,採用繼承關係很難實現,而採用裝飾模式卻很好實現
- 當對象的功能要求可以動態地添加,也可以再動態地撤銷時
- 如果用繼承來擴展對象行爲的方案難以實現或者根本不可行**,** 你可以使用該模式
- 許多編程語言使用
final
最終關鍵字來限制對某個類的進一步擴展。 複用最終類已有行爲的唯一方法是使用裝飾模式: 用封裝器對其進行封裝。