gpt4 book ai didi

java - 如何避免用户代码需要了解和实例化策略模式中的具体策略

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

策略模式将上下文代码和它所使用的策略(或算法或策略)解耦。它比模板模式具有优势,因为它支持动态行为更改并使用委派组合来实现它。下面是这样的例子。

public class Context{
private Policy policy;

public void setPolicy(Policy policy){
this.policy = policy;
}

public performTask(){
policy.apply(); // delegate policy apply to separate class
this.contextualWOrk();
}
}

public interface Policy{
void apply();
}

public class PolicyX{
public void apply(){
//Policy X implementation
}
}

public class PolicyY{
public void apply(){
//Policy Y implementation
}
}

现在使用上面的代码

public class User{
public void init(Context context){
context.setPolicy(new PolicyX());
context.performTask();
}
}

在上面我们看到用户代码必须知道并向上下文提供具体的策略。我们可以使用像工厂方法模式这样的创建模式,但在这种情况下,用户代码仍然必须知 Prop 体的工厂类。这需要用户代码实例化了解此类具体实现的存在。

为了防止这种情况,一个简单的解决方案可以是使用一个静态方法,将输入作为字符串或枚举,并使用“switch-case”或多个“if-else”语句来决定实例化哪个类并向用户代码提供实现。但这又违反了“OCP”,因为添加新类型将需要修改代码。

如何在简单的应用程序中遵循原则(我不确定 Spring 和其他框架的某些配置可能会解决此类问题)。

任何在简单应用程序中解决此问题的提示或要点都会有所帮助。

最佳答案

第 318 页提到了策略模式的这个缺点。

Clients must be aware of different Strategies. The pattern has a potential drawback in that a client must understand how Strategies differ before it can select the appropriate one. Clients might be exposed to implementation issues. Therefore you should use the Strategy pattern only when the variation in behavior is relevant to clients.

正如您所注意到的,策略选择机制可以隐藏在其他代码层后面,或者移动到配置文件中;但仍然必须在某个地方做出潜在的选择。这只是选择应用该模式时需要注意的一个缺点。

关于java - 如何避免用户代码需要了解和实例化策略模式中的具体策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54854363/

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