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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.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 具有用户可扩展类的框架设计?_Design Patterns_Architecture - Fatal编程技术网

Design patterns 具有用户可扩展类的框架设计?

Design patterns 具有用户可扩展类的框架设计?,design-patterns,architecture,Design Patterns,Architecture,考虑以下类图: ModelA和ModelB是框架类,MyModelA和MyModelB是框架用户定义的类 继续方法由框架使用,并由用户实现。显然,实现可以使用ModelA的方法 用户应该可以优化ModelA类,例如添加额外的数据记录,并将扩展类MyModelA的对象传递给框架以使用 现在的问题是如何设计框架,以便继续的实现也可以使用MyModelA的方法,在本例中是getMyValue 是否有解决此问题的标准设计模式 以下可能的解决方案也可以澄清问题: 1.铸造 如果框架的用户知道他正在使用哪个

考虑以下类图:

ModelA和ModelB是框架类,MyModelA和MyModelB是框架用户定义的类

继续方法由框架使用,并由用户实现。显然,实现可以使用ModelA的方法

用户应该可以优化ModelA类,例如添加额外的数据记录,并将扩展类MyModelA的对象传递给框架以使用

现在的问题是如何设计框架,以便继续的实现也可以使用MyModelA的方法,在本例中是getMyValue

是否有解决此问题的标准设计模式

以下可能的解决方案也可以澄清问题:

1.铸造 如果框架的用户知道他正在使用哪个ModelA类,他可以在继续实现中将ModelA参数转换为正确的类型。 这肯定有点笨重而且不干净

2.使用模板参数 为了保持类型安全,可以使用用于参数化ModelB的类型参数来参数化框架。在Java中:

公共类模型B{ 公开摘要作废处理数据; } 通过这种方式,可以根据需要执行以下操作:

公共类MyModelB扩展了ModelB{ 公共抽象void proceedMyModelA数据{ data.getMyValue; } } 但是这可能会变得非常不方便,特别是当更多的类出现同样的问题时,并且必须引入多个类型参数。 此外,它似乎不是很灵活

3.在ModelA中提供基本数据模型[有限] 当只希望用户能够向ModelA添加自定义数据时,提供灵活的数据存储系统是一个相当大的解决方案吗

示例:树字典,即可以存储标准数据类型的键值对,并使用多级键对它们进行索引:data.getString[水果、苹果、小]

更新1 为了澄清要求是什么:
设想ModelA代表游戏玩家,ModelB代表玩家可以执行的一些动作。该框架定义了一个通用的player类和一个抽象的procedure方法。使用该框架的应用程序在MyModelA中添加了可用于MyModelB中的操作的播放器功能。操作不是由应用程序直接调用的,而是由框架调用的,例如,应用程序调度调用。

真正需要定义的是什么

公共抽象类ModelB { 公开摘要无效程序模式a; } 不是

公共抽象类ModelB { 公开摘要无效; } 如果您实际上没有在基类ModelB中使用ModelA

就是这样,它可能看起来像:

命令式解决方案

公共抽象类ModelB { 公开摘要无效; } 公共类MyModelB:ModelB { //通过构造函数注入 私有只读MyModelA\u a; 公开无效进行 { //用手指做某事 } } 或

公共抽象类ModelB { 公开摘要无效程序模式a; 受保护的抽象模型a ModelA{get;} } 公共类MyModelB:ModelB { //通过构造函数注入 私有只读MyModelA\u a; 公开无效进行 { //用手指做某事 } 受保护的覆盖模型A模型A { 获取{return\u a;} } } 以这种方式思考,看看命令模式:

公共抽象类命令 { 公开摘要无效运行; 公共抽象模型参数{get;} } 公共抽象类ModelB { //不抽象 公共void ProceedCommand命令 { 命令。运行; } } 好的,如果你真的必须这样做,我认为安全铸造是最好的解决方案:

安全浇铸

公共类MyModelB:ModelB { 公共覆盖无效过程模型a { 如果a是MyModelA { var myA=MyModelA a; //带着一个微笑做某事 } } }
是否有必要将ModelA对象作为参数传递,或者它是否可以作为ModelB类的关联存在?那么你就不必关心所有这些了。框架保留了多个ModelA对象,它们实际上是MyModelA。框架的用户使用不同的ModelA对象编写不同的ModelB实现,框架调用这些实现的方法。所以这个参数对我来说是必要的,或者你能进一步解释你的意思吗?我在问题中添加了信息。我不知道我是否明白你的意思。你认为这仍然适用于我的更新吗?