Decorator裝飾設計模式

菜鳥Octopus發表於2018-08-19

裝飾著設計模式:動態地將責任附加到物件上,若要擴充套件功能,裝飾者提供了比繼承更有彈性的替代方案;


(開放--關閉原則)設計原則:類應該對擴充套件開放,對修改關閉;


java.io包中用到了大量的裝飾設計模式;

InputStream is = System.in;
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter((new OutputStreamWriter(System.out)));
Scanner sc = new Scanner(System.in);其實就是裝飾類的封裝模式

java裝飾設計模式的例子:

設計體系圖如下:

1.定義一個phone介面:

package TestDecorator;
/**
*類描述:定義一個手機介面
*@author: 張宇
*@date: 日期: 2018年8月19日 時間: 下午2:31:33
*@version 1.0
 */
public interface Phone {
	public abstract void call();
}

2.定義一個抽象類PhoneDecorate:

package TestDecorator;

/**
*類描述:一個抽象類實現phone介面
*@author: 張宇
*@date: 日期: 2018年8月19日 時間: 下午2:40:07
*@version 1.0
 */

public abstract class PhoneDecorate implements Phone {

	private Phone p;

	public PhoneDecorate(Phone p) {
		this.p = p;
	}

	@Override
	public void call() {
		this.p.call();
	}
}

3.定義個類Iphone實現Phone介面:

package TestDecorator;

/**
*類描述:一個實體方法實現phone介面
*@author: 張宇
*@date: 日期: 2018年8月19日 時間: 下午2:39:28
*@version 1.0
 */

public class IPhone implements Phone {
	@Override
	public void call() {
		System.out.println("蘋果手機!");
	}
}

4.定義一個類MusicPhoneDecorate實現PhoneDecorate抽象類:

package TestDecorator;
/**
*類描述:音樂手機裝飾繼承抽象類
*@author: 張宇
*@date: 日期: 2018年8月19日 時間: 下午2:41:13
*@version 1.0
 */
public class MusicPhoneDecorate extends PhoneDecorate {

	public MusicPhoneDecorate(Phone p) {
		super(p);
	}

	@Override
	public void call() {
		System.out.println("音樂手機!");
		super.call();		
	}
}

5.定義一個類RingPhoneDecorate類來實現PhoneDecorate類:

package TestDecorator;

/**
*類描述:鬧鈴手機實現手機裝飾抽象類
*@author: 張宇
*@date: 日期: 2018年8月19日 時間: 下午2:41:46
*@version 1.0
 */
public class RingPhoneDecorate extends PhoneDecorate {

	public RingPhoneDecorate(Phone p) {
		super(p);
	}

	@Override
	public void call() {
		System.out.println("鬧鈴手機!");
		super.call();
	}
}

6.定義一個測試類來測試裝飾類設計模式:

package TestDecorator;

public class PhoneDemo {
	public static void main(String[] args) {
		Phone p = new IPhone();
	    
		PhoneDecorate pd = new RingPhoneDecorate(p);
		pd.call();
		
		System.out.println("------------");

		/*pd = new MusicPhoneDecorate(p);
		  pd.call();
		System.out.println("------------");*/

		pd = new RingPhoneDecorate(new MusicPhoneDecorate(p));
		pd.call();
		
	}
}

測試結果:

鬧鈴手機!
蘋果手機!
------------
鬧鈴手機!
音樂手機!
蘋果手機!

裝飾者設計模式:動態地將責任附加到物件上;想要擴充套件功能,裝飾者提供有別於繼承的另外一種選擇。


1.繼承屬於擴充套件形式之一,但不見得達到彈性設計的最佳方式;

2.在我們設計中,應該允許行為被擴充套件,而無需修改現有的程式碼;

3.組合和委託可用於在運動時動態地加上新的行為;

4.除了繼承,裝飾者模式也可以讓我們擴充套件行為;

5.裝飾者模式意味著一群裝飾者類,這些類用來包裝具體元件;

6.裝飾者類反映出被裝飾的元件型別(事實上,他們具有相同的型別,都經過介面或繼承實現)。

7.可以無數個裝飾者包裝一個元件;

8.裝飾者一般對元件的客戶是透明的,除非客戶程式依賴於元件的具體型別;

9.裝飾者會導致設計中出現許多小物件,如果過度使用,會讓程式變得很負責;

10.組合和委託可用於在執行時動態地載入新的行為;

相關文章