1.策略模式(Strategy Pattern):定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法可以独立于使用它的客户而变化。
(1)Context(环境类):环境类是使用算法角色,它在解决某个问题(即实现某个功能)时可以采用多种策略。在环境类中维持一个对抽象策略类的引用实例,用于定义所采用的策略。
(2)Strategy(抽象策略类):抽象策略类所支持的算法声明了抽象方法,是所有策略类的父类,它可以是抽象类也可以是具体类,也可以是接口。环境类通过抽象策略类中申明的方法在运行时调用具体策略类中实现的算法。
(3)ConcreateStrategy(具体策略类):具体策略类实现了在抽象策略类中生命的算法,在运行时具体策略类将覆盖在环境类中定义的抽象策略类对象,使用一种具体的算法实现某个业务功能。
/**抽象策略类,在使用策略模式时,需要将算法从环境类中提取出来*/
public abstract class AbstractStrategy{
public abstract void algorithm();//声明抽象算法
}
/**具体策略类*/
public class ConcreteStrategyA extends AbstractStrategy{
//算法的具体实现
public void algorithm(){
//算法A
}
}
/**环境类*/
public class Context{
private AbstractStrategy strategy;//维持一个对抽象策略类的引用
public void setStrategy(AbstractStrategy strategy){
this.strategy = strategy;
}
//调用策略类中的方法
public void algorithm(){
strategy.algorithm();
}
}
/**客户端测试类的片段*/
···
Context context = new Context();
AbstractStrategy strategy;
strategy = new ConcreateStrategyA();//可以在运行时指定类型,通过配置文件和反射机制实现
context.setStrategy(strategy);
context.algorithm();
···
2.代码实例介绍:小明要从北京出发到武汉,现在有飞机、火车、大巴三种公共交通以供选择,小明要看乘坐这三种交通方式所需的时间。因此计算乘坐这三种交通所需要的时间就是三种算法。然后小明再从这三种算法中选一种交通方式。代码如下:
/**速度类,充当抽象策略类*/
public interface Speed {
public double needtime(double distance);
}
/**火车类,充当具体策略类*/
public class Train implements Speed {
private double SPEED = 100.0;//公里每小时
private double time;
public double needtime(double distance){
System.out.println("学生票");
return time = distance/SPEED;
}
}
/**公共汽车类,充当具体策略类*/
public class Bus implements Speed {
private final double SPEED = 60.0;//公里每小时
private double time;
public double needtime(double distance){
System.out.println("公共汽车");
return time=distance / SPEED;
}
}
/**飞机类。充当具体策略类*/
public class Airplane implements Speed {
private double SPEED=800.0;//公里每小时
private double time;
public double needtime(double distance){
System.out.println("飞机");
return time = distance/SPEED;
}
}
/**两地距离类,充当环境类*/
public class Apart{
private double distance;
private Speed speed;//维持一个对抽象折扣类的引用
public void setDistance(double distance){
this.distance = distance;
}
//注入了一个折扣类对象
public void setSpeed(Speed speed){
this.speed = speed;
}
public double getSpeed(){
//调用折扣类的折扣价计算方法
return speed.needtime(this.distance);
}
}
/**客户端测试类*/
public class Client{
public static void main(String args[]){
Apart at = new Apart();
double originalDistance = 1000.0;//两地的距离,单位公里
double time;//需要用的时间
at.setDistance(originalDistance);
System.out.println("两地距离为:"+originalDistance);
System.out.println("--------------------------");
//discount = (Discount)XMLUtil.getBean();//可以用反射机制得到所用交通的对象,反射机制之前已经有介绍
Speed speed = new Train();
at.setSpeed(speed);//注入折扣对象
time= at.getSpeed();
System.out.println("需要时间为:"+time);
}
}
3.代码运行结果