众所周知,造梦西游3有四个角色,也就是师徒四人,这师徒四人每个人都有自己专属的武器和装备。假定我们以及设计出来了Role(角色类),并通过继承的方式创造出来了师徒四人的角色(这里只写两个)。
那么这时候问题来了,如果给角色增加一个武器,该怎么实现呢》
我想你头脑中第一印象会想到继承
如下,创建两个武器九尺钉耙和金箍棒
这样九尺钉耙和金箍棒就和角色联系起来了,这时候你可以很清晰的发现,如果在增加一个武器,如月牙弓,你就需要分别创建两个子类。如果再增加一个新角色,如沙僧的话,又要增加更多的子类,这实在是太麻烦。就在你疑惑不解,大骂恶心的时候,我们本篇文章的主角装饰者模式闪亮登场了。
装饰者模式:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式。
装饰者模式有四个角色:
Role.java
public abstract class Role {/* 攻击力 */private float aggressivity;/* 描述 */private String explain;/* 计算攻击力的方法 */public abstract float calculate();public Role(float aggressivity, String explain) {this.aggressivity = aggressivity;this.explain = explain;}public float getAggressivity() {return aggressivity;}public void setAggressivity(float aggressivity) {this.aggressivity = aggressivity;}public String getExplain() {return explain;}public void setExplain(String explain) {this.explain = explain;}
}
Equipment.java
public abstract class Equipment extends Role{/* 角色的变量 */Role role;public Equipment(float aggressivity, String explain, Role role) {super(aggressivity, explain);this.role = role;}public Role getRole() {return role;}public void setRole(Role role) {this.role = role;}
}
Wukong.java
public class WuKong extends Role{public WuKong() {super(150, "孙悟空");}public float calculate() {return getAggressivity();}
}
Bajie.java
public class BaJie extends Role{public BaJie() {super(80, "猪八戒");}public float calculate() {return getAggressivity();}
}
GoldHoopRod.java
public class GoldHoopRod extends Equipment{public GoldHoopRod(Role role) {super(90, "金箍棒", role);}public float calculate() {return getAggressivity()+role.calculate();}public String getExplain() {return super.getExplain()+role.getExplain();}
}
NineToothRake.java
public class NineToothRake extends Equipment{public NineToothRake(Role role) {super(60, "九尺钉耙", role);}public float calculate() {return getAggressivity()+role.calculate();}public String getExplain() {return super.getExplain()+role.getExplain();}
}
Player.java
package com.you.Demo19;public class Player {public static void main(String[] args) {Role role = new WuKong();System.out.println("原始的角色:"+role.getExplain()+" 的战斗力 "+role.getAggressivity());System.out.println("---------------------------");/* 猴哥拿起金箍棒的战斗力 */role = new GoldHoopRod(role);System.out.println(role.getExplain()+" "+role.calculate());/* 猴哥拿起九尺钉耙+金箍棒的战斗力 */role = new NineToothRake(role);System.out.println("---------------------------");System.out.println(role.getExplain()+" "+role.calculate());/* 猪八戒拿起支持钉耙~战斗力 */System.out.println("----------------------------");Role role1 = new BaJie();role1 = new NineToothRake(role1);System.out.println(role1.getExplain()+" "+role1.calculate());}
}
在本例子中,指的就是把装备类删掉,并不影响原有的代码。
在本例子中,指的就是把装备类删掉,并不影响原有的代码。