目录
一、背景介绍
最近在做产品的过程中,对于主题讨论回复内容,按照追评次数排序、点赞排序、时间排序等内容做了深入研究,通过策略模式可以很好的进行优化。
二、思路&方案
- 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父类、分别封装起来=子类、让它们之间可以相互替换,算法的变化=多态、不会影响到使用算法的客户端=客户端满足开闭原则但是不太彻底
五、升华
原则是用来严格遵守的,变是永远不变的。