裝飾模式( Decorator ):動態(tài)地給一個對象添加一些額外的職責,就增加功能來說误窖,裝飾模式比生成子類更為靈活。
模式中的角色:
public abstract class Component {
public abstract void Operation( );
}
- 抽象構建(Component):定義一個抽象接口秩贰,用以給這些對象動態(tài)地添加職責霹俺。
public ConcreteComponent extends Component {
public void Operation( ) {
System.out.println("具體對象的操作");
}
}
- 具體構建(ConcreteComponent):定義一個具體的對象,也可以給這個對象添加一些職責毒费。
public class Decorator extends Component {
protected Component component;
public void Decorate (Component component){
this.component = component;
}
public void Operation(){
if (component != null){
component.Operation();
}
}
}
- 裝飾類(Decorator): 裝飾抽象類丙唧,繼承了Component,從外類來擴展Component類的功能。
public class ConcreteDecorator extends Decorator {
private String addedState;
public void Operation(){
addedState = "New State";
System.out.println("具體裝飾對象的操作");
}
}
- 具體裝飾者(ConcretorDecorator):負責給構建對象添加職責觅玻。
裝飾模式
如果只有一個 ConcreteComponent 類想际,沒有抽象的 Component 類,那么 Decorator 類可以是 ConcreteComponent 類的子類串塑。
若只有一個 ConcreteDecorator 類沼琉,沒有必要建立單獨的 Decorator,將 Decorator 和 ConcreteDecorator 類的責任合并成一個類桩匪。
接下來打瘪,看一個具體實例:
Component 類:
public interface Coffee {
public double cost();
}
ConcreteComponent 類:
public class Espresso implements Coffee {
public double cost(){
return 2.5;
}
}
Decorator 類:
public class Dressing implements Coffee {
private Coffee coffee;
public Dressing(Coffee coffee){
this.coffee = coffee;
}
public double cost(){
return coffee.cost();
}
}
ConcretorDecorator 類:
public class Whip extends Dressing {
public Whip(Coffee coffee){
super(coffee);
}
public double cost(){
return super.cost() + 0.1;
}
}
public class Mocha extends Dressing {
public Mocha(Coffee coffee){
super(coffee);
}
public double cost(){
return super.cost() + 0.5;
}
}
裝飾模式是為已有功能動態(tài)地添加更多功能的一種方式。當系統(tǒng)需要新功能的時候,是向舊的類中添加新的代碼闺骚。這些新加的代碼(新的字段彩扔、方法、邏輯)通常裝飾了原有類的核心職責或主要行為僻爽,增加了主類的復雜度虫碉。
這些新加入的東西僅僅是滿足一些只在某種特定情況下才會執(zhí)行的特殊行為的需要。
裝飾模式提供了非常好的解決方案胸梆,它把每個要裝飾的功能放在單獨的類中敦捧,并讓這些類包裝它所要裝飾的對象。因此碰镜,當需要執(zhí)行特殊行為時兢卵,客戶代碼就可以在運行時根據(jù)需要有選擇地、按順序的使用裝飾功能包裝對象绪颖。
優(yōu)點:
- 把類的裝飾功能從類中搬移去除秽荤,這樣可以簡化原有的類。
- 有效的將類的核心職責和裝飾功能區(qū)分開柠横。而且可以去除相關類中重復的裝飾邏輯窃款。
需要注意的是:
- 裝飾模式的裝飾順序很重要。
- 加密數(shù)據(jù)牍氛、過濾詞匯→數(shù)據(jù)持久化的裝飾功能晨继。
- 保證裝飾類之間彼此獨立。