如何正确实施策略设计模式

芙蓉花

我正在尝试实施策略设计模式,并且想知道我是否正确执行了该策略。

可以说,我有FormBuilder一个使用下面列表中的策略构建表单的类:

  • SimpleFormStrategy
  • ExtendedFormStrategy
  • CustomFormStrategy

所以问题是:

  1. 在内部选择策略FormBuilder而不从外部传递策略是否正确
  2. 这不是违反开放封闭原则吗?因此,如果我想增加一种表单策略或删除现有的表单策略,则必须编辑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);
    }
}
罗曼·德诺(Romain Deneau)

您问了2个未直接链接到TypeScript的问题。该代码可以直接转换为常用的主流OOP语言C#/ Java。它更有趣,因为它既涉及设计模式涉及SOLID原理,这两个都是面向对象编程的支柱

在更笼统之前,让我们具体回答一下:

  1. 在内部选择策略FormBuilder而不从外部传递策略是否正确

是。相反导致FormFactory包装没有太大兴趣。为什么不直接打电话strategy.execute()

  1. 这不是违反开放封闭原则吗?因此,如果我想增加一种表单策略或删除现有的表单策略,则必须编辑FormBuilder该类。

建筑商工厂通过设计紧密地与下面创建的类型耦合。这是对OCP的局部违反,但是使用它们,客户端代码就与表单创建实现细节分离了。

其他评论

  • 设计模式
    • 必须从上下文(客户代码,甚至是业务域)中找到每个设计模式,而不是从头开始。该书很少使用设计模式,但必须进行调整以适合上下文,并且可以混合在一起。
    • IFormStrategy首先是一个(摘要):它创建一个Form更好的名称应该是IFormFactory { create(...): Form; }(或者只是FormFactory,“ I”前缀在C#中比在TypeScript中更常见)。这是战略FormBuilder但不是内在的。顺便说一下,命名类时很少使用“策略”一词,因为它太通用了。最好使用更具体/明确的术语。
    • FormBuilder并不是一个应该按部就可以创建对象构建器,通常使用诸如的流畅API formBuilder.withPartA().withPartB().build();此类根据输入的参数选择适当的工厂/策略这是一个策略选择器,或者是Factory:D工厂,它也调用工厂来最终创建Form也许做的太多:仅选择工厂就足够了。也许合适,从客户端代码中隐藏了复杂性。
  • OOP +设计模式与TypeScript中的函数式编程
    • 功能语言中的策略就是功能。TypeScript允许使用interface/定义高阶函数,type但没有包装对象/ class可能不会带来更多价值。客户端代码只需传递另一个函数即可,该函数可以是“简单lambda”(胖箭头函数)。
  • 杂项
    • params生成器工厂都使用参数最好将其拆分,以避免混淆不同的关注点:策略选择表单创建
    • 如果要创建的表单类型(简单,扩展,自定义)不是动态的,但已从客户端代码端得知,则最好直接提供3个带有特定参数的方法:createSimpleForm(simpleFormArgs)createExtendedForm(extendsFormArgs)...每个方法将实例化关联的工厂并称之为create(formArgs)方法。这样,不需要基于ifs或switchs的复杂算法来选择策略,这会增加环复杂性调用每个createXxxForm方法也将更简单,而object参数则更少。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

正确实施过滤器(标准)设计模式

来自分类Dev

如何正确实施iAd

来自分类Dev

我需要更改什么才能正确实施SOLID设计?

来自分类Dev

如何正确实施免费产品?

来自分类Dev

如何正确实施Error :: Cause?

来自分类Dev

如何正确实施Angular Guard?

来自分类Dev

如何正确实施免费产品?

来自分类Dev

如何正确实施Apache重写规则?

来自分类Dev

我如何正确实施快速排序?

来自分类Dev

如何与策略设计模式互动

来自分类Dev

正确实施MVVM

来自分类Dev

如何正确实施.net标准库的单元测试

来自分类Dev

如何使用PyTorch正确实施数据重组?

来自分类Dev

如何检查CNN模型是否正确实施?

来自分类Dev

警告:Ansible评估裸变量。如何正确实施?

来自分类Dev

如何正确实施电子邮件意图

来自分类Dev

MVVM –正确实施模型

来自分类Dev

策略设计模式

来自分类Dev

策略设计模式

来自分类Dev

实施不同存储策略的模式

来自分类Dev

在MVVM架构模式中正确实施本地化

来自分类Dev

实施工厂设计模式时如何避免“ instanceof”?

来自分类Dev

正确的状态模式实施

来自分类Dev

如何正确实现存储库模式?

来自分类Dev

工厂设计模式实施的疑问

来自分类Dev

如何使用静态方法作为策略设计模式的默认参数?

来自分类Dev

如何使用静态方法作为策略设计模式的默认参数?

来自分类Dev

如何选择正确的架构/设计模式

来自分类Dev

正确实施单元测试