前言
裝飾模式其實是繼承關係的一種替代方案之一,是一種對客戶端透明的方式來動態地擴展對象的功能.
因爲近期入職了新公司,還是把設計模式都在溫習一遍.
正文
定義: 動態地給一個對象添加一些額外的職責.就增加功能來說,裝飾模式相比生成子類更爲靈活
使用場景: 需要透明且動態地擴展類的功能時
和代理模式的區別: 裝飾模式和代理模式有點類似.裝飾模式是以對客戶端透明的方式擴展對象的功能,是繼承關係的一個替代方案;而代理模式則是給一個對象提供一個代理對象,並有代理對象來控制原有對象的引用.裝飾模式應該爲所裝飾的對象增強功能;代理模式對代理的對象施加控制,但不對對象本身的功能進行增強.
UML類圖
Component: 抽象組件:可以事一個接口或抽象類,其充當的就是被裝飾的原始對象.
/**
* 抽象組件類
* Created by max on 2016/4/12.
*/
public abstract class Component {
/**
* 抽象的方法,同樣的也可以增加更多的抽象方法
*/
public abstract void operate ();
}
ConcreteComponent: 組件具體實現類:該類是Component類的基本實現,也是我們裝飾的具體對象.
/**
* 組件具體實現類
* Created by max on 2016/4/12.
*/
public class ConcreteComponent extends Component {
@Override
public void operate () {
}
}
Decorator: 抽象裝飾者:其承擔的職責就是爲了裝飾我們的組件對象,其內部一定要有一個指向組件對象的引用.
/**
* 抽象裝飾者
* Created by max on 2016/4/12.
*/
public abstract class Decorator extends Component {
private Component component;
/**
* 必要的構造方法,需要一個Component的引用
* @param component
*/
public Decorator (Component component) {
this .component = component;
}
@Override
public void operate () {
component.operate();
}
}
ConcreteDdecoratorA: 裝飾者具體實現類
/**
* 裝飾者具體實現類
* Created by max on 2016/4/12.
*/
public class ConcreteDecoratorA extends Decorator {
/**
* 必要的構造方法,需要一個Component的引用
*
* @param component
*/
public ConcreteDecoratorA (Component component) {
super (component);
}
/**
* 可以任意增加要想增加的功能來實現裝飾模式
*/
@Override
public void operate () {
super .operate();
operateA();
operateB();
}
/**
* 自定義的裝飾方法A
*/
public void operateA (){
}
/**
* 自定義的裝飾方法B
*/
public void operateB (){
}
}
/**
* 客戶端調用類
* Created by max on 2016/4/12.
*/
public class Client {
public static void main (String args[]){
Component component = new ConcreteComponent();
Decorator decorator = new ConcreteDecoratorA(component);
decorator.operate();
}
}
總結