装饰模式(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();

    }
}

运行结果

这里写图片描述

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