gpt4 book ai didi

java - 理解装饰器设计模式

转载 作者:行者123 更新时间:2023-11-30 06:14:10 33 4
gpt4 key购买 nike

我在理解装饰器设计模式时遇到问题。假设我想在我的项目中使用它。这是一款平台游戏,所以我立即想到最好的用途是敌人类别。我想要不同类型的敌人,基本的敌人和其他类型的敌人,它们将是第一个敌人的延伸(例如具有不同的属性、颜色、额外的人工智能逻辑)。根据我的理解,这就是类应该是什么样的

abstract class Enemy{

float speedX,speedY;
int x,y,width,height;
COLOR colour;
Sprite sprite;

void setAnimation();
void update();
void render();
void init();

}


class EnemyBasic extends Enemy{

EnemyBasic() {
init();
}

void init() {
//set all variables
}
@Override
void setAnimation() {
//set animation
}

@Override
public void update() {
//update
}

@Override
public void render() {
render(sprite,colour,x,y,width,height)

}
}

class FastEnemy extends Enemy{

Enemy basicEnemy;
FastEnemy(Enemy basicEnemy) {
this.basicEnemy = basicEnemy;
init();
}

void init() {
basicEnemy.init();
maximalSpeed = basicEnemy.maximalSpeed*2;
}
@Override
void setAnimation() {
basicEnemy.setAnimation();
}

@Override
public void update() {
basicEnemy.update();
additionalMovementLogic();
}

additionalMovementLogic(){
}

@Override
public void render() {
color=green;
basicEnemy.render()

}
}

问题是,这不起作用,因为来自 basicEnemy 对象的方法调用将在 EnemyBasic 字段上操作,而不是在 EnemyFast 字段上操作。因此,例如 render() 将渲染 EnemyBasic 对象而不是 EnemyFast。我能看到的唯一解决方案是重新实现整个类,但是装饰器类的意义何在?我理解错了吗?或者在这种情况下不应该使用装饰器?如果是这样,什么时候应该使用它

最佳答案

在当前形式中,这看起来不像是装饰器模式的良好用例,因为它需要改变 basicEnemy 的内部行为。我可以想到以下解决方案:

  • 创建 getter 和 setter(即速度、颜色)
  • 将渲染提取到单独的类中

这样渲染器就可以获取修饰值,例如:

  1. 渲染器要求速度。
  2. 装饰器在 basicEnemy 上调用 getSpeed() 并将其乘以 2。
  3. 渲染器处理渲染逻辑。

关于java - 理解装饰器设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49599500/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com