Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 基于请求的actions系统的设计模式和策略是什么[C#,PHP]_Design Patterns_Oop - Fatal编程技术网

Design patterns 基于请求的actions系统的设计模式和策略是什么[C#,PHP]

Design patterns 基于请求的actions系统的设计模式和策略是什么[C#,PHP],design-patterns,oop,Design Patterns,Oop,我正在做一个类似流氓的游戏,我想把每个实体的逻辑模块化。这可能适用于存在角色和权限控制的web应用程序 我们的想法是有这样的东西-我们在游戏中有不同类型的实体。门可以推倒,石墙不能推倒。比如说,逻辑模块可以是一个名为Bashable的类 public interface IBashable { bool ProcessRequest(CharacterInfo character); string GetOutput(); virtual int GetOutcome()

我正在做一个类似流氓的游戏,我想把每个实体的逻辑模块化。这可能适用于存在角色和权限控制的web应用程序

我们的想法是有这样的东西-我们在游戏中有不同类型的实体。门可以推倒,石墙不能推倒。比如说,逻辑模块可以是一个名为Bashable的类

public interface IBashable
{
    bool ProcessRequest(CharacterInfo character);
    string GetOutput();
    virtual int GetOutcome();
}
因此,在对象上添加易读界面的门可能会被砸碎。ProcessReques()将使用一些规则来确定角色是否能够做到这一点(可能是强度检查)

没有IBashable接口的对象不能被猛击打开。问题是——假设一扇门添加了多个逻辑组件。我想做的是提交这样的请求

// Conan is derived from CharacterInfo class
BashDoorRequest request = new BashDoorRequest(conan);
Door d;
BashLogic bash;
PickLockLogic pick;
d.addLogic(bash);
d.addLogic(pick);

// Assuming the signature is processRequest(IRequest, where all request derived from)
d.processRequest(request)
问题是-如何添加要激活的getmodules?这是一个BashDoor请求,而不是PickLockRequest,因此只有BashDoor逻辑才会运行

我有两个想法——一个是使用访问者模式,但这意味着添加了相当多的类。另一个是为每个reach模块和动作设置标签或ID。例如,bash逻辑可能有一个“bash”标记。也许我有两种猛击逻辑——一种是允许玩家猛击门,另一种是可能的,它可以减少任何人猛击门的生命,因为门被钉住了

因此,我必须激活两个逻辑模块进行bashing,并且pick lock逻辑不应该运行。我应该有一个标记的hashamp,并根据has对每个逻辑进行分组吗

这也适用于地形;说人物不能在水中移动。水实体只添加了ICannotWalk through逻辑,但添加了ISwimmable逻辑。那么,如何只检查ICannotWalk模块而不浪费时间检查iWimmable逻辑呢

我面临的另一个问题是,请求对象可能需要考虑多个参数,但传入哈希表来表示参数对我来说是一种过火的行为。更不用说一些逻辑模块可能会采用不同的参数。(例如,门是锁着的,需要一把特殊的钥匙才能打开。这项请求也包括角色的清单,而不是角色信息。除非我将整个清单、角色的统计信息和所有信息传递给请求


任何关于如何实现该系统的想法都将受到欢迎。

也许命令分派器模式可以帮助您了解-您所调用的请求本质上是一个命令。每个对象都可以维护一个命令操作列表,当传入命令时,尝试匹配每个命令根据可用的命令操作列表

命令的有效调度通常是一个挑战-尤其是当对象可以响应许多不同的命令时。有几种不同的方法可以潜在地解决性能问题:

  • 使用字典根据两个命令共享的键将每个命令与其操作相匹配
  • 使用命令范围分组可根据关键点范围缩小对操作的搜索范围
  • 为每个命令分配一个唯一的数字ID,并对有序集合使用二进制搜索来查找操作
  • 如果一个命令可以响应多个操作,请将它们链接在一起
  • 使用特定的方法发送常用命令,而不是使用一般的ProcessRequest()方法