设计模式再探——策略模式

目录

一、背景介绍

最近在做产品的过程中,对于主题讨论回复内容,按照追评次数排序、点赞排序、时间排序等内容做了深入研究,通过策略模式可以很好的进行优化。

二、思路&方案

  • 1.策略模式简介
  • 2.策略模式的类图
  • 3.策略模式代码
  • 4.策略模式还可以优化的地方
  • 5.策略模式的例子改造

三、过程

1.策略模式简介

策略模式:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。

2.策略模式的类图

3.策略模式代码

java 复制代码
package mark.strategy;

/**
 * 功能描述:
 *
 * @Author:makang
 * @Date: 2021/5/29 14:44
 */
public abstract class Strategy {
    public abstract void Algorithmlnterface();
}
java 复制代码
package mark.strategy;

/**
 * 功能描述:
 *
 * @Author:makang
 * @Date: 2021/5/29 14:46
 */
public class ConcreteStrategyA extends Strategy{
    @Override
    public void Algorithmlnterface() {
        System.out.println("算法A的具体实现");
    }
}
java 复制代码
package mark.strategy;

/**
 * 功能描述:
 *
 * @Author:makang
 * @Date: 2021/5/29 14:47
 */
public class ConcreteStrategyB extends Strategy{
    @Override
    public void Algorithmlnterface() {
        System.out.println("算法B的具体实现");
    }
}
java 复制代码
package mark.strategy;

/**
 * 功能描述:
 *
 * @Author:makang
 * @Date: 2021/5/29 14:47
 */
public class ConcreteStrategyC extends Strategy{
    @Override
    public void Algorithmlnterface() {
        System.out.println("算法C的具体实现");
    }
}
java 复制代码
package mark.strategy;

/**
 * 功能描述:
 *
 * @Author:makang
 * @Date: 2021/5/29 14:45
 */
public class Context {
    private Strategy strategy;

    Context(Strategy strategy){
        this.strategy = strategy;
    }
    public void ContextInterafce(){
        strategy.Algorithmlnterface();
    }
}
java 复制代码
package mark.strategy;

/**
 * 功能描述:
 *
 * @Author:makang
 * @Date: 2021/5/29 14:48
 */
public class Client {
    public static void main(String[] args) {
        Context context;
        context = new Context(new ConcreteStrategyA());
        context.ContextInterafce();

        context = new Context(new ConcreteStrategyB());
        context.ContextInterafce();

        context = new Context(new ConcreteStrategyC());
        context.ContextInterafce();

    }
}

4.策略模式还可以优化的地方

策略模式后续进行策略的扩充,需要修改客户端代码;对于客户端而言未满足开闭原则。

5.策略模式的例子改造(配置文件+反射)

java 复制代码
package mark.strategy.transform;

/**
 * 功能描述:
 *
 * @Author:makang
 * @Date: 2021/5/29 14:44
 */
public abstract class Strategy {
    public abstract void Algorithmlnterface();
}
java 复制代码
package mark.strategy.transform;

/**
 * 功能描述:
 *
 * @Author:makang
 * @Date: 2021/5/29 14:46
 */
public class ConcreteStrategyA extends Strategy {
    @Override
    public void Algorithmlnterface() {
        System.out.println("算法A的具体实现");
    }
}
java 复制代码
package mark.strategy.transform;

/**
 * 功能描述:
 *
 * @Author:makang
 * @Date: 2021/5/29 14:47
 */
public class ConcreteStrategyB extends Strategy {
    @Override
    public void Algorithmlnterface() {
        System.out.println("算法B的具体实现");
    }
}
java 复制代码
package mark.strategy.transform;

/**
 * 功能描述:
 *
 * @Author:makang
 * @Date: 2021/5/29 14:47
 */
public class ConcreteStrategyC extends Strategy {
    @Override
    public void Algorithmlnterface() {
        System.out.println("算法C的具体实现");
    }
}
java 复制代码
package mark.strategy.transform;

import java.util.HashMap;
import java.util.Map;

/**
 * 功能描述:
 *
 * @Author:makang
 * @Date: 2021/5/29 14:45
 */
public class Context {

    //将这个数据放到配置文件中
    static Map<String,String> config = new HashMap<>();
    static Map<String,Strategy> configBean = new HashMap<>();
    static {
        config.put("strategyA","mark.strategy.transform.ConcreteStrategyA");
        config.put("strategyB","mark.strategy.transform.ConcreteStrategyB");
        config.put("strategyC","mark.strategy.transform.ConcreteStrategyC");
        //预加载提前做好的策略
        for (Map.Entry<String,String> entry:config.entrySet()) {
            Class strategyClass = null;
            try {
                strategyClass = Class.forName(entry.getValue());
                configBean.put(entry.getKey(),(Strategy)strategyClass.newInstance());
            } catch (Exception e) {
                throw new RuntimeException(e);
            }

        }
    }

    private Strategy strategy;

    Context(String type){
        try {
            if(configBean.containsKey(type)){
                this.strategy = configBean.get(type);
            }else {
                Class strategyClass = Class.forName(config.get(type));
                this.strategy = (Strategy)strategyClass.newInstance();
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    public void ContextInterafce(){
        strategy.Algorithmlnterface();
    }
}
java 复制代码
package mark.strategy.transform;

/**
 * 功能描述:
 *
 * @Author:makang
 * @Date: 2021/5/29 14:48
 */
public class Client {
    public static void main(String[] args) {
        Context context;
        //前端通过下拉框选择不同的类型;下拉框中的值,也是通过配置文件进行读取的
        context = new Context("strategyA");
        context.ContextInterafce();
        context = new Context("strategyB");
        context.ContextInterafce();
        context = new Context("strategyC");
        context.ContextInterafce();
    }
}

四、总结

1.通过知识的综合运用,使得软件工程落地更加明确

2.何时使用策略:单一入口,单一出口的情况下;内部需要根据不同条件进行不同策略执行的时候使用

3.对策略模式概念的深度理解:算法家族=Strategy父类、分别封装起来=子类、让它们之间可以相互替换,算法的变化=多态、不会影响到使用算法的客户端=客户端满足开闭原则但是不太彻底

五、升华

原则是用来严格遵守的,变是永远不变的。

相关推荐
nnsix16 小时前
设计模式 - 建造者模式 笔记
笔记·设计模式·建造者模式
cui178756817 小时前
矩阵拼团 + 复购拼团:新零售最稳的复购模式,规则简单
大数据·人工智能·设计模式·零售
百珏17 小时前
[灰度发布]:全链路透传组件:APM、自研方案与 Java Agent 的实现取舍
后端·设计模式·架构
likerhood19 小时前
设计模式 · 享元模式(Flyweight Pattern)java
java·设计模式·享元模式
AI大法师19 小时前
从 Adobe 焕新看品牌系统升级:Logo、主色、字体与产品体验如何重新对齐
大数据·人工智能·adobe·设计模式
贵慜_Derek20 小时前
《从零实现 Agent 系统》连载 03|控制循环:感知—决策—行动—反思
人工智能·设计模式·架构
nnsix20 小时前
设计模式 - 原型模式 笔记
笔记·设计模式·原型模式
nnsix21 小时前
设计模式 - 适配器模式 笔记
笔记·设计模式·适配器模式
asdfg125896321 小时前
一文理解软件开发中的“设计模式”
java·设计模式·软件开发
云飞云共享云桌面1 天前
SolidWorks 服务器通过云飞云共享云桌面10人研发共享方案
运维·服务器·3d·设计模式·电脑