首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不确定装潢师的设计模式

不确定装潢师的设计模式
EN

Software Engineering用户
提问于 2015-01-03 21:14:17
回答 2查看 698关注 0票数 1

我在使用设计模式方面很新,目前我正在为我的单元课程做一个小游戏,我必须使用装饰器模式来创建NPC的不同类,但是我想我误解了装饰模式是如何工作的。

目前,NPC类之间的所有变化都是攻击值、健康和速度统计。我真正不确定的是,是否有一种方式将这些值从装饰者传递到装饰对象,或者我对装饰者模式有错误的印象。

EN

回答 2

Software Engineering用户

回答已采纳

发布于 2015-01-03 21:28:50

将装饰器看作是一个具有更多功能的对象的包装。现在这个新对象的内部有一个对象,外部对象赋予它更多的功能。

下面是它的一个小伪表示。

代码语言:javascript
运行
复制
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,这可能会有所帮助。

票数 4
EN

Software Engineering用户

发布于 2015-01-03 23:43:32

装饰师有很多用途,但这并不意味着装潢师是适合于每一种情况的模式。给定相同的需求,程序员总是可以尝试在不同的模式中实现相同的需求,以确定哪一个最适合。

在OP的示例中,我认为有一种情况是,attack, health, speed系统可以使用装饰器模式进行扩展。

关于OP的好处,请阅读头第一设计模式中的咖啡调味品装饰图案示例。

  • http://www.coderanch.com/t/99387/patterns/HeadFirst-Design-Patterns-Decorator-Chapter

我认为有用的情况是:

  • 已经有一个底层的NPC类,它为getAttack()getHealth()getSpeed()提供了基本机制。
  • NPC对象可以获取许多小工具,这些小工具将临时修改获取者的属性。

样本代码

(免责声明: C#中的示例代码,而不是C++)

代码语言:javascript
运行
复制
// 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);
    }
}
票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/267965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档