类型码+工厂+多态
看下面这个类 把他当做一个查询类把 根据职位种类 返回工作内容
类里有大量的静态常量类型码
练习: 一步步改进
- 当前类
违反开闭原则
如果想要再加入一种职务类型 那就要修改原代码可扩展性低
- 当前类职责过多 又承担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类型码不是唯一的 不是只有一种类型码 就要考虑策略模式