设计模式 —— 策略模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011815404/article/details/88769332

【概述】

策略模式是一可插入式的模式,其针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换,使得算法可以在不影响到客户端的情况下发生变化,其本质是分离算法,选择实现

使用情景:

  • 同一个算法有很多不同的实现的情况时:使用策略模式来把这些 “不同的实现” 实现成为一个算法的类层次。
  • 抽象一个定义了很多行为的类,且通过多个 if-else 语句来选择这些行为:使用策略模式来代替这些条件语句。 

【基本思想】

使用策略模式可以把行为和环境分割开来,环境类负责维持和查询行为类,各种算法则在具体策略类中提供。

策略模式是对算法的封装,将使用算法的责任和算法本身分割开,委派给不同的对象管理,使得具体算法从具体业务中独立,是依靠多态实现的形同行为的不同实现

由于算法和环境独立开来,算法的增减、修改都不会影响环境和客户端,当出现新变化时,只需要实现新的策略类,并在客户端登记即可,而具体策略算法的选择,则交由客户端的上下文对象来选择。

【UML】

策略模式涉及到了三个角色:

  • 环境角色:Context,持有一个 Strategy 类的引用(上下文对象),负责和具体的策略类交互。
  • 抽象策略角色:Strategy,是一个抽象角色,通常由一个接口或抽象类实现,给出所有的具体策略类所需的接口。
  • 具体策略角色:ConcreteStrategy,包装了相关的算法或行为。 

【实现】

1.抽象策略角色

public interface Strategy {//抽象策略接口
    public void operate(Context ctx);//针对不同的上下文对象进行具体策略的调用
}

2.具体策略角色

public class ConcreteStrategyA implements Strategy {//具体策略1
    public void operate(Context ctx) {
        ...
    }
}
public class ConcreteStrategyB implements Strategy {//具体策略2
    public void operate(Context ctx) {
        ...
    }
}

 3.环境角色

public class Context {//上下文对象的具体实现
    private String variable1=null;
    private String variable2=null;
    private Strategy strategy=null;

    public Context(String variable1,String variable2,Strategy strategy) {
        this.variable1=variable1;
        this.variable2=variable2;
        this.strategy=strategy;//选择相应策略
    }
    public void operate() {//返回当前context对象所选择的策略
        this.strategy.operate(this);
    }
}

4.客户端

public class Program {
    public static void main(String[] args) {
        //读入变量
        Scanner input=new Scanner(System.in);
        String variable1=input.nextLine();
        String variable2=input.nextLine();

        Strategy strategyA=new ConcreteStrategyA();//具体策略A
        Strategy strategyB=new ConcreteStrategyB();//具体策略B
		
        Context ctxA=new Context(variable1,variable2,strategyA);//存入Context环境对象
        ctxA.operate();//具体操作
        Context ctxB=new Context(variable1,variable2,strategyB);//存入Context环境对象
        ctxB.operate();//具体操作
    }
}

 【优缺点】

优点:

  • 避免让客户端涉及到不必接触到的、复杂的、只与算法有关的数据。
  • 避免使用难以维护的多重条件选择语句
  • 便于更好的扩展

缺点:

  • 将分支判断又放回到客户端,要改变需求算法时,还是要去更改客户端。 
  • 客户端必须知道所有的策略类,并自行决定使用哪一个策略类,这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。
  • 增加了对象的数目
  • 只适合扁平的算法结构。

猜你喜欢

转载自blog.csdn.net/u011815404/article/details/88769332
今日推荐