设计模式重构+消除类型码 switch if else 语句

类型码+工厂+多态

看下面这个类 把他当做一个查询类把 根据职位种类 返回工作内容

类里有大量的静态常量类型码
练习: 一步步改进
在这里插入图片描述

  • 当前类违反开闭原则 如果想要再加入一种职务类型 那就要修改原代码 可扩展性低
  • 当前类职责过多 又承担work功能 又包含大量静态常量类型码的判断功能

以子类替代类型码 创建继承结构

观察work其实非常像简单工厂模式 用if else type来equals 返回指定产品

以类型为基类 创建类型码子类 这个继承结构

  • 可以使用多态来进行表达式的简化 因为多态本意就是按照不同类型产生不同对象
  • 增强扩展性 无需修改代码 增加类型码就直接新写个子类
  • 解耦

在这里插入图片描述
创建好的类型在work类中如何引入 如何被用

拒绝用类型码子类构造函数创建具体类型码子类

在这里插入图片描述
现在关于类型码的声明和switch都消除了
下面要关注的是如何将类型码子类引入到dirtywork中
在这里插入图片描述

我们将Worktype维护在类里 调用者并不知道有这个类 在构造函数里将类型已经设置 赋值 下面我们重点看一下这个获取类型码子类实例的函数有多少种实现的可能

这个函数的出现是因为我们有最外层Dirtywork,所以封装了一层在他的构造函数中。平时可能没有这一层,我们直接在客户端使用下面这几种模式的代码就行

创建类型码方式从构造函数转变为:工厂模式/枚举类/MAP集合

创建类型码子类实例对象,才能进行work操作于是接收kind创造对象成为下一个需要考虑的问题
我想既然是类型码已经规定好了都有那些子类对象 可不可以提前创造出来取对象 而不是调用一下就创建一次新对象

不要以为可以通过手段让类型码删除了 通过传递的参数来循环遍历匹配也好 多态返回具体子类也好 一定要涉及到把所有类型码都放到一个数据结构进行承装这个工作 设计模式只是增强程序的扩展性 松耦合 让新增加类型码不违反开闭原则 让类单一原则 只是一直在把函数网外托 无法解除这核心逻辑

用枚举类

新增类型码的时候只需要 新写一个继承的类型码子类 并且在枚举类中新维护一句就可以了 不会修改原来的dirtywork 可扩展性强

public enum WorkTypeEnum {

    CODERENUM("coder",new Coder()),

    HRENUM("HR",new HR()),

    DESIGNERENUM("designer",new Designer());

    private String kind;
    private WorkType workType;
    WorkTypeEnum(){}

    WorkTypeEnum(String kind, WorkType workType) {
        this.kind = kind;
        this.workType = workType;
    }
    public  static WorkType match(String kind) {
        for (WorkTypeEnum value : WorkTypeEnum.values()) {
            if(kind.equals(value.kind)){
                return value.workType;
            }
        }
        return null;
    }
}

用工厂函数去代替子类型码每次的构造函数创建对象

在这里插入图片描述

策略

上面是使用继承结构+用类代替类型码 但是如果无法使用继承结构 或者if else类型码不是唯一的 不是只有一种类型码 就要考虑策略模式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值