装饰模式案例

题目:

请用装饰模式(Decorator)为某游戏角色设计换装功能,具体描述如下:

现阶段游戏包含人类(Human)和兽人(Orc)两种角色(Charactor),在将来可能会增加新角色。

现阶段服装(Finery)包含T恤(TShirt),牛仔裤(Jean),运动鞋(Sneaker),西装(Suit),领带(Tie),皮鞋(LeatherShoe)六种,在将来可能会增加新的服装,并且角色服装可以依据用户喜爱自由穿戴。

并搭配出:

绅士风的人类(西装,领带,皮鞋);

休闲风的兽人(T恤,牛仔裤,运动鞋);

混搭风的兽人(西装,领带,牛仔裤,运动鞋)。

题目中角色和服装只需要通过输出语句表示即可,比如:混搭风的兽人(西装,领带,牛仔裤,运动鞋),将输出“运动鞋 牛仔裤 领带 西装 装扮的兽人XXX(名字)”。












类图:



代码:

package 装饰模式;

/*功能上的差别
 一.你在一个地方写装饰,大家就知道这是在增加功能,你写代理,大家就知道是在限制
1.最常见的代理就是权限判断了,权限就肯定是限制了
2.装饰模式是指增强被包装对象的功能
  代理模式是修改被代理对象的行为
结构上的差别
 二、装饰器模式关注于在一个对象上动态的添加方法,然而代理模式关注于控制对对象的访问。
 换句话 说,用代理模式,代理类(proxy class)可以对它的客户隐藏一个对象的具体信息。
 因此,当使用代理模式的时候,我们常常在一个代理类中创建一个对象的实例。并且,当我们
 使用装饰器模式的时候,我们通常的做法是将原始对象作为一个参数传给装饰者的构造器。
我们可以用另外一句话来总结这些差别:使用代理模式,代理和真实对象之间的的关系通常在编译时就已经确定了,
而装饰者能够在运行时递归地被构造。 */   

abstract class Character
{
    protected String name;
    Character(){}
    Character(String name){ this.name = name; }
    public abstract void show();
};

class Human extends Character
{
    Human(String name){ super(name); }
    public void show(){
        System.out.println("装扮的人类 "+this.name);
    }
};

class Orc extends Character
{
    Orc(String name){ super(name); }
    public void show(){
        System.out.println("装扮的兽人 "+this.name);
    }
};

class Finery extends Character
{
    protected Character component = null;
    public void Decorate(Character component){
        this.component = component;
    }
    public void show(){
        if (component != null)
        {
            this.component.show();
        }
    }
};

class TShirts extends Finery
{
    public void show(){
        System.out.print("T恤  ");
        super.show();
    }
};

class Jeans extends Finery
{
    public void show(){
        System.out.print("牛仔裤  ");
        super.show();
    }
};

class Sneaker extends Finery
{
    public void show(){
        System.out.print("运动鞋  ");
        super.show();
    }
};

class Suit extends Finery
{
    public void show(){
        System.out.print("西装   ");
        super.show();
    }
};

class Tie extends Finery
{
    public void show(){
        System.out.print("领带  ");
        super.show();
    }
};

class LeatherShoes extends Finery
{
    public void show(){
        System.out.print("皮鞋  ");
        super.show();
    }
};

class Helmet extends Finery
{
    public void show(){
        System.out.print("狼骨盔  ");
        super.show();
    }
};

class Armour extends Finery
{
    public void show(){
        System.out.print("野熊甲  ");
        super.show();
    }
};

class Cloak extends Finery
{
    public void show(){
        System.out.print("龙鳞披风  ");
        super.show();
    }
};

public class FinerySystem {
    public static void main(String[] args){
        Human hu = new Human("洛萨");
        Orc orc = new Orc("奥格瑞姆");
        TShirts ts = new TShirts();
        Jeans tr = new Jeans();
        Sneaker sn = new Sneaker();
        Suit st = new Suit();
        Tie ti = new Tie();
        LeatherShoes ls = new LeatherShoes();
        Helmet he = new Helmet();
        Armour ar = new Armour();
        Cloak cl = new Cloak();
        
        ts.Decorate(hu);
        ti.Decorate(ts);
        ls.Decorate(ti);
        ls.show();

        st.Decorate(orc);
        ti.Decorate(st);
        tr.Decorate(ti);
        sn.Decorate(tr);
        sn.show();
    }
}

结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值