Java设计模式(13)之策略模式

个人感想:

今天开始学习第一种行为型模式,加油!!!

策略模式

准备一组同一类的算法,并且将每个算法封装到具有共同接口的独立的类中,从而使得客户端可以灵活的进行算法的切换,客户端自行决定使用哪种算法。

类型:

行为型模式(父类与子类之间的行为型模式)

策略模式涉及到三个角色:

  • 环境(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)判断语句,易于维护。

缺点:

  • 客户端必须清楚所有的具体策略,并决定使用哪一个策略
  • 产生大量的策略类
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值