日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

设计模式学习----装饰器模式

發布時間:2025/3/21 asp.net 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式学习----装饰器模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這兩天本來是自在學習java collection Framework的Fail Fast底層機制,看到核心的部分時,突然意識到設計模式的問題,上大學到現在我還沒有真正理解過設計模式的概念,于是用了大半天好好的學習了一下裝飾器模式,回頭再看jdk的源碼,舒服多了,的確驗證了那句話,設計模式非學不可啊,可以說自己是個十足的菜鳥,連基本的java接口機制和繼承都忘得差不多了,這一天全拾起來了~

? ? 首先解釋一下忘記接口的同學難點,接口其實就是java的抽象機制,不提供方法的具體實現,但是可以有多個類來實現這個接口,一個類也可以實現多個接口,接口帶來的好處是創建實例時,用戶不必關注具體的實現,比如我例子中的DecoratorPattern.java文件中 ,創建實現Basket接口的一個實例時,返回值是接口,下面再使用show方法時,我們就不必去關注誰實現了。接口作為返回值的一個經典的應用是使用ArrayList時,他的iterator方法會返回一個Iterator接口。這樣開發者使用it.next方法,再不用去研究每一種list是怎么實現查詢了。

? ? 下面解釋裝飾器模式是如何引起的,深入淺出模式設計的例子很好,就是喝咖啡,有個調料的類,你可以加糖、冰、牛奶等等好多原料,那么生成調配方案時,可以通過繼承來實現,但是大家也都知道排列組合,繼承的類系統龐大可想而知了。

? ?這就誕生了裝飾器模式,他的原則是,保持原有的接口,并為原來的動態的添加新的功能。

下面是維基百科的解釋:相信大家都可以看懂

通過使用修飾模式,可以在運行時擴充一個類的功能。原理是:增加一個修飾類包裹原來的類,包裹的方式一般是通過在將原來的對象作為修飾類的構造函數的參數。裝飾類實現新的功能,但是,在不需要用到新功能的地方,它可以直接調用原來的類中的方法。修飾類必須和原來的類有相同的接口。

修飾模式是類繼承的另外一種選擇。類繼承在編譯時候增加行為,而裝飾模式是在運行時增加行為。

當有幾個相互獨立的功能需要擴充時,這個區別就變得很重要。在有些面向對象的編程語言中,類不能在運行時被創建,通常在設計的時候也不能預測到有哪幾種功能組合。這就意味著要為每一種組合創建一個新類。相反,修飾模式是面向運行時候的對象實例的,這樣就可以在運行時根據需要進行組合。一個修飾模式的示例是JAVA里的Java I/O Streams的實現”?

//補充一下,還有個經典的例子是java Collection framework也就是我們經常使用的ArrayList的底層實現機制,也是利用了裝飾器模式。


再引用網上的一個設計圖,很清晰了,我在代碼中的實現,并沒有實現裝飾器基類,而是直接去裝飾了。


下面介紹我這個演示的demo,假設我們有一個水果籃子,厘米可以裝蘋果,香蕉、或者橘子。這是可以典型的應用裝飾器模式,比如我們用三個修飾器來修飾水果籃子里面裝的內容。假設我們使用繼承的話,那么要想獲得所有情況,根據排列組合那么就有8種可能,需要有7個子類(空籃子就是本身,不需繼承了)。裝飾器模式就簡單多了


第一個是Basket接口

1 package uni.pattern.decorator;
2 /*
3 * 創建一個對象的抽象也就是接口
4 */
5 public interface Basket {
6 public void show();
7
8 }

下面是被裝飾的對象,也就是對接口的一個實現,注意可以有多個實現

1 package uni.pattern.decorator;
2
3 /**
4 *身份:被裝飾的對象
5 *一個對接口的實現,這個對象表示要我們將來要修飾的籃子里裝內容,如果想修飾籃子的造型,還可以創建其他類實現Basket的接口,比如Shape
6 * 不理解的話可以查看java語言的接口抽象機制
7 */
8 public class Original implements Basket{
9 public void show(){
10 System.out.println("The original Basket contains");
11 }
12 }

接下來是三個裝飾器的實現

1 package uni.pattern.decorator;
2
3 /**
4 *身份:裝飾器
5 *為原來的類添加新的功能
6 */
7 public class AppleDecorator implements Basket{
8 private Basket basket;
9 public AppleDecorator( Basket basket){
10 super();
11 this.basket = basket;
12 }
13
14 public void show(){
15 basket.show();
16 System.out.println("An Apple");
17 }
18
19 }


1 package uni.pattern.decorator;
2
3 /**
4 *身份:裝飾器
5 */
6 public class BananaDecorator implements Basket{
7 private Basket basket;
8 public BananaDecorator(Basket basket){
9 super();
10 this.basket = basket;
11 }
12
13 public void show(){
14 basket.show();
15 System.out.println("A Banana");
16 }
17
18 }


1 package uni.pattern.decorator;
2
3 /**
4 *身份:裝飾器
5 */
6 public class OrangeDecorator implements Basket{
7 private Basket basket;
8 public OrangeDecorator(Basket basket){
9 super();
10 this.basket = basket;
11 }
12
13 public void show(){
14 basket.show();
15 System.out.println("An Oranage");
16 }
17
18 }

最后就是實現的效果,我們三個修飾器全部用到,裝滿了籃子,當然也可以只裝一個蘋果或香蕉

1 /*
2 * 設計模式:裝飾器模式
3 * java 簡單的演示
4 */
5 package decoratorpattern;
6 import uni.pattern.decorator.Original;
7 import uni.pattern.decorator.*;
8
9 /**
10 *
11 * @author octobershiner
12 * 2011 7 25
13 * SE.HIT
14 */
15 public class DecoratorPattern {
16
17 /**
18 * @param args the command line arguments
19 */
20 public static void main(String[] args) {
21 // TODO code application logic here
22 Basket basket = new Original();
23 //一個裝飾的過程
24 Basket myBasket =new AppleDecorator(new BananaDecorator(new OrangeDecorator(basket)));
25 myBasket.show();
26 }
27 }

演示的結果:

run:
The original Basket contains
An Oranage
A Banana
an Apple
成功生成(總時間:0 秒)



實訓期間時間比較緊張,寫的不清晰,所以大家有疑問可以私下聯系我吧,歡迎留言

作者:leeon

出處:http://www.cnblogs.com/octobershiner/http://www.cnblogs.com/octobershiner/archive/2011/11/04/2236730.html

總結

以上是生活随笔為你收集整理的设计模式学习----装饰器模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。