前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >面试官经常问的策略模式,手把手教你写出来

面试官经常问的策略模式,手把手教你写出来

作者头像
程序员小强
发布2019-06-02 14:53:45
1.1K0
发布2019-06-02 14:53:45
举报
文章被收录于专栏:小强的进阶之路

策略模式

策略模式(Strategy Model) 属于23种GoF设计模式中的一种。 策略模式的描述为:定义了一组算法,并且将这些算法都封装了起来,这些算法之间可以相互的转换使用。 通俗点来讲就是一个组件(对象)拥有的同一个行为在不同的环境下表现出来的不同的实现方式。

现实生活中有着不少关于这个方面的例子,比如一个商场会在特定的日期退出各种打折活动,或者在某一个日子退出满减活动,又或者各种会员卡折扣积分的机制等等,都会使我们最后计算商品的成交价的时候带来不同的计算方式,如果这个例子需要程序编写出来,那么使用策略模式无疑是一个很明智的选择。 又或者说在计算不同的税收也是一样,在中国的税收情况和美国或者其他国家的税收情况肯定不同,这也是一个策略模式的使用例子。

策略模式的三个基本特点
  1. 定义了一组算法或者业务规则,所有算法或业务规则完成的都是完成相同的功能,只是说各自的实现不同;
  2. 将每一个算法或业务规则都进行了封装;
  3. 这组定义的算法或业务规则在不同的环境下是可以互相替换使用的。
策略模式的三个组成部分
  1. 抽象策略角色: 策略类,通常由一个接口或者抽象类实现。
  2. 具体策略角色:封装相关的算法和行为。
  3. 环境角色:持有一个策略类的引用,给客户端调用。
策略模式小案例

接下来我们就通过一个小案例来加强对策略模式的理解! 情景:(引用自三国演义周瑜赔了夫人又折兵的锦囊妙计的典故) 此时的刘皇叔需要出去江东,临行前诸葛亮给了赵云三个锦囊,需要赵云依次根据锦囊中的妙计行事,从而保证刘皇叔安然无恙的归来,还要恶心一下周瑜!

  1. 明确各个部分对应关系 抽象策略角色:Strategy 具体策略角色:StrategyFirstImpl,StrategySecondImpl,StrategyThirdImpl 环境角色:StrategyContext
  2. 给出UML图如下:

UML类图

  1. 抽象策略角色
代码语言:javascript
复制
/**
 * 策略模式  抽象策略角色
 *      此处的抽象策略角色使用接口的方式定义
 *      这是一个锦囊但是还没有装妙计,妙计存在于具体策略中
 * @author WQ
 */
public interface Strategy {
    void howToDo();
}
  1. 具体策略角色
代码语言:javascript
复制
/**
 * 策略模式  具体策略角色  角色一
 *      包装相关的算法和行为
 *      锦囊妙计 第一条
 * @author WQ
 */
public class StrategyFirstImpl implements Strategy{
    @Override
    public void howToDo() {
        System.out.println("第一个锦囊:见乔国老,并把刘备娶亲的事情搞得东吴人尽皆知!");
    }
}
-------------------------------------------------------------------------------------------------
/**
 * 策略模式  具体策略角色  角色二
 *      包装相关的算法和行为
 *      锦囊妙计 第二条
 * @author WQ
 */
public class StrategySecondImpl implements Strategy{
    @Override
    public void howToDo() {
        System.out.println("第二个锦囊:用谎言(曹操打荆州)骗泡在温柔乡里的刘备回去!");
    }
}
---------------------------------------------------------------------------------------------------
/**
 * 策略模式  具体策略角色  角色三
 *      包装相关的算法和行为
 *      锦囊妙计 第三条
 * @author WQ
 */
public class StrategyThirdImpl implements Strategy{
    @Override
    public void howToDo() {
        System.out.println("第三个锦囊:让孙夫人摆平东吴的追兵,她是孙权妹妹,东吴将领惧她三分!");
    }
}
  1. 环境角色 PS:这里使用的是Switch语句进行条件判定,使用switch语句尤其要注意break的使用! PS:此处可以使用反射技术替换这里的switch条件判断!
代码语言:javascript
复制
/**
 * 策略模式  环境角色
 *  持有一个策略类的引用,最终给客户端调用
 *  本案例的策略类引用就是持有锦囊
 * @author WQ
 */
public class StrategyContext {
    //策略类的引用
    Strategy strategy = null;
    /**
     * @param number 第number个锦囊
     */
    public StrategyContext(int number){
        switch (number){
            case 1:
                strategy = new StrategyFirstImpl();
                break;
            case 2:
                strategy = new StrategySecondImpl();
                break;
            case 3:
                strategy = new StrategyThirdImpl();
                break;
                default:
                    strategy = null;
        }
    }
    /**
     * 使用多态的形式调用正确的锦囊妙计
     */
    public void getStrategy(){
        strategy.howToDo();
    }
}
  1. 测试案例
代码语言:javascript
复制
/**
 * 策略模式  客户端
 *  该客户端为赵云使用诸葛亮提供的三个锦囊妙计为测试用例
 * @author WQ
 */
public class ZhaoYun {
    public static void main(String[] args){
        //策略模式下的环境角色
        StrategyContext context;
        //赵云初上江东
        context = new StrategyContext(1);
        context.getStrategy();
        //周瑜实施美人计
        context = new StrategyContext(2);
        context.getStrategy();
        //赵云离江东
        context = new StrategyContext(3);
        context.getStrategy();
    }
}

给出运行结果图:

运行结果图 OK!策略模式的介绍就是这么多啦!

End

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 MoziInnovations 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 策略模式
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档