我正在尝试实施策略设计模式,并且想知道我是否正确执行了该策略。
可以说,我有FormBuilder
一个使用下面列表中的策略构建表单的类:
SimpleFormStrategy
ExtendedFormStrategy
CustomFormStrategy
所以问题是:
FormBuilder
而不从外部传递策略是否正确?FormBuilder
该类。草稿代码示例
class Form {
// Form data here
}
interface IFormStrategy {
execute(params: object): Form;
}
class SimpleFormStrategy implements IFormStrategy {
public execute(params: object): Form {
// Here comes logics for building simple form
return new Form();
}
}
class ExtendedFormStrategy implements IFormStrategy {
public execute(params: object): Form {
// Here comes logics for building extended form
return new Form();
}
}
class CustomFormStrategy implements IFormStrategy {
public execute(params: object): Form {
// Here comes logics for building custom form
return new Form();
}
}
class FormBuilder {
public build(params: object): Form {
let strategy: IFormStrategy;
// Here comes strategy selection logics based on params
// If it should be simple form (based on params)
strategy = new SimpleFormStrategy();
// If it should be extended form (based on params)
strategy = new ExtendedFormStrategy();
// If it should be custom form (based on params)
strategy = new CustomFormStrategy();
return strategy.execute(params);
}
}
您问了2个未直接链接到TypeScript的问题。该代码可以直接转换为常用的主流OOP语言C#/ Java。它更有趣,因为它既涉及设计模式又涉及SOLID原理,这两个都是面向对象编程的支柱。
在更笼统之前,让我们具体回答一下:
- 在内部选择策略
FormBuilder
而不从外部传递策略是否正确?
是。相反导致FormFactory
包装没有太大兴趣。为什么不直接打电话strategy.execute()
?
- 这不是违反开放封闭原则吗?因此,如果我想增加一种表单策略或删除现有的表单策略,则必须编辑
FormBuilder
该类。
建筑商和工厂通过设计紧密地与下面创建的类型耦合。这是对OCP的局部违反,但是使用它们,客户端代码就与表单创建实现细节分离了。
其他评论
IFormStrategy
首先是一个(摘要)厂:它创建一个Form
。更好的名称应该是IFormFactory { create(...): Form; }
(或者只是FormFactory
,“ I”前缀在C#中比在TypeScript中更常见)。这是战略,FormBuilder
但不是内在的。顺便说一下,命名类时很少使用“策略”一词,因为它太通用了。最好使用更具体/明确的术语。formBuilder.withPartA().withPartB().build();
。此类根据输入的参数选择适当的工厂/策略。这是一个策略选择器,或者是Factory:D工厂,它也调用工厂来最终创建Form
。也许做的太多:仅选择工厂就足够了。也许合适,从客户端代码中隐藏了复杂性。interface
/定义高阶函数,type
但没有包装对象/ class可能不会带来更多价值。客户端代码只需传递另一个函数即可,该函数可以是“简单lambda”(胖箭头函数)。params
生成器和工厂都使用参数。最好将其拆分,以避免混淆不同的关注点:策略选择和表单创建。createSimpleForm(simpleFormArgs)
,createExtendedForm(extendsFormArgs)
...每个方法将实例化关联的工厂并称之为create(formArgs)
方法。这样,不需要基于if
s或switch
s的复杂算法来选择策略,这会增加环复杂性。调用每个createXxxForm
方法也将更简单,而object参数则更少。本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句