设计模式之策略模式

本文介绍了策略模式,以商场活动、税收计算为例说明其应用场景。阐述了策略模式的三个基本特点,即定义一组算法、封装算法、可互相替换。还介绍了其三个组成部分,包括抽象策略、具体策略和环境角色,并通过“周瑜赔了夫人又折兵”的典故给出小案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

策略模式

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

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

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

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

  1. 明确各个部分对应关系
    抽象策略角色:Strategy
    具体策略角色:StrategyFirstImpl,StrategySecondImpl,StrategyThirdImpl
    环境角色:StrategyContext
  2. 给出UML图如下:
    UML类图
  3. 抽象策略角色
/**
 * 策略模式  抽象策略角色
 *      此处的抽象策略角色使用接口的方式定义
 *      这是一个锦囊但是还没有装妙计,妙计存在于具体策略中
 * @author WQ
 */
public interface Strategy {
    void howToDo();
}
  1. 具体策略角色
/**
 * 策略模式  具体策略角色  角色一
 *      包装相关的算法和行为
 *      锦囊妙计 第一条
 * @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条件判断!
/**
 * 策略模式  环境角色
 *  持有一个策略类的引用,最终给客户端调用
 *  本案例的策略类引用就是持有锦囊
 * @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. 测试案例
/**
 * 策略模式  客户端
 *  该客户端为赵云使用诸葛亮提供的三个锦囊妙计为测试用例
 * @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!策略模式的介绍就是这么多啦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值