开源项目中的设计模式
一个软件工程类的项目,一般包含两部分:
难点的技术攻关:需要用基础理论来建立模型,通过原型来验证模型的可行性。这个难度比较大,一旦搞定,所有人都可以快速使用这个模型解决类似问题;
使用模型进行大规模的生产实践:这是一个工程化的问题,需要通过合理的设计来组织大规模人力、劳力资源。这是一件复杂的事情,且会不断变化的。
这个复杂的事情,我们可通过一些大牛总结的经验来不断减小这个复杂度,这个经验其实就是下面介绍的设计模式
设计模式简介
设计模式是一种可重复使用的解决方案,每一种模式都描述了一种问题的通用解决方案。
一个设计模式包含四个部分:
模式名字:用少量的字表达这种设计;
待解决问题:什么场景下使用这个模式(何时何处);
解决方案:设计的元素、关系,是抽象的,不是具体实现;
结论:方案的利和弊,对系统的弹性、扩展性、可移植性的影响;
按功能分类:
创建模式(Creational Patterns):对类的实例化过程的抽象
结构模式(Structural Patterns):将类或对象结合在一起形成更大的结构
行为模式(Behavioral Patterns):对在不同的对象之间划分责任和算法的抽象化
按方式分类:
类模式:以继承的方式实现模式,静态的
对象模式:以组合的方式实现模式,动态的
主要的设计模式介绍
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
版权声明: 本文为 InfoQ 作者【dony.zhang】的原创文章。
原文链接:【http://xie.infoq.cn/article/56f02fab5f298057f735fec91】。文章转载请联系作者。
评论