个人感想:
今天开始学习第一种行为型模式,加油!!!
策略模式
准备一组同一类的算法,并且将每个算法封装到具有共同接口的独立的类中,从而使得客户端可以灵活的进行算法的切换,客户端自行决定使用哪种算法。
类型:
行为型模式(父类与子类之间的行为型模式)
策略模式涉及到三个角色:
- 环境(Context) 对象:持有一个Strategy的引用,并根据具体情况执行具体策略。
- 抽象策略(Strategy) 对象:这是一个抽象角色,通常由一个接口或抽象类实现。此对象规定所有的具体策略类所需的接口。
具体策略(ConcreteStrategy) 对象:封装了具体相关的算法或行为。
策略模式关系图:
策略模式示例:
本例子以交警叔叔查酒驾为例,学习策略模式,不忘饮酒不开车,开车不饮酒。
Strategy接口— StrategyToDrinkDriving
/**
* Create by zhaihongwei on 2018/3/23
* 饮酒策略的统一接口
*/
public interface StrategyToDrinkDriving {
/**
* 策略方法
*/
void strategyInterface();
}
没有饮酒策略— NoDrinkDriving
/**
* Create by zhaihongwei on 2018/3/23
* 没有饮酒策略
*/
public class NoDrinkDriving implements StrategyToDrinkDriving {
@Override
public void strategyInterface() {
System.out.println("没有喝酒,放行!");
System.out.println("记住饮酒不开车,开车不饮酒!");
}
}
饮酒策略— DrinkDriving
/**
* Create by zhaihongwei on 2018/3/23
* 饮酒驾驶策略
*/
public class DrinkDriving implements StrategyToDrinkDriving{
@Override
public void strategyInterface() {
System.out.println("血液中的酒精含量大于或者等于20mg/100ml,小于80mg/100ml,属于饮酒驾驶!");
System.out.println("去警局吧!罚款1000元—2000元、记12分并暂扣驾照6个月");
}
}
醉驾策略— MoreDrinkDriving
/**
* Create by zhaihongwei on 2018/3/23
* 醉驾策略
*/
public class MoreDrinkDriving implements StrategyToDrinkDriving {
@Override
public void strategyInterface() {
System.out.println("血液中的酒精含量大于或者等于80mg/100ml,属于醉驾!");
System.out.println("你是完蛋了,去警局待着吧你!!!吊销驾照,5年内不得重新获取驾照,经过判决后处以拘役,并处罚金");
}
}
交警叔叔类— TrafficPolice
/**
* Create by zhaihongwei on 2018/3/23
* 交警类
*/
public class TrafficPolice {
/**
* 持有具体的策略
*/
private StrategyToDrinkDriving strategy;
/**
* 交警类根据具体情况使用不同的策略
* @param strategy
*/
public TrafficPolice(StrategyToDrinkDriving strategy) {
this.strategy = strategy;
}
/**
* 执行策略
*/
public void doStrategy() {
strategy.strategyInterface();
}
}
测试类:
/**
* Create by zhaihongwei on 2018/3/23
* 测试类
*/
public class StrategyTest {
public static void main(String[] args) {
System.out.println("同志配合一下,对着酒精检测仪吹一下!!!");
System.out.println(":(");
TrafficPolice trafficPolice = new TrafficPolice(new MoreDrinkDriving());
trafficPolice.doStrategy();
}
}
测试结果:
同志配合一下,对着酒精检测仪吹一下!!!
:(
血液中的酒精含量大于或者等于80mg/100ml,属于醉驾!
你是完蛋了,去警局待着吧你!!!吊销驾照,5年内不得重新获取驾照,经过判决后处以拘役,并处罚金
总结:
交警叔叔可以根据不同的情况,灵活的选择不同的应对策略。相信大家已经对策略模式有一定的理解了。
策略模式的优缺点:
优点:
- 客户端可以灵活的选择不同的策略,并且可以在不修改源码的情况下增加新的策略。
- 策略模式提供了管理各种具体策略的方法。
- 避免的使用多重(if-else)判断语句,易于维护。
缺点:
- 客户端必须清楚所有的具体策略,并决定使用哪一个策略
- 产生大量的策略类