众所周知,造梦西游3有四个角色,也就是师徒四人,这师徒四人每个人都有自己专属的武器和装备。假定我们以及设计出来了Role(角色类),并通过继承的方式创造出来了师徒四人的角色(这里只写两个)。

那么这时候问题来了,如果给角色增加一个武器,该怎么实现呢》
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FmLn58Qi-1668959273768)(https://gitee.com/you-tanzhi/pic/raw/master/u=846442474,698297682&fm=253&fmt=auto&app=138&f=JPEG)]](https://1000bd.com/contentImg/2024/04/20/694568b52b768eb7.png)
我想你头脑中第一印象会想到继承
如下,创建两个武器九尺钉耙和金箍棒


这样九尺钉耙和金箍棒就和角色联系起来了,这时候你可以很清晰的发现,如果在增加一个武器,如月牙弓,你就需要分别创建两个子类。如果再增加一个新角色,如沙僧的话,又要增加更多的子类,这实在是太麻烦。就在你疑惑不解,大骂恶心的时候,我们本篇文章的主角装饰者模式闪亮登场了。
装饰者模式:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式。
装饰者模式有四个角色:

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());
}
}

在本例子中,指的就是把装备类删掉,并不影响原有的代码。
在本例子中,指的就是把装备类删掉,并不影响原有的代码。