首页 > 其他分享 >策略模式的代码实践示例

策略模式的代码实践示例

时间:2024-02-09 17:44:43浏览次数:25  
标签:String 示例 TYPE 代码 实践 param type public 策略

一、定义

策略模式,针对每一个不同的类型,调用具有共同接口的不同实现类,从而使得它们可以相互替换。
策略模式 ,针对实现同一接口的不同的类,采用不同的策略。比如,面对高级会员、初级会员会采用不同的折扣。
策略模式,可以避免大量的if和else。

二、角色

策略模式涉及到三个角色:
●  环境(Context)角色:调用策略
●  抽象策略(Strategy)角色:抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
●  具体策略(ConcreteStrategy)角色:实现抽象策略接口,包装了相关的算法或行为。

三、示例

  • 策略模式接口 Strategy:
/**
 * 策略模式接口
 *
 */
public interface Strategy {

    /**
     * 做某事
     * @param param
     * @return
     */
    String doSth(String param) ;

}
  • 公共类:
/**
 * 基础类,写不同策略的公共的代码,继承基础类,写公共逻辑,避免代码重复
 */
@Service
public class StrategyBaseService {

    /**
     * 公共代码,避免代码重复
     */
    public void doCommon() {
        System.out.println("do sth common.");
    }
}
  • 第一种策略 FirstStrategyServerImpl:

继承基础类,实现 Strategy接口。

@Component 注解的名称为 TypeNameConstant 常量,见后续代码。

/**
 * 第一种策略
 */
@Component(TypeNameConstant.TYPE_FIRST)
public class FirstStrategyServerImpl extends StrategyBaseService implements Strategy  {

    /**
     * 业务逻辑
     */
    @Override
    public String doSth(String param) {
        doCommon();
        return "FirstStrategy doSth " + param;
    }

}

  • 第二种策略 SecondStrategyServiceImpl:
/**
 * 第二种策略
 */
@Component(TypeNameConstant.TYPE_SECOND)
public class SecondStrategyServiceImpl extends StrategyBaseService implements Strategy {

    /**
     * 业务逻辑
     */
    @Override
    public String doSth(String param) {
        doCommon();
        return "SecondStrategy doSth " + param;
    }

}

  • 不同策略的 @Component名称:
/**
 *  不同策略的 @Component名称
 */
public class TypeNameConstant {

    private TypeNameConstant() {}

    /**
     * 比如 FirstStrategy 的 @Component名称是 TypeConstant.TYPE_FIRST (这个常量对应字符串 first)
     */
    public static final String TYPE_FIRST = "first";
    public static final String TYPE_SECOND = "second";
    public static final String TYPE_THIRD = "third";

}
  • 类型枚举:
/**
 *  type枚举. @Getter 要是用不了,可以直接写 属性对应的 get()方法。
 */
@Getter
public enum TypeEnum {

    /**
     * 类型一
     */
    FIRST_TYPE(1, TypeNameConstant.TYPE_FIRST),

    /**
     * 类型二
     */
    SECOND_TYPE(2, TypeNameConstant.TYPE_SECOND),

    /**
     * 类型三
     */
    THIRD_TYPE(3, TypeNameConstant.TYPE_THIRD),

    ;

    /**
     * 类型
     */
    private final Integer type;
    private final String typeName;

    TypeEnum(Integer type, String text) {
        this.type = type;
        this.typeName = text;
    }

    /**
     * 根据 type 获取枚举
     * @param type
     * @return
     */
    public static TypeEnum getByType(Integer type) {
        for (TypeEnum typeEnum : TypeEnum.values()) {
            if (typeEnum.getType().equals(type)) {
                return typeEnum;
            }
        }
        return null;
    }

    public static TypeEnum getByName(String name) {
        for (TypeEnum typeEnum : TypeEnum.values()) {
            if (typeEnum.getTypeName().equals(name)) {
                return typeEnum;
            }
        }
        return null;
    }

}

  • StrategyContext 调用策略:

策略模式,会有一个 Context 类,调用策略。

/**
 * 策略 Context,获取策略
 */
@Service
public class StrategyClientService {

    @Resource
    private StrategyContext strategyContext;

    /**
     * 根据 type 获取不同的策略,再执行业务逻辑。
     */
    public String doSthByType(Integer type, String param) {
        Strategy strategy = strategyContext.getStrategyByType(type);
        return strategy.doSth(param);
    }


}
  • 根据类型,使用策略:
/**
 * 调用类
 *
 */
@Service
public class StrategyClientService {


    @Resource
    private StrategyContext strategyContext;

