<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-95  評論-31  文章-10  trackbacks-0

    該模式挺難理解,想了快一晚上。。。才算有點眉目。。。然后照搬一些java.io類還有servlet里面的過濾器終于有所領悟。
    使用接口實現,下面給出代碼:

      1/**
      2 *定義被裝飾者
      3 **/

      4public interface Human {
      5    public void wearClothes();
      6    public void walkToWhere();
      7}

      8/**
      9 *定義裝飾者是個抽象類
     10 **/

     11public abstract class Decorator implements Human {
     12    private Human human;
     13    
     14    public Decorator(Human human){
     15        this.human=human;
     16    }

     17    public void walkToWhere() {
     18         human.walkToWhere();
     19    }

     20    public void wearClothes() {
     21         human.wearClothes();
     22    }

     23}

     24/**
     25 *定義三種裝飾,這是第一種
     26 **/

     27public class Decorator_zero extends Decorator {
     28
     29    public Decorator_zero(Human human) {
     30        super(human);
     31    }

     32    private void put(){
     33        System.out.println("進房子");
     34    }

     35    private void finMap(){
     36        System.out.println("書柜找找Map");
     37    }

     38    @Override
     39    public void wearClothes() {
     40        super.wearClothes();
     41        put();
     42    }

     43    @Override
     44    public void walkToWhere() {
     45        super.walkToWhere();
     46        finMap();
     47    }

     48}

     49/**
     50 *這是第二種
     51 **/

     52public class Decorator_first extends Decorator{
     53
     54    public Decorator_first(Human human) {
     55        super(human);
     56    }

     57    private void put(){
     58        System.out.println("去衣柜找找");
     59    }

     60    private void where(){
     61        System.out.println("先找張地圖");
     62    }

     63    @Overrde
     64    public void wearClothes() {
     65        super.wearClothes();
     66        put();
     67    }

     68    @Override
     69    public void walkToWhere() {
     70        super.walkToWhere();
     71        where();
     72    }

     73}

     74/**
     75 *這是第三種
     76 **/

     77public class Decorator_second extends Decorator {
     78
     79    public Decorator_second(Human human) {
     80        super(human);
     81    }

     82    private void put(){
     83        System.out.println("找到一件D&G");
     84    }

     85    private void where(){
     86        System.out.println("從地圖上找到神秘花園以及城堡");
     87    }

     88    @Override
     89    public void wearClothes() {
     90         super.wearClothes();
     91         put();
     92    }

     93    @Override
     94    public void walkToWhere() {
     95         super.walkToWhere();
     96         where();
     97    }

     98}

     99/**
    100 *定義被裝飾者,該被裝飾者初始狀態會有一些自己的裝飾
    101 **/

    102public class Person implements Human {
    103
    104    public void walkToWhere() {
    105        System.out.println("去哪里呢");
    106    }

    107    public void wearClothes() {
    108        System.out.println("穿什么呢");
    109    }

    110}

    111/**
    112 *測試類,下面越看越帥。。。怎一個帥字了得。。。這明顯
    113 *是java.io的層次嘛。。。哈哈
    114 **/

    115public class Test {
    116public static void main(String[] args) {
    117    Human human = new Person();
    118    Decorator dt = new Decorator_second(new Decorator_first(new Decorator_zero(human)));
    119        dt.wearClothes();
    120        dt.walkToWhere();  
    121    }

    122}

    關鍵點:
    1、Decorator抽象類中,持有Human接口,方法全部委托給該接口調用,目的是交給該接口的實現類即子類進行調用。
    2、Decorator抽象類的子類(具體裝飾者),里面都有一個構造方法調用super(human),這一句就體現了抽象類依賴于子類實現即抽象依賴于實現的原則。因為構造里面參數都是Human接口,只要是該Human的實現類都可以傳遞進去,即表現出Decorator dt = new Decorator_second(new Decorator_first(new Decorator_zero(human)));這種結構的樣子。所以當調用dt.wearClothes();dt.walkToWhere()的時候,又因為每個具體裝飾者類中,都先調用super.wearClothes和super.walkToWhere()方法,而該super已經由構造傳遞并指向了具體的某一個裝飾者類(這個可以根據需要調換順序),那么調用的即為裝飾類的方法,然后才調用自身的裝飾方法,即表現出一種裝飾、鏈式的類似于過濾的行為。
    3、具體被裝飾者類,可以定義初始的狀態或者初始的自己的裝飾,后面的裝飾行為都在此基礎上一步一步進行點綴、裝飾。
    4、裝飾者模式的設計原則為:對擴展開放、對修改關閉,這句話體現在我如果想擴展被裝飾者類的行為,無須修改裝飾者抽象類,只需繼承裝飾者抽象類,實現額外的一些裝飾或者叫行為即可對被裝飾者進行包裝。所以:擴展體現在繼承、修改體現在子類中,而不是具體的抽象類,這充分體現了依賴倒置原則,這是自己理解的裝飾者模式。

    posted on 2010-08-31 11:07 朔望魔刃 閱讀(2343) 評論(1)  編輯  收藏 所屬分類: 設計模式&&數據結構

    評論:
    # re: 裝飾者模式學習 2013-10-24 12:18 | 紅燒獅子頭
    不錯~  回復  更多評論
      
    主站蜘蛛池模板: 亚洲成人免费电影| 免费国产a国产片高清网站| 亚洲无线码一区二区三区| 猫咪免费人成网站在线观看入口| 毛片免费视频在线观看| 2020国产精品亚洲综合网| 无限动漫网在线观看免费| 亚洲人成色4444在线观看| 全免费a级毛片免费看不卡| 中国china体内裑精亚洲日本| 成年人网站在线免费观看| 亚洲Av永久无码精品黑人| 四虎免费久久影院| 一级全免费视频播放| 国产亚洲精久久久久久无码| 久久香蕉国产线看免费| 亚洲欧洲精品一区二区三区| 一级女人18毛片免费| 亚洲美国产亚洲AV| 亚洲AV无码乱码在线观看性色扶| 一区二区三区视频免费观看| 亚洲国产精品va在线播放| 在线观看www日本免费网站| 亚洲欧洲日本在线观看 | 尤物视频在线免费观看| 久久久久国产成人精品亚洲午夜| 丝袜捆绑调教视频免费区| 久久久久亚洲AV成人片| 久久久久国色AV免费看图片| 免费亚洲视频在线观看| 丁香五月亚洲综合深深爱| 1000部拍拍拍18勿入免费视频下载| 亚洲午夜成人精品无码色欲| 国产精品亚洲mnbav网站| 午夜精品免费在线观看 | 亚洲av永久综合在线观看尤物| 在线免费观看污网站| 男女拍拍拍免费视频网站| 亚洲午夜成激人情在线影院 | 中文字幕亚洲日本岛国片| 亚洲免费视频观看|