隨筆-95  評(píng)論-31  文章-10  trackbacks-0

          該模式挺難理解,想了快一晚上。。。才算有點(diǎn)眉目。。。然后照搬一些java.io類(lèi)還有servlet里面的過(guò)濾器終于有所領(lǐng)悟。
          使用接口實(shí)現(xiàn),下面給出代碼:

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

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

            8/**
            9 *定義裝飾者是個(gè)抽象類(lèi)
           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("進(jìn)房子");
           34    }

           35    private void finMap(){
           36        System.out.println("書(shū)柜找找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 *定義被裝飾者,該被裝飾者初始狀態(tài)會(huì)有一些自己的裝飾
          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 *測(cè)試類(lèi),下面越看越帥。。。怎一個(gè)帥字了得。。。這明顯
          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}

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

          posted on 2010-08-31 11:07 朔望魔刃 閱讀(2346) 評(píng)論(1)  編輯  收藏 所屬分類(lèi): 設(shè)計(jì)模式&&數(shù)據(jù)結(jié)構(gòu)

          評(píng)論:
          # re: 裝飾者模式學(xué)習(xí) 2013-10-24 12:18 | 紅燒獅子頭
          不錯(cuò)~  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 汉寿县| 桐柏县| 武冈市| 姜堰市| 宁晋县| 诸暨市| 金寨县| 义乌市| 福清市| 翁牛特旗| 海宁市| 金门县| 林甸县| 新绛县| 大港区| 绿春县| 揭东县| 津市市| 喀喇| 郸城县| 朝阳区| 云阳县| 出国| 临沧市| 德清县| 麻城市| 岗巴县| 莆田市| 上饶县| 海南省| 天全县| 英吉沙县| 五寨县| 太原市| 青浦区| 延寿县| 永泰县| 临泉县| 荃湾区| 大名县| 吉隆县|