版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SunshineTan/article/details/82708155
1,概念
定义了算法族,分别封装起来,让它们之间可以互相替换。
核心思想就是面向对象编程的多形性的思想.
是硬编码(Hard Coding)的替换。如查找、排序等,硬编码是在一个类中,提供多个方法,每一个方法对应一个具体的查找算法。如果需要增加一种新的查找算法,需要修改封装算法类的源代码;更换查找算法,也需要修改客户端调用代码。在这个算法类中封装了大量查找算法,该类代码复杂,维护困难。如果我们将这些策略包含在客户端,这种做法更不可取,将导致客户端程序庞大而且难以维护,如果存在大量可供选择的算法时问题将变得更加严重。
2,场景
①许多相关的类仅仅是行为有异。
“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。即一个系统需要动态地在几种算法中选择一种。
② 需要使用一个算法的不同变体。
③算法使用客户不应该知道的数据。
④一个类定义了多种行为 , 这些行为以多个条件语句的形式出现。
例如,你可能会定义一些反映不同的空间 /时间权衡的算法。当这些变体实现为一个算法的类层次时 ,可以使用策略模式。
可使用策略模式以避免暴露复杂的、与算法相关的数据结构。
将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句。
3,优缺点
优:让算法的变化独立于使用算法的客户。
4,实现
解决的是客户端选择方法的封装方法(与之相比的是简单工厂模式封装的是对象),其实把简单工厂模式稍作修改,就是策略模式了。可以认为是用简单工厂模式返回了一系列有共同父类或者同一接口的对象,然后调用对象的接口或者虚方法。这样客户端代码只是通过工厂生成了一个对象,然后调用对象的方法,并通过多态来实现不同的程序功能。
5,demo
package strategy;
public class Main {
public static void main(String[] args){
/*乘坐火车旅行*/
PersonContext person = new PersonContext(new TrainStrategy());
System.out.println( person.travel() );
/*乘飞机*/
person.setTravelStrategy(new AirPlanelStrategy());
System.out.println( person.travel() );
}
}
package strategy;
public class PersonContext {
private TravelStrategy strategy= null;
public PersonContext(TravelStrategy strategy){
this.strategy = strategy;
}
/**
* 旅行
*/
public void setTravelStrategy(TravelStrategy strategy){
this.strategy = strategy;
}
public String travel(){
return this.strategy.travelAlgorithm();
}
}
package strategy;
/**
* 抽象策略类(Strategy):定义所有支持的算法的公共接口。
* Context使用这个接口来调用某ConcreteStrategy定义的算法。
* @author luo
*
*/
public interface TravelStrategy {
public String travelAlgorithm();
}
package strategy;
/**
* 具体策略类。实现Strategy接口。
* @author luo
*
*/
public class AirPlanelStrategy implements TravelStrategy{
@Override
public String travelAlgorithm(){
return "AirPlanelStrategy";
}
}
package strategy;
/**
* 具体策略类,实现Strategy接口
* @author luo
*
*/
public class TrainStrategy implements TravelStrategy{
@Override
public String travelAlgorithm(){
return "TrainStrategy";
}
}