<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      設計模式之裝飾器模式

        裝飾器模式,顧名思義起的是裝飾的作用,就是在一個類上增加功能。如果通過繼承來增加功能,在不修改代碼的情況下,如果增加功能多的話,會使類的數量爆炸式增長,為管理帶來巨大的麻煩。裝飾器模式就比較好地解決了這一點。

        

        以上為裝飾器模式的通用類圖:

        

        Component,一般是接口或者抽象類,定義了最簡單的方法,裝飾器類和被裝飾類都要實現該接口。
       
        ConcreteComponent,被裝飾類,實現了Component。
       
        Decorator,裝飾器類,通過該類為ConcreteComponent動態添加額外的方法,實現了Component接口,并且該對象中持有一個Component的成員變量。
       
        ConcreteDecoratorA,ConcreteDecoratorB,具體的裝飾類,該類中的方法就是要為ConcreteComponent動態添加的方法。

        我們以生產一件衣服為例,生產一件衣服本身是個很簡單的過程,一塊布料裁剪好了之后做出衣服的樣子就可以了,但是這樣的衣服是賣不出去的,因為毫無美感,我們需要通過一些裝飾來使衣服變得好看。但是時代在變化,人們的審美也在變化,裝飾總是不斷在變的,所以我們就要有一個靈活機動的模式來修改裝飾。

      interface Clothes {
      	public void makeClothes();
      }
      class MakeClothes implements Clothes {
      
      	@Override
      	public void makeClothes() {
      		System.out.println("制作一件衣服");
      	}
      	
      }
      

        話不多說,先來個衣服的最初成品,就是毫無美感的那種,那么如果現在要增加裝飾,可以用一個類繼承MakeClothes,然后增加里面makeClothes()方法,但是如果過幾天裝飾就變了,那么又要改動代碼,而且如果裝飾過多,這個類就顯得很龐雜,不好維護,這個時候裝飾器模式就來大顯身手了。

      class Decorator implements Clothes {
      	
      	private Clothes clothes;
      	public Decorator(Clothes _clothes) {
      		this.clothes = _clothes;
      	}
      	@Override
      	public void makeClothes() {
      		clothes.makeClothes();
      	}
      }
      

        這就是一個裝飾器,它有一個構造函數,參數是一個衣服類,同時它重載了makeClothes()方法,以便它的子類對其進行修改。下面是兩個子類,分別對衣服進行了繡花和鏤空:

      class Embroidery extends Decorator {
      
      	public Embroidery(Clothes _clothes) {
      		super(_clothes);		
      	}
      	public void embroidery() {
      		System.out.println("給衣服繡花");
      	}
      	public void makeClothes() {
      		super.makeClothes();
      		this.embroidery();
      	}
      }
      class Hollow extends Decorator {
      
      	public Hollow(Clothes _clothes) {
      		super(_clothes);
      	}
      	public void hollow() {
      		System.out.println("關鍵位置鏤空");
      	}
      	public void makeClothes() {
      		super.makeClothes();
      		this.hollow();
      	}
      }
      

        這兩個子類的構造器都傳入一個衣服模型,而且兩個子類分別有各自的方法——繡花和鏤空,但是他們均重寫了makeClothes()方法,在制作衣服的過程中加入了繡花和鏤空的操作,這樣一來,我們只需要增刪改這幾個裝飾器的子類,就可以完成各種不同的裝飾,簡潔明了,一目了然。下面測試一下:

      public class TestDecorator {
      public static void main(String[] args) {
      	Clothes clothes = new MakeClothes();
      	clothes = new Embroidery(clothes);
      	clothes = new Hollow(clothes);
      	clothes.makeClothes();
      	System.out.println("衣服做好了");
      }
      }
      

        測試打印結果如下:

        制作一件衣服
        給衣服繡花
        關鍵位置鏤空
        衣服做好了

            可見裝飾的效果還是不錯的,不過裝飾器模式雖然好用,但是如果裝飾層數過多,還是會影響到維護的,所以說設計模式雖好,還是需要靈活使用。

      posted @ 2018-01-24 21:33  AI架構牧羊人  閱讀(2006)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲精品国产精品乱码不| 性做久久久久久久久| 国产精品不卡一区二区久久| 亚洲欧美日本久久网站| 欧美成人精品一级在线观看| 区一区二区三区中文字幕| 精品国产免费第一区二区三区| 日本久久一区二区三区高清| 精品夜恋影院亚洲欧洲| 日韩精品国产二区三区| 国产一区二区三中文字幕| 久久久综合九色合综| 真实国产老熟女无套内射| 国产综合有码无码中文字幕| 长汀县| 波多野结衣av无码| 中文字幕国产精品第一页| 综合色一色综合久久网| 国产精品久久久久久久久久直播 | 一区二区三区无码免费看| 18禁无遮拦无码国产在线播放| A级毛片100部免费看| 国产一二三五区不在卡| 亚洲一级特黄大片一级特黄| 毛片tv网站无套内射tv网站| 国产精品夫妇激情啪发布| 国产成人精品免费视频app软件| 丰台区| 在线观看人成视频免费| 尹人香蕉久久99天天拍| 国产精品自拍中文字幕| 国产品精品久久久久中文| 中文字幕亚洲国产精品| 精品无码国产不卡在线观看| 亚洲天堂av日韩精品| 得荣县| 亚洲精品无码久久毛片| 午夜福利看片在线观看| 国内精品亚洲成av人片| 亚洲人妻精品中文字幕| 免费超爽大片黄|