工作常用|Java 模式思想 - 策略模式(异同工厂)

一、概述: 策略模式中,一个类的行为或其算法可以在运行时更改,这种类型的设计模式属于行为型模式。
在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的context对象。策略对象改变 context 对象的执行算法。
意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
主要解决:在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。
何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。
如何解决:将这些算法封装成一个一个的类,任意地替换。
关键代码:实现同一个接口。
优点:算法可以自由切换、避免使用多重条件判断、扩展性良好。
缺点:策略类会增多,所有的策略类都需要对外暴露。
使用场景: 1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 2、一个系统需要动态地在几种算法中选择一种。 3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
注意事项:如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。
二、实现 我们将创建一个定义活动的Strategy 接口和实现了Strategy 接口的实体策略类。context 是一个使用了某种策略的类StrategyPatternDemo,我们的演示类使用Context和策略队形来演示 Context 在它所配置或使用的策略改变时的行为变化。
工作常用|Java 模式思想 - 策略模式(异同工厂)
文章图片

三、例子: 1、创建一个接口。
Strategy.java

public interface Strategy { public int doOperation(int num1, int num2); }

【工作常用|Java 模式思想 - 策略模式(异同工厂)】2、创建实现接口的实体类
OperationAdd.java
public class OperationAdd implements Strategy{ @Override public int doOperation(int num1, int num2) { return num1 + num2; } }

OperationSubtract.java
public class OperationSubtract implements Strategy{ @Override public int doOperation(int num1, int num2) { return num1 - num2; } }

OperationMultiply.java
public class OperationMultiply implements Strategy{ @Override public int doOperation(int num1, int num2) { return num1 * num2; } }

3、创建Context 类
Context.java
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); } }

4、使用context 来查看当它改变策略 Strategy 时的行为变化。
StrategyPatternDemo.java
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 OperationSubtract()); System.out.println("10 - 5 = " + context.executeStrategy(10, 5)); context = new Context(new OperationMutiply()) System.out.println("10 * 5" + context.executeStrategy(10.5));

}
}
注意:策略模式和工厂模式很容易混淆,其不同点为
1、关注点不一样,工厂模式关注对象创建,策略模式关注行为封装
2、解决的问题不一样,工厂模式时创建型的设计模式,它接受指令,创建出符合要求的实例,主要解决资源的统一分发,对象的创建完全独立出来。(让对象的创建和具体的使用客户无关,主要应用于多数据库的选择,类库文件加载等)
策略模式是行为模式,定义策略族,分别封装起来,让他们之间可以互相替换,策略模式让策略的变化独立于使用策略的用用户。
参考:https://www.runoob.com/design-pattern/strategy-pattern.html

    推荐阅读