裝飾模式(Decorator)

GitHub地址

https://github.com/YEN-GitHub/PatternDemo/tree/master/src/StructuralPattern/DecoratorPattern

裝飾模式概述

Provide a surrogate or placeholder for another object to control access to it.
爲其他對象提供一種代理以控制對這個對象的訪問。

題目

請用裝飾模式(Decorator)爲某遊戲角色設計換裝功能,具體描述如下:
現階段遊戲包含人類(Human)和獸人(Orc)兩種角色(Charactor),在將來可能會增加新角色。
現階段服裝(Finery)包含T恤(TShirt),牛仔褲(Jean),運動鞋(Sneaker),西裝(Suit),領帶(Tie),皮鞋(LeatherShoe)六種,在將來可能會增加新的服裝,並且角色服裝可以依據用戶喜愛自由穿戴。
並搭配出:
紳士風的人類(西裝,領帶,皮鞋);
休閒風的獸人(T恤,牛仔褲,運動鞋);
混搭風的獸人(西裝,領帶,牛仔褲,運動鞋)。
題目中角色和服裝只需要通過輸出語句表示即可,比如:混搭風的獸人(西裝,領帶,牛仔褲,運動鞋),將輸出“運動鞋 牛仔褲 領帶 西裝 裝扮的獸人XXX(名字)”。

UML類圖

這裏寫圖片描述

代碼

package StructuralPattern.DecoratorPattern.demo1;


/**
 * Created by yangenneng on 2017-05-03 12:59
 * Abstract:角色
 */
public class Charactor {

    public void show(){

    }

}
package StructuralPattern.DecoratorPattern.demo1;

import StructuralPattern.DecoratorPattern.demo1.Charactor;

/**
 * Created by yangenneng on 2017-05-03 12:59
 * Abstract:人類
 */
public class Human extends Charactor {
    private String name;
    public Human(String name){
        this.name=name;
    }
    public void show(){
        System.out.println("--人類:"+name);
    }
}
package StructuralPattern.DecoratorPattern.demo1;


/**
 * Created by yangenneng on 2017-05-03 12:59
 * Abstract:獸人
 */
public class Orc extends Charactor {
    private String name;
    public Orc(String name){
        this.name=name;
    }
    public void show(){
        System.out.println("--獸人:"+name);
    }
}
package StructuralPattern.DecoratorPattern.demo1;

import StructuralPattern.DecoratorPattern.demo1.Charactor;

/**
 * Created by yangenneng on 2017-05-03 13:00
 * Abstract:服裝
 */
public class Finery extends Charactor {
    protected Charactor charactor;
    public Finery(Charactor charactor){
        this.charactor=charactor;
    }
    public void show(){
        this.charactor.show();
    }
}
package StructuralPattern.DecoratorPattern.demo1;

/**
 * Created by yangenneng on 2017-05-03 13:02
 * Abstract:T恤
 */
public class TShirt extends Finery {

    public TShirt(Charactor charactor) {
        super(charactor);
    }

    public Charactor decorator(Charactor charactor){
        this.charactor=charactor;
        return charactor;
    }

    public void show(){
        System.out.print("T恤 ");
        super.show();
    }
}
package StructuralPattern.DecoratorPattern.demo1;

/**
 * Created by yangenneng on 2017-05-03 13:03
 * Abstract:領帶
 */
public class Tie extends Finery {

    public Tie(Charactor charactor) {
        super(charactor);
    }

    public Charactor decorator(Charactor charactor){
        this.charactor=charactor;
        return this.charactor;
    }
    public void show(){
        System.out.print("領帶 ");
        super.show();
    }
}
package StructuralPattern.DecoratorPattern.demo1;

/**
 * Created by yangenneng on 2017-05-03 13:03
 * Abstract:西裝
 */
public class Suit extends Finery {

    public Suit(Charactor charactor) {
        super(charactor);
    }

    public Charactor decorator(Charactor charactor){
        this.charactor=charactor;
        return charactor;
    }
    public void show(){
        System.out.print("西裝 ");
        super.show();
    }
}
package StructuralPattern.DecoratorPattern.demo1;

/**
 * Created by yangenneng on 2017-05-03 13:03
 * Abstract:運動鞋
 */
public class Sneaker extends Finery {

    public Sneaker(Charactor charactor) {
        super(charactor);
    }

    public Charactor decorator(Charactor charactor){
        this.charactor=charactor;
        return charactor;
    }
    public void show(){
        System.out.print("運動鞋 ");
        super.show();
    }
}
package StructuralPattern.DecoratorPattern.demo1;

/**
 * Created by yangenneng on 2017-05-03 13:03
 * Abstract:皮鞋
 */
public class LeatherShoe extends Finery {

    public LeatherShoe(Charactor charactor) {
        super(charactor);
    }

    public Charactor decorator(Charactor charactor){
        this.charactor=charactor;
        return charactor;
    }
    public void show(){
        System.out.print("皮鞋 ");
        super.show();
    }
}
package StructuralPattern.DecoratorPattern.demo1;

/**
 * Created by yangenneng on 2017-05-03 13:02
 * Abstract:牛仔褲
 */
public class Jean extends Finery {

    public Jean(Charactor charactor) {
        super(charactor);
    }

    public Charactor decorator(Charactor charactor){
        this.charactor=charactor;
        return charactor;
    }
    public void show(){
        System.out.print("牛仔褲 ");
        super.show();
    }
}
package StructuralPattern.DecoratorPattern.demo1;

/**
 * Created by yangenneng on 2017-05-03 13:02
 * Abstract:客戶端測試
 */
public class Client {
    public static void main(String[] args) {

        //人類
        Human human=new Human("紳士風");
        Orc orc1=new Orc("休閒風");
        Orc orc2=new Orc("混搭風");

        //裝飾服飾

        //紳士風的人類(西裝,領帶,皮鞋)
        Suit suit=new Suit(human);//西裝
        Tie tie=new Tie(suit);//領帶
        LeatherShoe leatherShoe=new LeatherShoe(tie);//皮鞋
        leatherShoe.show();

        //休閒風的獸人(T恤,牛仔褲,運動鞋)
        TShirt tShirt1=new TShirt(orc1);
        Jean jean1=new Jean(tShirt1);
        Sneaker sneaker1=new Sneaker(jean1);
        sneaker1.show();

        //混搭風的獸人(西裝,領帶,牛仔褲,運動鞋)
        Suit suit2=new Suit(orc2);
        Tie tie2=new Tie(suit2);
        Sneaker sneaker2=new Sneaker(tie2);
        sneaker2.show();

    }
}

運行結果

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章