【设计模式实战篇】工厂策略规则实战

167 阅读3分钟

需要的技术能力

1,对于基础的设计模式有一定了解,例如工厂和策略

2,有一定代码基础

文章主体开始

基础知识

杜撰的需求背景

(由于不能够将需求直接写在网络上,那么我们假设了一个脱离现实的情况)

爬虫爬到了一批数据,数据有不同的厂家,每个厂家有不同的处理方式,不同的厂家对于不同的商品,有不同的打折方式

打折方式说明:买多少件可以打折,买一定的数量可以继续打折,例如1000件变九折,2000件变八折,以此类推,几折封顶,那么那怕你买10亿件,也是这个封顶的折数

厂家1:

产品1:价格默认是100块钱,买1000件开始可以打九折,最高九折,厂家信息,厂家地址,等等其他信息忽略

产品2:价格默认是1000块钱,买1000件开始可以打九折,最高九折,厂家信息,厂家地址,等等其他信息忽略

厂家2

产品3:价格默认是700块钱,买1000件开始可以打九折,最高九折,厂家信息,厂家地址,等等其他信息忽略

产品4:价格默认是10000块钱,买1000件开始可以打九折,最高九折,厂家信息,厂家地址,等等其他信息忽略

厂家3

产品5:价格是500块钱,买1000件可以九折,2000件八折,3000件七折,4000件六折,5000件五折,最高五折,厂家信息,厂家地址,等等其他信息忽略

产品6:价格是10000块钱,买1000件可以九折,3000件八折,5000件七折,最高七折,厂家信息,厂家地址,等等其他信息忽略

厂家5,.。。。。

厂家6,.。。。。。。

描述还是不怎么对,但是将就看吧

版本1

我们可以简单的设计一下,每个产品和处理方式都有自己的关系,那么工厂和策略简直是完美方案

写一个接口,作为处理方式的父类,他的子类都是每个处理方式的实现类(策略设计模式)

写一个工厂,在工厂里面维护每个产品对应的处理方式

那么我们在使用的时候,直接可以通过工厂,入参为产品id,拿到处理方式的实现类

扩展思考

假如后续要继续增加厂家或者产品,直接在工厂维护产品id和处理方式的对应关系,以及处理方式由于新增了产品id需要重新新增一个实现类

版本1的缺陷

1,产品会越来越多,处理方式的实现类是不是越来越多了?

2,这样子是不是耦合度很高,不利于后续扩展?

3,想一想上面的处理方式很多地方是不是共用的,能不能将多个处理方式合并归类,抽取成为同一个

版本1缺陷的解决方案

在产品id和处理方式中间,再加一层,作为规则层

版本2

新增规则的概念,每个产品id只是对应一个规则,每个规则都有自己的实现类,为同一类产品id进行服务

(以下名字为临时使用,请不要这么写,会对项目产生困扰)

维护一个RuleRequest对象

public class RuleRequest {
    // 当前的请求是哪个规则
    private SqlRuleEnum sqlRuleEnum;
    // 规则对应的处理信息
    private Map<String, Set<Double>> ruleMap;
    // 特殊的请求信息
    private Map<String, Object> requestMap;
}

维护一个规则的枚举

public enum SqlRuleEnum {
    RULE_ONE(1, "处理方式1"),
    RULE_TWO(2, "处理方式2"),
    RULE_THREE(3, "处理方式3"),
    ;
}

其他

vx公众号:Java雪糕