设计模式之策略模式
策略模式
它定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。
//提供一个算法的通用接口
interface Strategy{
void Algorithm();
}
//具体算法的不同实现
class StrategyA implements Strategy{
@Override
public void Algorithm() {
System.out.println("算法A的具体实现");
}
}
class StrategyB implements Strategy{
@Override
public void Algorithm() {
System.out.println("算法B的具体实现");
}
}
class StrategyC implements Strategy{
@Override
public void Algorithm() {
System.out.println("算法C的具体实现");
}
}
//通过创建Context对象来创建不同的算法对象
class Context{
Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
//根据不同的算法对象调用其算法的方法
public void ContextInterface(){
strategy.Algorithm();
}
}
public class Client {
public static void main(String[] args) {
Context context;
context = new Context(new StrategyA());
context.ContextInterface();
context = new Context(new StrategyB());
context.ContextInterface();
context = new Context(new StrategyC());
context.ContextInterface();
}
}
接下来我们将策略模式和简单工厂模式结合一下,其实大部分代码都是一样的:
//提供一个算法的通用接口
interface Strategy{
void Algorithm();
}
//具体算法的不同实现
class StrategyA implements Strategy{
@Override
public void Algorithm() {
System.out.println("算法A的具体实现");
}
}
class StrategyB implements Strategy{
@Override
public void Algorithm() {
System.out.println("算法B的具体实现");
}
}
class StrategyC implements Strategy{
@Override
public void Algorithm() {
System.out.println("算法C的具体实现");
}
}
//通过创建Context对象来创建不同的算法对象
class Context{
Strategy strategy =null;
public Context(String str) //此时传入的就不是具体的算法对象了,而是一个字符串,表示一个具体的算法对象
{
switch (str){
case "A":
strategy = new StrategyA();break;
case "B":
strategy = new StrategyB();break;
case "C":
strategy = new StrategyC();break;
}
}
public void ContextInterface(){
strategy.Algorithm();
}
}
public class Client {
public static void main(String[] args) {
Context context;
context = new Context("A");
context.ContextInterface();
context = new Context("B");
context.ContextInterface();
context = new Context("C");
context.ContextInterface();
}
}
对比上述两种方法,下面这种方式客户端只需要认识Context类就可以了连算法的父类Strategy都不必去管,这使得算法和客户端彻底分离,耦合更低了。

浙公网安备 33010602011771号