1. 程式人生 > >大話設計模式之裝飾模式總結-java實現

大話設計模式之裝飾模式總結-java實現

注:示例來自《大話設計模式》

現有如下要求 寫一個可以給人搭配不同的服飾的系統 程式碼如下

Person類

package Test06;

public class Person {

    private String name;
    public Person(String name)
    {
        this.name = name;
    }

    public void WearTShirts()
    {
        System.out.print("大T恤 ");
    }

    public void WearBigTrouser
() { System.out.print("垮褲 "); } public void WearSneakers() { System.out.print("破球鞋 "); } public void WearSuit() { System.out.print("西裝 "); } public void WearTie() { System.out.print("領帶 "); } public void WearLeatherShoes
() { System.out.print("皮鞋 "); } public void Show() { System.out.print("裝扮的"+name); } }

客戶端程式碼

package Test06;

public class Program {

    public static void main(String[] args)
    {
        Person xc = new Person("小菜");

        System.out.println("\n第一種裝扮:"
); xc.WearTShirts(); xc.WearBigTrouser(); xc.WearSneakers(); xc.Show(); System.out.println("\n第二種裝扮:"); xc.WearSuit(); xc.WearTie(); xc.WearLeatherShoes(); xc.Show(); } }

現在有個問題就是如果需要增加超人的裝扮 該如何做呢
需要改Person類 違背了開放-封閉原則 應該把服飾都寫成子類
重構後代碼如下

Person類

package Test06;

public class Person {

    private String name;
    public Person(String name)
    {
        this.name = name;
    }

    public void Show()
    {
        System.out.print("裝扮的"+name);
    }

}

服飾抽象類

package Test06;

public abstract class Finery {

    public abstract void Show();

}

各種服飾子類

package Test06;

public class TShirts extends Finery {

    @Override
    public void Show() {
        System.out.print("大T恤 ");   
    }   

}
package Test06;

public class BigTrouser extends Finery {

    @Override
    public void Show() {
        System.out.print("垮褲 ");    
    }

}
package Test06;

public class Sneakers extends Finery {

    @Override
    public void Show() {
        System.out.print("破球鞋 ");
    }

}
package Test06;

public class Suit extends Finery {

    @Override
    public void Show() {
        System.out.print("西裝 ");
    }
}
package Test06;

public class Tie extends Finery {

    @Override
    public void Show() {
        System.out.print("領帶 ");
    }
}
package Test06;

public class LeatherShoes extends Finery {

    @Override
    public void Show() {
        System.out.print("皮鞋 ");
    }
}

客戶端程式碼

package Test06;

public class Program {

    public static void main(String[] args)
    {
        Person xc = new Person("小菜");

        System.out.println("\n第一種裝扮:");

        Finery dtx = new TShirts();
        Finery kk = new BigTrouser();
        Finery pqx = new Sneakers();

        dtx.Show();
        kk.Show();
        pqx.Show();
        xc.Show();

        System.out.println("\n第二種裝扮:");

        Finery xz = new Suit();
        Finery ld = new Tie();
        Finery px = new LeatherShoes();

        xz.Show();
        ld.Show();
        px.Show();
        xc.Show();

    }

}

上面的程式碼是一個詞一個詞顯示出來的 就好比 光著身子 當著大家的面 先穿 T恤 再穿褲子 再穿鞋 應該把所需的功能按正確的順序串聯起來進行控制 用裝飾模式看看如何實現 程式碼如下

Person類

package Test06;

public class Person {

    public Person()
    { }

    private String name;
    public Person(String name)
    {
        this.name = name;
    }

    public void Show()
    {
        System.out.print("裝扮的"+name);
    }

}

服飾類

package Test06;

public class Finery extends Person {

    protected Person component;

    //打扮
    public void Decorate(Person component)
    {
        this.component = component;
    }
    @Override
    public void Show()
    {
        if (component != null)
        {
            component.Show();
        }
    }
}

具體服飾類

package Test06;

public class TShirts extends Finery {

    @Override
    public void Show() {
        System.out.print("大T恤 ");
        super.Show();
    }   

}
package Test06;

