您的位置:首页 > 编程语言

【编程素质】设计模式-策略模式

2016-10-20 17:00 267 查看

1,什么是策略模式(Strategy)

(1)概念

定义了算法族,分别封装起来,让它们之间可以互相替换。

①也称为政策模式(Policy).

②核心思想就是面向对象编程的多形性的思想.

③是硬编码(Hard Coding)的替换。如查找、排序等,硬编码是在一个类中,提供多个方法,每一个方法对应一个具体的查找算法。如果需要增加一种新的查找算法,需要修改封装算法类的源代码;更换查找算法,也需要修改客户端调用代码。在这个算法类中封装了大量查找算法,该类代码复杂,维护困难。如果我们将这些策略包含在客户端,这种做法更不可取,将导致客户端程序庞大而且难以维护,如果存在大量可供选择的算法时问题将变得更加严重。

(2)场景:

①许多相关的类仅仅是行为有异。

“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。即一个系统需要动态地在几种算法中选择一种。

② 需要使用一个算法的不同变体。

③算法使用客户不应该知道的数据。

④一个类定义了多种行为 , 这些行为以多个条件语句的形式出现。

例如,你可能会定义一些反映不同的空间 /时间权衡的算法。当这些变体实现为一个算法的类层次时 ,可以使用策略模式。

可使用策略模式以避免暴露复杂的、与算法相关的数据结构。

将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句。

(3)优缺点

优:

让算法的变化独立于使用算法的客户。

2,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";
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: