策略模式之Java版本

it2023-02-09  47

定义

策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们可以互相替换。策略模式让算法独立于使用它的客户而独立变化。

使用场景

Head First中提到的不同鸭子不同飞行和呱呱叫行为时;飞机、火车、汽车等出行方式,每一种出行方式都是一个策略;诸葛亮的锦囊妙计,每一个锦囊也就是一个策略;商场打折,买2送1、买1件打88折等促销方式,不用的算法(策略);出现同一抽象类有多个子类,而又需要使用if-else或者switch-case来选择具体子类时;··· 总的来说,可以这么理解,使用继承违背常理(狗继承动物,让它飞就太天真了)时,使用实现繁琐(猴鸡狗猪都会叫,他们都各自实现叫的方法太累了)时,此时可以考虑组合(也就是策略模式的表现形式)

设计原则

找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起;针对接口编程,而不是针对实现编程;开闭原则:对扩展开放、对修改关闭。

UML类图

Context:用来操作策略的上下文环境; Stragety:策略的抽象; ConcreteStragetyA、ConcreteStragetyB:具体的策略实现。

代码实现

public interface Strategy { int doOperation(int num1, int num2); } public class OperationAdd implements Strategy{ @Override public int doOperation(int num1, int num2) { return num1 + num2; } } public class OperationSubstract implements Strategy{ @Override public int doOperation(int num1, int num2) { return num1 - num2; } } public class OperationMultiply implements Strategy{ @Override public int doOperation(int num1, int num2) { return num1 * num2; } } public class Context { private Strategy strategy; public Context(Strategy strategy){ this.strategy = strategy; } public int executeStrategy(int num1, int num2){ return strategy.doOperation(num1, num2); } } public class StrategyPatternDemo { public static void main(String[] args) { Context context = new Context(new OperationAdd()); System.out.println("10 + 5 = " + context.executeStrategy(10, 5)); context = new Context(new OperationSubstract()); System.out.println("10 - 5 = " + context.executeStrategy(10, 5)); context = new Context(new OperationMultiply()); System.out.println("10 * 5 = " + context.executeStrategy(10, 5)); } }

日志打印

10 + 5 = 15 10 - 5 = 5 10 * 5 = 50

总结

策略模式很好的展示了开闭原则,通过定义抽象,注入不同的实现,从而达到很好的扩展性。

优点:

结构清晰明了、使用简单直接;耦合度相对较低,扩展性好;操作封装也更为彻底,数据更为安全。

缺点: 策略类会增多,并且所有策略类都需要对外暴露。

最新回复(0)