策略模式也叫政策模式,是一种行为型设计模式,是一种比较简单的设计模式。策略模式采用了面向对象的继承和多态机制,下面让我们详细了解一下策略模式吧!
定义一组算法,将每个算法都封装起来,并且使他们之间可以互换。
他也叫作上下文角色,起承上启下封装作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化。
策略、算法家族的抽象。通常为接口,定义每个策略或算法必须具有的方法和属性。是策略的抽象。
具体的策略实现。该类含有具体的算法。
快过中秋了,小杨准备回家团圆,因为家距离自己上班的地方500KM,所以小杨想选择一个比较便宜的回家方式,小杨调查了一下可选择的出行有三种,一做飞机,二自己驾车,三乘火车。这三种乘坐方式的价格不一致,坐飞机大约是没千米50元,自己驾车大约是每千米0.5元,做火车呢,每KM大约是0.1元,现在就让我们用策略模式实现一下小杨要计算的回家费用吧!
Strategy,新建一个CalculateStrategy接口
package iuni.life;
/**
* 计算接口
*/
public interfaceCalculateStrategy{
floatprice(intkm);
}
ConcreteStrategy,新建CarStrategy、PlaneStrategy、TrainStrategy实现接口CalculateStrategy
/**
* 自己开车 按每公里0.5元计算
*/
public classCarStrategyimplementsCalculateStrategy{
@Override
publicfloatprice(intkm){
return (float) 0.5 * km;
}
}
/**
* 乘飞机 按每公里50元计算
*/
public classPlaneStrategyimplementsCalculateStrategy{
@Override
publicfloatprice(intkm){
return 50 * km;
}
}
/**
* 乘火车 大约是每公里按0.1元计算
*/
public classTrainStrategyimplementsCalculateStrategy{
@Override
publicfloatprice(intkm){
return (float) (0.1 * km);
}
}
Context,新建Client
public classClient{
CalculateStrategy calculateStrategy;
static int km = 500;
publicstaticvoidmain(String[] args){
Client client = new Client();
//选择乘飞机的方式
client.setCalculateStrategy(new PlaneStrategy());
System.out.println("乘坐飞机需要的费用为:¥" + client.getPrice(km));
//选择乘火车的方式
client.setCalculateStrategy(new TrainStrategy());
System.out.println("乘坐火车需要的费用为:¥" + client.getPrice(km));
//选择自己驾车的方式
client.setCalculateStrategy(new CarStrategy());
System.out.println("自己驾车需要的费用为:¥" + client.getPrice(km));
}
/**
* 设置出行方式
*
* @param calculateStrategy
*/
publicvoidsetCalculateStrategy(CalculateStrategy calculateStrategy){
this.calculateStrategy = calculateStrategy;
}
/**
* 获得出行费用
*
* @param km
* @return
*/
publicfloatgetPrice(intkm){
return calculateStrategy.price(km);
}
}
运行结果
策略枚举
上面的例子改成以下方式:
定义一个枚举类,实现方式如下:
public enum Calculator {
//自驾
CAR {
publicfloatprice(intkm){
return (float) 0.5 * km;
}
},
PLANE {//飞机
publicfloatprice(intkm){
return (float) 50 * km;
}
},
TRAIN {//火车
publicfloatprice(intkm){
return (float) 0.1 * km;
}
};
Calculator() {
}
publicabstractfloatprice(intkm);
}
修改Client
public classClient{
static int km = 500;
publicstaticvoidmain(String[] args){
System.out.println("乘坐飞机需要的费用为:¥" + Calculator.PLANE.price(km));
System.out.println("乘坐火车需要的费用为:¥" + Calculator.TRAIN.price(km));
System.out.println("自己驾车需要的费用为:¥" + Calculator.CAR.price(km));
}
}
运行结果
可以看出:
Calculator是一个浓缩了策略模式的枚举。
策略枚举是一个非常优秀和方便的模式,但是其受到枚举类型的限制,每个枚举项都是public、final、static的,拓展性受到了一定的约束,因此在系统开发中,枚举策略一般担当不经常发生变的角色。