开源项目中的设计模式

用户头像
dony.zhang
关注
发布于: 2020 年 06 月 24 日
开源项目中的设计模式



一个软件工程类的项目,一般包含两部分:

  1. 难点的技术攻关:需要用基础理论来建立模型,通过原型来验证模型的可行性。这个难度比较大,一旦搞定,所有人都可以快速使用这个模型解决类似问题;

  2. 使用模型进行大规模的生产实践:这是一个工程化的问题,需要通过合理的设计来组织大规模人力、劳力资源。这是一件复杂的事情,且会不断变化的。



这个复杂的事情,我们可通过一些大牛总结的经验来不断减小这个复杂度,这个经验其实就是下面介绍的设计模式

设计模式简介

设计模式是一种可重复使用的解决方案,每一种模式都描述了一种问题的通用解决方案。



一个设计模式包含四个部分:

  1. 模式名字:用少量的字表达这种设计;

  2. 待解决问题:什么场景下使用这个模式(何时何处);

  3. 解决方案:设计的元素、关系,是抽象的,不是具体实现;

  4. 结论:方案的利和弊,对系统的弹性、扩展性、可移植性的影响;



按功能分类:

  1. 创建模式(Creational Patterns):对类的实例化过程的抽象

  2. 结构模式(Structural Patterns):将类或对象结合在一起形成更大的结构

  3. 行为模式(Behavioral Patterns):对在不同的对象之间划分责任和算法的抽象化



按方式分类:

  1. 类模式:以继承的方式实现模式,静态的

  2. 对象模式:以组合的方式实现模式,动态的

主要的设计模式介绍

1 . 工厂模式

通过 Factory类 + 反射 + 配置文件 来实现

优点:满足开闭原则OCP

缺点:缺少编译时类型安全,只能通过默认构造函数创建

2. 单例模式

保证产生单一实例,一个类只产生一个实例。满足:

i) 性能需求: 可以减少实例频繁创建和销毁带来的资源消耗;

ii) 功能需求:多个用户使用是,便于进行统一控制(独占资源访问控制, 数据全局唯一)

特点:

i) 一定有私有的构造函数,只能通过getInstance() 方法获取

ii) 尽量将单例设计为无状态对象,只提供服务,保存状态

3. 适配器模式

场景:系统需要使用现有的类,而这个类的接口与我们所需的不同,需进行适配

应用:JDBC Driver, JDBC-ODBC Bridge

JUnit项目中的设计模式

1. 模板方法模式

是一种“类的行为模式”, 通过“继承”方法来实现,基类负责算法的轮廓和骨架,子类负责算法的具体实现。



2. 策略模式

是一种“对象的行为模式”, 通过“组合”的方法来实现扩展。

使用场景:

i) 系统需要在多种算法中选择一种

ii) 重构时,条件语句转换成策略的多态性调用



优点:

i) 将使用策略的人与策略的具体实现分离

ii) 策略对象可以自由组合

缺点:

方便添加和替换算法,但并不关心何时使用何种算法,有客户端来决定

3. 组合模式

是一种“对象的结构模式”,可用于需构造一种树形结构。比如:界面窗口,文件系统

TestSuite的实现中使用该模式

4. 装饰器模式

是一种“对象的结构模式”,在不改变对客户端的接口的前提下,扩展现有对象的功能。

也称为“包装器” Wrapper, 包装器可形成一条链。



对比:

i) 适配器:都是包装器,但转换成另外一个接口

ii) 装饰器:都是包装器,但保持接口不变



应用:

i) JUnit中RepeatedTest, TestSetup的实现中使用该模式

ii) Java Servlet中 HttpServletRequest/HttpServletRequestWrapper

iii) 同步化装饰器 Collections.synchronizedList(list)

iv) Java I/O类库: InputStream/OutputStream

Spring中设计模式

1. 依赖注入DI与控制反转Ioc

通过Ioc容器来管理Bean和依赖, 实现控制权的反转。



2. 单例模式

通过Factory创建实例,并缓存到HashMap中,后面可重Map中获取对象。

3. MVC模式

Spring MVC的简单流程:

i) 通过DisaptchServlet接管所有的Web请求

ii) HandlerMapping: request url 获取Handler(其实就是Controller), 在组装Interceptor, 返回 HandlerExecutionChain

iii) HandlerAdapter: 通过适配器模式调用 Handler中实现, 发挥ModelAndView

iv) 通过ViewResolver将 ModelAndView解析成View

v) 渲染View

发布于: 2020 年 06 月 24 日 阅读数: 80
用户头像

dony.zhang

关注

专注成就专业 2018.07.06 加入

程序员

评论

发布
暂无评论
开源项目中的设计模式