gpt4 book ai didi

typescript - 如何正确实现策略设计模式

转载 作者:行者123 更新时间:2023-12-02 12:42:35 25 4
gpt4 key购买 nike

我正在尝试实现策略设计模式,并且想知道我是否做得正确。

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

  • SimpleFormStrategy
  • 扩展表单策略
  • 自定义表单策略

所以问题是:

  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);
}
}

最佳答案

您提出了 2 个与 TypeScript 没有直接关联的问题。代码可以直接转换为C#/Java等通常主流的OOP语言。它甚至更有趣,因为它涉及设计模式SOLID原则,这都是面向对象编程的支柱。

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

  1. Is it correct to select strategy inside FormBuilder, and not passing strategy from outside?

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

  1. Doesn't this violates open closed principle? So, if I want to add one more form strategy or to remove an existing one, I have to edit the FormBuilder class.

构建器工厂在设计上与底层创建的类型紧密耦合。这是对 OCP 的局部违反,但客户端代码与表单创建实现细节分离。

其他评论

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

关于typescript - 如何正确实现策略设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60107761/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com