java策略模式的context_此Java策略模式是否具有冗余的Context类?

以下代码示例是从Wikipedia复制的Strategy模式的实现.我的完整问题是......

Wiki的main方法:

//StrategyExample test application

class StrategyExample {

public static void main(String[] args) {

Context context;

// Three contexts following different strategies

context = new Context(new ConcreteStrategyAdd());

int resultA = context.executeStrategy(3,4);

context = new Context(new ConcreteStrategySubtract());

int resultB = context.executeStrategy(3,4);

context = new Context(new ConcreteStrategyMultiply());

int resultC = context.executeStrategy(3,4);

}

}

图案件:

// The classes that implement a concrete strategy should implement this

// The context class uses this to call the concrete strategy

interface Strategy {

int execute(int a, int b);

}

// Implements the algorithm using the strategy interface

class ConcreteStrategyAdd implements Strategy {

public int execute(int a, int b) {

System.out.println("Called ConcreteStrategyA's execute()");

return a + b; // Do an addition with a and b

}

}

class ConcreteStrategySubtract implements Strategy {

public int execute(int a, int b) {

System.out.println("Called ConcreteStrategyB's execute()");

return a - b; // Do a subtraction with a and b

}

}

class ConcreteStrategyMultiply implements Strategy {

public int execute(int a, int b) {

System.out.println("Called ConcreteStrategyC's execute()");

return a * b; // Do a multiplication with a and b

}

}

// Configured with a ConcreteStrategy object and maintains a reference to a Strategy object

class Context {

private Strategy strategy;

// Constructor

public Context(Strategy strategy) {

this.strategy = strategy;

}

public int executeStrategy(int a, int b) {

return strategy.execute(a, b);

}

}

具体考虑上面的例子,Context类是多余的吗?

例如,我可以main通过使用除Context之外的现有类和接口来提出以下替代实现,它将完全相同.它仍然松散耦合.

((编辑:在这个简单的场景中,当我忽略Context类时,我是否会犯下未来的错误?))

public static void main(String[] args) {

IStrategy strategy;

// Three strategies

strategy = new ConcreteStrategyAdd();

int resultA = strategy.executeStrategy(3,4);

strategy = new ConcreteStrategySubtract();

int resultB = strategy.executeStrategy(3,4);

strategy = new ConcreteStrategyMultiply();

int resultC = strategy.executeStrategy(3,4);

}

摘要更新

以点的形式列出通过答案和评论发现的内容:

上下文允许改变合成策略的使用方式(例如,呼叫的时间).在调用给定策略之前和之后,不同的上下文可能会执行不同的内部工作.

背景是一个高级别的"黑匣子".上下文逻辑可以更改,合成策略也可以更改(或使用不同的策略)而不会破坏客户端,因为客户端只了解如何调用上下文.

即使我通过省略上下文创建了维基百科示例代码的替代实现,虽然它与原始版本的工作方式相同,但整个情况都得到了简化(在这两种情况下)并且我的更改实际上意味着:1.它不是策略模式了,我想念这里提到的战略模式精神的好处.

我的替代实现使用了像Context这样的main方法,所以如果有效地模拟它,我也可以保留Context.通过创建不纯的策略模式,创建了混乱.我不需要重新发明轮子或尝试更聪明(在这种情况下).

如果任何其他点是有用的或如果需要更正留下评论,我将相应地修改列表.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值