今天在面试的时候被问到自己策略模式怎么用的时候有被问懵到,以至于明明是自己的代码在脑海里已经混乱了,而且面试官提出的还是没有更好的利用设计模式也让我思考了一下我之前的代码到底是怎么实现的,重新梳理下策略模式,工厂模式,装饰者模式。
策略模式:
定义:一个类的行为或其算法可以再运行时更改,属于行为型模式。定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。
使用情况:当行为需要区分的时候。
工厂模式:
定义:属于创建型模式,提供了一种创建对象的最佳方式。在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。让子类去决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。主要解决的是接口选择的问题
使用情况:明确地计划不同条件下创建不同的实例。
装饰者(包装)模式:
定义:属于结构型设计模式。对客户端透明的方式来动态扩展对象(对扩展开放,对修改关闭),可替代继承。动态给对象添加额外职责。
构成:
抽象组件(方法规范)
被装饰者(具体实现)
装饰者组件(实例引用)
具体装饰(给构建对象装饰附加的功能)
使用场景:某对象有一个核心功能,现在有一个其衍生对象,扩展了若干功能,但是原对象也有使用场景。
表格化
装饰者模式 | 工厂模式(抽象) | 策略模式 | |
模式结构 | 结构型设计模式 | 创建型设计模式 | 行为型设计模式 |
关注点 | 较轻型改动,且在原有对象上新加特性 | 创建一个对象 | 封装选择(多态)可互相替换,不会影响到使用算法的客户。 |
实现方式 | 方法一层套一层 | 子类方法重写 | 子类方法重写 |
解决的问题 | 组装相关需求 | 接口选择 | 选择不同的方法 |
优点 |
|
|
|
缺点 | 对象具有相似性,有可能给查错增加困难 | 比较死板,一改全改,难以应对全新“产品” |
|
而我的设计模式的结合使用是先用工厂模式判定相关人员的身份(子类)再用if-else结合枚举选择策略对应类,最后使用装饰者模式去完善对应的新增功能(或者用切面)都行。但是依旧会存在if-else这样比较死板的添加,新想法是通过反射去获取相关策略继承类下的子类,但是感觉有点鸡肋。持续思考中。为啥mybatis源码看起来那么优雅讲道理,是我理解不够。