设计模式——策略模式

  策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

优点

  1、提供了一种替代继承的方法,而且既保持了继承的优点(代码重用)还比继承更灵活(算法独立,可以任意扩展)。
  2、避免程序中使用多重条件转移语句,使系统更灵活,并易于扩展。
  3、遵守大部分GRASP原则和常用设计原则,高内聚、低偶合。

缺点

  没一种策略都会添加一个子类

模式的组成
  环境类(Context):用一个ConcreteStrategy对象来配置。维护一个对Strategy对象的引用。可定义一个接口来让Strategy访问它的数据。
  抽象策略类(Strategy):定义所有支持的算法的公共接口。 Context使用这个接口来调用某ConcreteStrategy定义的算法。
  具体策略类(ConcreteStrategy):以Strategy接口实现某具体算法。

实现

  在人们出门的出行方式,我们在这个场景进行实现。类图如下:

ITravelStrategy的定义:

package com.lidaming.design17.strategy;

public interface ITravelStrategy {
    void travel();
}
View Code

TravelContext的实现:

package com.lidaming.design17.strategy;

public class TravelContext {
    private ITravelStrategy travelStrategy;

    public TravelContext(ITravelStrategy strategy) {
        travelStrategy = strategy;
    }

    public void setStrategy(ITravelStrategy strategy) {
        travelStrategy = strategy;
    }

    public void travel() {
        travelStrategy.travel();
    }
}
View Code

Bike的实现:

package com.lidaming.design17.strategy;

public class Bike implements ITravelStrategy {

    public void travel() {
        System.out.println(" travel by bike");
    }

}
View Code

Train的实现:

package com.lidaming.design17.strategy;

public class Train implements ITravelStrategy {

    public void travel() {
        System.out.println("travel on train");
    }

}
View Code

Bus的实现:

package com.lidaming.design17.strategy;

public class Bus implements ITravelStrategy {

    public void travel() {
        System.out.println("travel on bus");
    }

}
View Code

场景类的实现:

package com.lidaming.design17.strategy;

public class Client {
    public static void main(String[] args) {
        TravelContext travelContext = new TravelContext(new Bike());
        travelContext.travel();
        
        System.out.println("it takes too long");
        
        travelContext.setStrategy(new Bus());
        travelContext.travel();
        
        
        System.out.println("it is too expensive");
        
        travelContext.setStrategy(new Train());
        travelContext.travel();
        
        System.out.println("it just fine");
    }
}
View Code

参考

http://blog.csdn.net/hguisu/article/details/7558249

原文地址:https://www.cnblogs.com/hpuCode/p/5436812.html