public class BigTrouser extends Finery {

    @Override
    public void Show() {
        System.out.print("垮褲 ");
        super.Show();
    }

}
package Test06;

public class Sneakers extends Finery {

    @Override
    public void Show() {
        System.out.print("破球鞋 ");
        super.Show();
    }

}
package Test06;

public class Suit extends Finery {

    @Override
    public void Show() {
        System.out.print("西裝 ");
        super.Show();
    }
}
package Test06;

public class Tie extends Finery {

    @Override
    public void Show() {
        System.out.print("領帶 ");
        super.Show();
    }
}
package Test06;

public class LeatherShoes extends Finery {

    @Override
    public void Show() {
        System.out.print("皮鞋 ");
        super.Show();
    }
}

客戶端程式碼

package Test06;

public class Program {

    public static void main(String[] args)
    {
        Person xc = new Person("小菜");

        System.out.println("\n第一種裝扮:");

        Sneakers pqx = new Sneakers();
        BigTrouser kk = new BigTrouser();
        TShirts dtx = new TShirts();

        pqx.Decorate(xc);
        kk.Decorate(pqx);
        dtx.Decorate(kk);
        dtx.Show();

        System.out.println("\n第二種裝扮:");

        LeatherShoes px = new LeatherShoes();
        Tie ld = new Tie();
        Suit xz = new Suit();

        px.Decorate(xc);
        ld.Decorate(px);
        xz.Decorate(ld);
        xz.Show();

    }

}

裝飾模式是為已有功能動態地新增更多功能的一種方式 它把每個要裝飾的功能放在單獨的類中 並讓這個類包裝它所要裝飾的物件 可以在執行時 根據需要有選擇地 按順序地使用裝飾功能包裝物件

缺點:會產生過多的相似的物件 不容易排錯

相關推薦

大話設計模式裝飾模式總結-java實現