    /**
     * 根据 type 获取不同的策略,再执行业务逻辑。
     */
    public String doSthByType(Integer type, String param) {
        Strategy strategy = strategyContext.getStrategyByType(type);
        return strategy.doSth(param);
    }


}

测试代码

没有单元测试类,也可以直接写个 Controller 测试。

    public void testDoSthByType()  {
        String result = strategyClientService.doSthByType(1, "12345");
        System.out.println("==============> result: " + result);
    }

输出结果:

type 为1时,结果为:

execute common method.
==============> result: FirstStrategy doSth 12345

type为2时,结果为:

execute common method.
==============> result: SecondStrategy doSth 12345

参考资料:

《java与模式》

标签:String,示例,TYPE,代码,实践,param,type,public,策略
From: https://www.cnblogs.com/expiator/p/18012557

相关文章

  • GDI+常用代码
    使控件整个图象失效,并重新绘制控件_mChart.Invalidate();将控件的背景色和窗体的背景色保持一致privatevoidUserControl1_Paint(objectsender,PaintEventArgse){e.Graphics.Clear(this.BackColor);}使用图片作为画布Bitmap......
  • 代码随想录算法训练营第十六天| 104.二叉树的最大深度 559.n叉树的最大深度 111.二
    104.二叉树的最大深度  题目链接:104.二叉树的最大深度-力扣(LeetCode)n叉树也一样思路:我的普通递归方法classSolution{public:intdepth(TreeNode*node,intd){intl=0,r=0;if(node->left==NULL&&node->right==NULL)returnd;if(node-......
  • 代码随想录 day44 零钱兑换 II 组合总和 Ⅳ
    零钱兑换II这里组合类问题用上了dp[j]=dp[j-nums[i]]这个递推式由于说了硬币可以用无数次也就是这是个完全背包问题这里先遍历物品再遍历背包就是算了组合数反过来就是算排列数组合总和Ⅳ这题就是组合类问题的排列数模板题......
  • 如何使用graalvm为带有反射功能的java代码生成native image
    译自ConfigureNativeImagewiththeTracingAgentgraal官方文档,以下所有命令需要在linux环境下操作,graalvm也支持windows。要为使用Java反射、动态代理对象、JNI或类路径资源的Java应用程序构建本机可执行文件,应为native-image工具提供JSON格式的配置文件或在代......
  • Asp-Net-Core学习笔记:WebApi开发实践
    前言用AspNetCore做Api开发也有一段时间了,正好年底在做总结,做一个WebApi开发实践笔记。暂时想到的一些技术关键词,同时也作为本文的大纲,现在对这套技术体系的了解还不够深入,以后会持续更新这个Api开发实践~身份认证:JwtBearer分页:X.PagedList缓存ResponseCacheRedis:St......
  • 使用Markdown写blog(不包含源代码)
    使用Markdown写blog(不包含源代码)标题三级标题四级标题可以自己添加几级标题字体Hello,worldHello,worldHello,worldHello,world引用狂神说java分割线图片超链接[点击跳转到bilibili](哔哩哔哩(゜-゜)つロ干杯~-bilibili)列表有序列表一二三无序......
  • 阿里云参编业内首个代码大模型标准丨云原生 2024 年 1 月产品技术动态
    云原生月度动态云原生是企业数字创新的最短路径。《阿里云云原生每月动态》,从趋势热点、产品新功能、服务客户、开源与开发者动态等方面,为企业提供数字化的路径与指南。趋势热点......
  • 爬取 【豆瓣电影top250数据】 python代码
    importrequestsimportopenpyxlimportreimporttimeimportpymysqlclassDoubanSpider:def__init__(self):self.url_temp="https://movie.douban.com/top250?start={}"self.headers={'User-Agent':'Mozilla/5.0......
  • 前端vscode+eslint代码规范
    前端使用vscode+eslint格式化规范代码格式在应用商店安装eslint,配置好eslint,根目录新增.eslintrc.jsmodule.exports={root:true,parserOptions:{parser:'babel-eslint',sourceType:'module'},env:{browser:true,node:true,es6......
  • 【译】宣布推出适用于 .NET 的 Azure Migrate 应用程序和代码评估工具
    原文|OliaGavrysh翻译|郑子铭我们很高兴地宣布发布一款新工具,可以帮助您将本地.NET应用程序迁移到Azure。适用于.NET的AzureMigrate应用程序和代码评估工具(简称AppCAT)允许你评估应用程序的.NET源代码、配置和二进制文件,以识别将应用程序迁移到Azure时的潜在......