我在使用设计模式方面很新,目前我正在为我的单元课程做一个小游戏,我必须使用装饰器模式来创建NPC的不同类,但是我想我误解了装饰模式是如何工作的。
目前,NPC类之间的所有变化都是攻击值、健康和速度统计。我真正不确定的是,是否有一种方式将这些值从装饰者传递到装饰对象,或者我对装饰者模式有错误的印象。
发布于 2015-01-03 21:28:50
将装饰器看作是一个具有更多功能的对象的包装。现在这个新对象的内部有一个对象,外部对象赋予它更多的功能。
下面是它的一个小伪表示。
class Watch implements Clock
{
private Clock clockToBeDecorated;
public Watch(Clock clock)
{
clockToBeDecorated = clock;
}
public void StrappToWrist()
{
//strap the watch to your wrist
}
public DateTime GetTime()
{
return clock.GetTime();
}
}
interface Clock
{
DateTime GetTime();
}所以现在我们有了时钟的所有功能,但是我们也可以把它绑在手腕上(就像你期望的那样)。当您希望动态地将对象传递到另一个对象时,这是很好的,因此我们可能希望将该单击放到一个手表或一个PocketWatch等中。
维基百科有一个很好的例子,在中使用滚动中使用滚动Windows,这可能会有所帮助。
发布于 2015-01-03 23:43:32
装饰师有很多用途,但这并不意味着装潢师是适合于每一种情况的模式。给定相同的需求,程序员总是可以尝试在不同的模式中实现相同的需求,以确定哪一个最适合。
在OP的示例中,我认为有一种情况是,attack, health, speed系统可以使用装饰器模式进行扩展。
关于OP的好处,请阅读头第一设计模式中的咖啡调味品装饰图案示例。
我认为有用的情况是:
NPC类,它为getAttack()、getHealth()和getSpeed()提供了基本机制。NPC对象可以获取许多小工具,这些小工具将临时修改获取者的属性。样本代码
(免责声明: C#中的示例代码,而不是C++)
// Just the statistics. We are not claiming that "CaffeinePack" is a character.
interface CharacterStat
{
int getAttack();
int getHealth();
int getSpeed();
}
interface Character : CharacterStat, CharacterPlanner, ...
{
// a bunch of other stuff
}
class NPC : Character
{
public int getAttack() { ... concrete implementation ... }
public int getHealth() { ... concrete implementation ... }
public int getSpeed() { ... concrete implementation ... }
}
class CaffeinePack : CharacterStat
{
private CharacterStat realObject;
public CaffeinePack(CharacterStat realObject) { this.realObject = realObject; }
public int getAttack()
{
return realObject.getAttack();
}
public int getHealth()
{
return (int)(realObject.getHealth() * 0.8);
}
public int getSpeed()
{
return (int)(realObject.getSpeed() * 1.2);
}
}https://softwareengineering.stackexchange.com/questions/267965
复制相似问题