设计模式(一)策略模式——策略模式结构

前言

策略模式是行为型设计模式的一种,关于策略模式的分析将分为几篇博文,分别从策略模式结构,策略模式优化,策略模式在业务场景中的应用、策略模式在spring中优雅使用等几个方面分析。

什么是策略模式

策略 模式 是一种行为设计模式 , 它能让你定义一系列算法 , 并将每种算法分别放入独立的类中 , 以使算法的对象能够相互替换 。

策略模式结构

策略模式的结构如下:

  • StrategyContext :策略上下文对象,维护指向具体策略的引用,通过策略接口Strategy与对象进行沟通。
  • Strategy :策略接口,定义统一的策略入口方法,留给具体策略类实现,且供StrategyContext调用。
  • AStrategy (BStrategy、CStrategy):具体的策略类,实现Strategy,提供各种不同的算法。
  • Client :调用方,指需要用的策略算法的地方。

up-ab291783494a66819e2216ac3f4fe444391.png

策略模式伪代码

结合上面的类图,用伪代码来表示

策略接口定义

package com.lsz.order.strategy;

/**
 * 策略接口定义
 *
 * @author lishuzhen
 * @createTime 2022年05月11日 22:48:00
 */
public interface Strategy {

    /**
     * 策略算法执行入口
     *
     * @param obj
     * @return
     */
    Object execute(Object obj);
}

ABC三个策略的实现

/**
 * A策略
 *
 * @author lishuzhen
 * @createTime 2022年05月11日 22:49:00
 */
public class AStrategy implements Strategy {
    /**
     * 策略算法执行入口
     *
     * @param obj
     * @return
     */
    @Override
    public Object execute(Object obj) {
        return null;
    }
}


/**
 * B策略
 *
 * @author lishuzhen
 * @createTime 2022年05月11日 22:49:00
 */
public class BStrategy implements Strategy {
    /**
     * 策略算法执行入口
     *
     * @param obj
     * @return
     */
    @Override
    public Object execute(Object obj) {
        return null;
    }
}


/**
 * C策略
 *
 * @author lishuzhen
 * @createTime 2022年05月11日 22:50:00
 */
public class CStrategy implements Strategy {
    /**
     * 策略算法执行入口
     *
     * @param obj
     * @return
     */
    @Override
    public Object execute(Object obj) {
        return null;
    }
}

策略上下文对象

package com.lsz.order.strategy;

/**
 * 策略上下文对象
 *
 * @author lishuzhen
 * @createTime 2022年05月11日 22:48:00
 */
public class StrategyContext {

    private Strategy strategy;


    /**
     * 策略上下文对象委派具体的策略执行算法
     *
     * @param obj
     * @return
     */
    public Object handler(Object obj) {
        return strategy.execute(obj);
    }

    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }
}

调用方

package com.lsz.order.strategy;

/**
 * @author lishuzhen
 * @createTime 2022年05月11日 22:50:00
 */
public class Client {

    public static void main(String[] args) {

        // 模拟业务参数
        String parameter = "A";
        Object obj = new Object();

        // 策略上下文对象
        StrategyContext context = new StrategyContext();

        switch (parameter) {
            case "A":
                // 执行使用A策略
                context.setStrategy(new AStrategy());
                context.handler(obj);
                break;
            case "B":
                // 执行使用B策略
                context.setStrategy(new BStrategy());
                context.handler(obj);
                break;
            case "C":
                // 执行使用C策略
                context.setStrategy(new CStrategy());
                context.handler(obj);
                break;
            default:
                throw new RuntimeException("Not Found Strategy");
        }


    }
}

策略模式优点

  1. 可以在程序运行时切换不同的策略。
  2. 调用方和算法具体实现代码隔离分开。
  3. 符合开闭原则,无需修改策略上下文对象就能够引入新的策略。

策略模式缺点

  1. 由上面Client代码可见,调用方依赖具体策略类,且需要自己选择合适的策略。PS:对于这一点后面再写博文提出优化方案。
  2. 如果业务逻辑不是很复杂,强行使用策略模式会增加程序的复杂度。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值