Decorator裝飾設計模式
裝飾著設計模式:動態地將責任附加到物件上,若要擴充套件功能,裝飾者提供了比繼承更有彈性的替代方案;
(開放--關閉原則)設計原則:類應該對擴充套件開放,對修改關閉;
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.組合和委託可用於在執行時動態地載入新的行為;
相關文章
- 設計模式--裝飾模式(Decorator Pattern)設計模式
- 設計模式-裝飾模式(Decorator Pattern)設計模式
- PHP設計模式- Decorator 裝飾器模式PHP設計模式
- 設計模式之裝飾器模式(decorator pattern)設計模式
- PHP設計模式之裝飾器模式(Decorator)PHP設計模式
- C#設計模式-裝飾器模式(Decorator Pattern)C#設計模式
- 前端常用設計模式(1)--裝飾器(decorator)前端設計模式
- 裝飾模式 (Decorator Pattern)模式
- 裝飾器模式(Decorator)模式
- 設計模式中的俄羅斯套娃:裝飾者(Decorator)模式設計模式
- 設計模式——裝飾模式設計模式
- 設計模式-裝飾模式設計模式
- 裝飾設計模式設計模式
- 09 結構型模式之裝飾者模式(decorator)模式
- 設計模式——裝飾者模式設計模式
- 設計模式----裝飾器模式設計模式
- 設計模式-裝飾器模式設計模式
- 設計模式-裝飾者模式設計模式
- [設計模式]裝飾者模式設計模式
- [設計模式] 裝飾器模式設計模式
- decorator-裝飾器
- 設計模式系列之「裝飾模式」設計模式
- 小白設計模式:裝飾者模式設計模式
- Python設計模式-裝飾器模式Python設計模式
- 設計模式之-裝飾器模式設計模式
- 設計模式(八)裝飾器模式設計模式
- 軟體設計模式————(裝飾模式)設計模式
- java設計模式--裝飾器模式Java設計模式
- 極簡設計模式-裝飾模式設計模式
- 設計模式(六):裝飾器模式設計模式
- 設計模式之裝飾者模式設計模式
- 設計模式之【裝飾器模式】設計模式
- GoLang設計模式21 - 裝飾模式Golang設計模式
- 設計模式系列10–裝飾者模式設計模式
- PHP設計模式之裝飾者模式PHP設計模式
- Go 設計模式之裝飾器模式Go設計模式
- 設計模式之裝飾者模式(二)設計模式
- 設計模式之裝飾者模式(一)設計模式