策略模式
1.策略模式的定义:
定义一系列的算法,把它们一个个封装起来,并且使它们可互相替换。本模式使得算法可独立于使用它的客户而变化。
2.策略模式的结构和说明:
Strategy: 策略接口,用来约束一些列具体的策略算法。Context使用这个接口来调用具体的策略实现定义的算法。
ConcreteStrategy: 具体的策略实现,也就是具体的算法实现。
Context: 上下文,负责和具体的策略类交互,通常上下文会持有一个真正的策略实现,上下文还可以让具体的策略类来获取上下文的数据,甚至让具体的策略类来回调上下文的方法。
3.模式实现
ConcreteStrategyA.java
Context.java
Client.java
运行结果:
ConcreteStrategyA--algorithmInterface()
ConcreteStrategyB--algorithmInterface()
4.思考策略模式
A,策略模式的本质:分离算法,选择实现
B,何时选用策略模式,建议在以下情况中选用:
1), 出现有许多相关的类,仅仅是行为有差别的情况下,可以使用策略模式来使用多个行为中的一个来配置一个类的方法,实现算法动态切换。
2), 出现同一个算法,有很多不同实现的情况下,可以使用策略模式来把这些"不同的实现"实现成为一个算法的类层次。
3), 需要封装算法中,有与算法相关数据的情况下,可以使用策略模式来避免暴露这些跟算法相关的数据结构。
4), 出现抽象一个定义了很多行为的类,并且是通过多个if-else语句来选择这些行为的情况下,可以使用策略模式来代替这些条件语句。
定义一系列的算法,把它们一个个封装起来,并且使它们可互相替换。本模式使得算法可独立于使用它的客户而变化。
2.策略模式的结构和说明:
Strategy: 策略接口,用来约束一些列具体的策略算法。Context使用这个接口来调用具体的策略实现定义的算法。
ConcreteStrategy: 具体的策略实现,也就是具体的算法实现。
Context: 上下文,负责和具体的策略类交互,通常上下文会持有一个真正的策略实现,上下文还可以让具体的策略类来获取上下文的数据,甚至让具体的策略类来回调上下文的方法。
3.模式实现
Strategy.java
package com.java.pattern.strategy;
/**
* 策略,定义算法的接口
*/
public interface Strategy {
// 某个算法的接口,可以有传入参数,也可以有返回值
public void algorithmInterface();
}
ConcreteStrategyA.java
package com.java.pattern.strategy;
/**
* 实现具体的算法
*/
public class ConcreteStrategyA implements Strategy {
public void algorithmInterface() {
// 具体的算法实现
System.out.println("ConcreteStrategyA--algorithmInterface()");
}
}
ConcreteStrategyB.java
package com.java.pattern.strategy;
/**
* 实现具体的算法
*/
public class ConcreteStrategyB implements Strategy {
public void algorithmInterface() {
// 具体的算法实现
System.out.println("ConcreteStrategyB--algorithmInterface()");
}
}
ConcreteStrategyC.java
package com.java.pattern.strategy;
/**
* 实现具体的算法
*/
public class ConcreteStrategyC implements Strategy {
public void algorithmInterface() {
// 具体的算法实现
System.out.println("ConcreteStrategyC--algorithmInterface()");
}
}
Context.java
package com.java.pattern.strategy;
/**
* 上下文对象,通常会持有一个具体的策略对象
*
*/
public class Context {
// 持有一个具体的策略对象
public Strategy strategy;
/**
* 构造方法,传入一个具体的策略对象
*
* @param strategy 具体的策略对象
*/
public Context(Strategy strategy) {
this.strategy = strategy;
}
/**
* 上下文对客户端提供的操作接口,可以有参数和返回值
*/
public void contextInterface() {
// 通常会转调具体的策略对象进行算法运算
strategy.algorithmInterface();
}
}
Client.java
package com.java.pattern.strategy;
/**
* 客户端
*/
public class Client {
public static void main(String[] args) {
// 创建具体的策略实现对象ConcreteStrategyA
Strategy strategyA = new ConcreteStrategyA();
Context contextA = new Context(strategyA);
contextA.contextInterface();
// 创建具体的策略实现对象ConcreteStrategyB
Strategy strategyB = new ConcreteStrategyB();
Context contextB = new Context(strategyB);
contextB.contextInterface();
}
}
运行结果:
ConcreteStrategyA--algorithmInterface()
ConcreteStrategyB--algorithmInterface()
4.思考策略模式
A,策略模式的本质:分离算法,选择实现
B,何时选用策略模式,建议在以下情况中选用:
1), 出现有许多相关的类,仅仅是行为有差别的情况下,可以使用策略模式来使用多个行为中的一个来配置一个类的方法,实现算法动态切换。
2), 出现同一个算法,有很多不同实现的情况下,可以使用策略模式来把这些"不同的实现"实现成为一个算法的类层次。
3), 需要封装算法中,有与算法相关数据的情况下,可以使用策略模式来避免暴露这些跟算法相关的数据结构。
4), 出现抽象一个定义了很多行为的类,并且是通过多个if-else语句来选择这些行为的情况下,可以使用策略模式来代替这些条件语句。