Java設計模式系列-裝飾器模式
原創文章,轉載請標註出處:
一、概述
裝飾器模式作用是針對目標方法進行增強,提供新的功能或者額外的功能。
不同於介面卡模式和橋接模式,裝飾器模式涉及的是單方,和代理模式相同,而且目標必須是抽象的。
而實際上,裝飾器模式和代理模式的實現方式基本一致,只在目標的存在上有些差別,這個後面我們具體講述。
二、初步分析
上面提到了兩點:
涉及的是單方
目標是抽象的
我們來想一下,所謂單方主要指的是在整個裝飾器模式中不存在雙方呼叫,要解決的也不是雙方呼叫的問題,而是解決單方提供對外服務的問題,這個單方在自行對外提供服務時,功能不足,或者我們需要額外新增一些新功能,這時就可以使用裝飾器模式,來對這個單方進行增強。
目標抽象的意思是因為我們需要透過實現介面的方式來進行增強,因此目標必須抽象為介面。
三、例項
下面我們用我們生活中的一個例子來說明,我們用房子來作為目標:
房子介面:House
/** * 目標介面:房子 */public interface House { void output(); }
具體的房子:DonghaoHouse
/** * 房子實現類 */public class DonghaoHouse implements House { @Override public void output() { System.out.println("這是董浩的房子"); } }
具體的房子:DongliangHouse
/** * 房子實現類 */public class DongliangHouse implements House { @Override public void output() { System.out.println("這是董量的房子"); } }
裝飾器:Decorator
public class Decorator implements House { private House house; public Decorator(House house){ this.house = house; } @Override public void output() { System.out.println("這是針對房子的前段裝飾增強"); house.output(); System.out.println("這是針對房子的後段裝飾增強"); } }
測試類:
public class Clienter { public static void main(String[] args) { House donghaoHouse = new DonghaoHouse(); House decorator = new Decorator(donghaoHouse); decorator.output(); } }
執行結果為:
這是針對房子的前段裝飾增強 這是董浩的房子 這是針對房子的後段裝飾增強
四、解析
透過上面的例子我們可以看出,除了測試類外,只剩下介面和實現類了,即使是裝飾器類也是目標介面的一個字類,這更能說明單方的說法,模式中所有的類都屬於目標方。至於目標是抽象的更是如此,只有目標是抽象的,才可以使用裝飾器模式來進行增強。
上面我們說過裝飾器模式與代理模式基本相同,只存在少許差別。
我們需要從概念上了解代理和裝飾的區別:
代理是全權代理,目標根本不對外,全部由代理類來完成。
裝飾是增強,是輔助,目標仍然可以自行對外提供服務,裝飾器只起增強作用。
上面兩點提現到程式碼實現中是這樣的:
代理模式
public class Proxy implements House { private House house; public Decorator(){ this.house = new DonghaoHouse(); } @Override public void output() { System.out.println("這是針對目標的前段增強"); house.output(); System.out.println("這是針對目標的後段增強"); } }
裝飾模式
public class Decorator implements House { private House house; public Decorator(House house){ this.house = house; } @Override public void output() { System.out.println("這是針對房子的前段裝飾增強"); house.output(); System.out.println("這是針對房子的後段裝飾增強"); } }
看出來了嗎,裝飾器中持有的目標例項是從構造器傳入的,而代理中持有的目標例項是自己建立的。
那麼這裡又出現一個區別,代理模式和裝飾器模式雖然都依賴於目標介面,但是代理針對的目標實現類是固定的,而裝飾器模式可以隨意指定,也就是說目標是可以自有擴充套件的。
五、使用場景
裝飾器模式就是使用在對已有的目標功能存在不足,需要增強時,前提是目標存在抽象介面。
六、總結
我們要明白代理模式和裝飾器模式的區別,區分二者的使用場景,如下圖:
作者:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/755/viewspace-2821924/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- java設計模式--裝飾器模式Java設計模式
- Java 設計模式(五)《裝飾器模式》Java設計模式
- java設計模式之裝飾器模式Java設計模式
- java設計模式-裝飾器模式(Decorator)Java設計模式
- Java設計模式12:裝飾器模式Java設計模式
- 【趣味設計模式系列】之【裝飾器模式】設計模式
- Java學設計模式之裝飾器模式Java設計模式
- 設計模式系列之「裝飾模式」設計模式
- 設計模式----裝飾器模式設計模式
- 設計模式-裝飾器模式設計模式
- [設計模式] 裝飾器模式設計模式
- 設計模式系列10–裝飾者模式設計模式
- 設計模式(八)裝飾器模式設計模式
- 設計模式之-裝飾器模式設計模式
- 設計模式之【裝飾器模式】設計模式
- 設計模式(六):裝飾器模式設計模式
- 設計模式系列10--裝飾者模式設計模式
- C#設計模式系列:裝飾模式(Decorator)C#設計模式
- Java設計模式(3)-裝飾者模式Java設計模式
- Java設計模式之裝飾者模式Java設計模式
- Go 設計模式之裝飾器模式Go設計模式
- PHP設計模式- Decorator 裝飾器模式PHP設計模式
- Python設計模式-裝飾器模式Python設計模式
- 設計模式——裝飾模式設計模式
- 設計模式-裝飾模式設計模式
- 設計模式-裝飾設計模式設計模式
- JAVA設計模式之 裝飾模式【Decorator Pattern】Java設計模式
- Java設計模式之裝飾模式趣談Java設計模式
- 設計模式之裝飾器模式(decorator pattern)設計模式
- 23種設計模式(三)--裝飾器模式設計模式
- 設計模式專題(七)裝飾器模式設計模式
- PHP設計模式之裝飾器模式(Decorator)PHP設計模式
- 設計模式 #4 (裝飾器模式、介面卡模式)設計模式
- c++設計模式-裝飾器模式和代理模式C++設計模式
- 設計模式-裝飾者模式設計模式
- 設計模式——裝飾者模式設計模式
- 設計模式(八):裝飾模式設計模式
- 【設計模式之裝飾模式】設計模式