裝飾者模式(附與代理模式的區別,乍看挺像)
阿新 • • 發佈:2019-01-02
一.裝飾模式介紹
裝飾模式也稱為包裝模式,結構設計模式之一,就像房子一個,房子蓋好都是毛坯房,但是裝修之後,有簡單裝修,精裝修,豪華裝修,各有不同,這個就可以理解為裝飾模式,不管你怎麼裝修,最開始都是毛坯房,或者一個人每天穿不同的衣服(裝飾),但是本質還是同一個人沒有發生改變。
二.裝飾模式的定義
動態的給一個物件新增一些額外的職責,就增加功能來說,裝飾模式比生成子類而言更加簡單
三.裝飾模式的使用場景
需要透明並且動態的擴充套件類的功能時。
四.簡單實現
//Component.java
public abstract class Component { /** * 抽象的方法 * */ public abstract void operate(); }
//ConcreteComponent.java
public class ConcreteComponent extends Component {
@Override
public void operate() {
System.out.println("xcqw 我是小明");
}
}
//Decorator.java
//ConcreteDecoratorA.javapublic abstract class Decorator extends Component { private Component component;//持有一個Component物件的引用 /** * 必要的構造方法 需要一個Component型別的物件 * */ public Decorator(Component component) { this.component = component; } @Override public void operate() { component.operate(); } }
public class ConcreteDecoratorA extends Decorator { /** * 必要的構造方法 需要一個Component型別的物件 * * @param component */ public ConcreteDecoratorA(Component component) { super(component); } @Override public void operate() { //裝飾方法A和B (也就是帶了個帽子 ,穿了雙跑鞋) super.operate(); } public void operateA(){ //裝飾方法邏輯 System.out.println("我戴了帽子"); } public void operateB(){ //裝飾方法邏輯 System.out.println("我穿了雙跑鞋"); } }
//ConcreteDecoratorB
public class ConcreteDecoratorB extends Decorator {
/**
* 必要的構造方法 需要一個Component型別的物件
*
* @param component
*/
public ConcreteDecoratorB(Component component) {
super(component);
}
@Override
public void operate() {
//裝飾方法A和B (也就是帶了個大金鍊子 ,穿了木屐)
super.operate();
}
public void operateA(){
//裝飾方法邏輯
System.out.println("我帶了個大金鍊子");
}
public void operateB(){
//裝飾方法邏輯
System.out.println("我穿了木屐");
}
}
//MainActivity.java
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//構造被裝飾的元件物件
Component component = new ConcreteComponent();
//根據元件物件構造裝飾者物件A並呼叫,此時相當於給元件物件增加裝飾者A的方法
Decorator decoratorA = new ConcreteDecoratorA(component);
decoratorA.operate();
//根據元件物件構造裝飾者物件B並呼叫,此時相當於給元件物件增加裝飾者B的方法
Decorator decoratorB = new ConcreteDecoratorB(component);
decoratorB.operate();
}
}
結果可以看到 一個是戴帽子穿跑鞋的小明,一個則是代金鍊子,穿木屐的小明,著裝風格不一樣,但是都是小明
Component:抽象元件
可以是一個介面或者抽象類,其充當的就是被裝飾的原始物件
ConcreteComponent:元件具體實現類
該類是Component類的基本實現,也就是我們裝飾的具體物件(也就是小明)。
Decorator:抽象裝飾者
裝飾我們的元件物件,其內部一定要有一個指向元件物件的引用。
ConcreteDecorateA:裝飾著具體實現類
只是對抽象裝飾著作出具體的實現(具體擴充套件的方法,精裝修還是豪華裝修)
ConcreteDecorateB:裝飾著具體實現類
只是對抽象裝飾著作出具體的實現(具體擴充套件的方法,精裝修還是豪華裝修)
Client :客戶類
五.Android原始碼中的模式實現
在Android中常用的Context就使用了裝飾者模式,看圖就很清晰了
六.跟代理模式的區別
一句話,裝飾者模式是增強物件功能(穿不同的衣服),代理模式是控制代理的物件,但不對其做功能增加