注:示例來自《大話設計模式》 現有如下要求 寫一個可以給人搭配不同的服飾的系統 程式碼如下 Person類 package Test06; public class Person { private String name; pub

Java設計模式(9)——創建型模式裝飾模式

block 擴展 str 分享 增加 image tro col 技術 一、概述   動態地給一個對象添加一些額外的職責。就增加功能來說, Decorator模式相比生成子類更為靈活。該模式以對客 戶端透明的方式擴展對象的功能。   UML簡圖      角

java設計模式裝飾模式

zha tput str itl fill ext 裏的 pri use 轉載請註明出處:http://blog.csdn.net/zhaoyanjun6/article/details/56488020 前言 其實我們可以這樣理解裝飾器模式, 就拿自己舉例子

大話設計模式裝飾模式

       經過了前面的設計原則和工廠三姐妹、單例設計模式的學習,我相信大家已經掌握了基本的學習方法,今天我們來總結裝飾模式,首先來看一下裝飾模式的UML圖:                         接著我們根據UML圖寫一下原始碼實現: abstract clas

java設計模式裝飾模式代理模式區別

初次看裝飾模式的時候首先想到了上節講的代理模式,代理模式與裝飾者模式看起來很像,都實現基礎物件實現的介面,在其自身物件中都儲存著對被代理/被裝飾者的物件引用。 各用一句話描述兩個模式應該是這樣的: 裝飾模式:以對客戶端透明的方式擴充套件物件的功能,是繼承關係的一個替代方案

Java設計模式裝飾模式趣談

JVM:”上次給我招的工人不錯啊!” oo程式設計師:”………..” JVM:”現在來我開的博物館生意越來越好了,原來”舞臺劇

設計模式裝飾模式

裝飾模式 設計模式 包裝器模式 1、裝飾模式相關介紹: a、裝飾模式的職責: - 動態的為一個對象增加新的功能 - 裝飾模式是一種用於代替繼承的技術,無需通過繼承增加子類就能夠擴展對象的新功能。使用對象的關聯關系代替繼承關系,更加靈活,同時避免了類型體系的快速膨脹。 b

設計模式裝飾模式的復習

裝飾 容器 cfg trac 兩個 div 添加 維護 ble 經典問題:咖啡館問題 咖啡有四種類型:HouseBlend (混合咖啡)、DarkRoast (燒烤咖啡)、Decaf ( 脫咖啡因咖啡)和espresso(濃咖啡) 調味品如:Steamed milk(清蒸調

設計模式裝飾模式 Decorator

imp override int cor args public generate fly end 代碼實現 public interface ICar { void move(); } 抽象構建角色 //具體構件角色(真實對象,被裝飾

設計模式的藝術 結構性模式裝飾模式

不懂使用為學過,說出用途,繪製結構為了解,不會靈活使用基本等於沒學。 前言 我們大多數時候買的新房都是毛坯房,想要入住的話無疑需要進行一次裝修自己才能高高興興的入住,雖然裝修了,但是並沒有改變房子的本質,但這樣會讓你更樂於到房子裡面去入住,在軟體設計中,也有這麼一種技術可以對已有的物件的功能

設計模式裝飾模式(Decorator)

設計模式之裝飾模式(Decorator) 場景 普通人跑步,跳高,舉重很普通。 現在需要使用裝備變成鋼鐵俠,3項指標成倍擴大 Man介面 public interface Man { void run(); int highJump();

面向物件設計模式---裝飾模式(Decorator Pattern)

裝飾模式給我的感覺就有點像一個人穿衣服,或者從更專業一點的角度來說,有點像Java中檔案讀取時管道要套上一層又一層的“衣服”一樣。這是一個鏈式的過程。 裝飾模式的定義是: 動態地給一個物件新增一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。 裝飾模式

設計模式裝飾模式(dubbo原始碼中的裝飾模式

package org.apache.dubbo.rpc.protocol; import org.apache.dubbo.common.Constants; import org.apache.dubbo.common.URL; import org.apache.du

23種設計模式裝飾模式

職責:動態的為一個物件增加一個新的功能 裝飾模式是一個用於代替繼承的技術,無須通過繼承增加子類就能擴充套件物件的新功能,使用物件的關聯關係代替繼承關係,更加靈活,同時避免型別體系的快速膨脹。 實

設計模式裝飾模式和代理模式區別與聯絡

一.你在一個地方寫裝飾,大家就知道這是在增加功能,你寫代理,大家就知道是在限制      1.最常見的代理就是許可權判斷了,許可權就肯定是限制了      2.裝飾模式是指增強被包裝物件的功能        代理模式是修改被代理物件的行為      3.例子:      

設計模式裝飾模式,學習心得。如有錯誤,請多指教,謝謝。

裝飾模式設計出來的目的就是為了更方便的對現有類進行功能的新增,同時又不改變現有類。即,我是不永恆不變的,為了現在滿足我某個功能,這個功能大多數時候我是不需要的,你讓我自己去學習這個功能,我又不常用我學它幹什麼呢?沒有必要改變自己嘛。就像為了在冬天保暖,我沒有必要長一身毛,沒有

7 結構型模式 - 裝飾模式

oid str res bstr 子類 protected eat 同時 jea 裝飾模式介紹:裝飾模式也稱為包裝模式,是結構型模式之一,其使用一種對客戶端透明的方式來動態地擴展對象的功能,同時它也是繼承關系的一種替代方案之一。在現實生活中你也可以看見很多裝飾模式的例子,或

結構型模式 裝飾模式

res 松耦合 行為 父類 添加 class 但是 end bsp 裝飾模式(Decorator Pattern) :動態地給一個對象增加一些額外的職責(Responsibility),就增加對象功能來說,裝飾模式比生成子類實現更為靈活。其別名也可以稱為包裝器(Wrappe

結構型模式裝飾模式

活性 @override java基礎 cor span decorator 不用 解決 system 裝飾模式(Decorator Pattern)是一種比較常見的模式。 定義: 動態地給一個對象添加一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。 裝飾模

大話設計模式Java程式碼示例(三)裝飾模式

裝飾模式(Decorator):動態地給一個物件新增一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。 package decorator; /** * 裝飾模式(Decorator) * Person類 */ public class Perso