题目:
请用装饰模式(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();
}
}
结果: