设计模式(Design Patterns)——可复用面向对象软件的基础
模式,是在某情境(context)之下,针对某问题的某种解决方案。
设计模式是解决一个经常重复发生的设计问题。
一个好的软件设计,在系统的可维护性和可复用性两方面都有不错的表现。能够提高系统可维护性的同时,提高可复用性的指导原则,称为设计原则。下面简单介绍了六大设计原则。所谓设计模式就是对这些设计原则在具体场景下的设计方案。
本文的目的是概述六大设计原则以及经典的几大类设计模式,具体详述会另行整理,写作计划是,每完成一个主题,就会将本文中预留超链补全。也是对自己的一种督促。
一、设计模式的分类
设计模式主要分为创建型模式、结构型模式、行为型模式三种类型。
创建型模式,共5种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共7种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共11种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
还有两类:并发型模式和线程池模式。没有归类到23种设计模式之中。
今后的文章中,我将一一介绍Java中23种设计模式的常用场景。
二、设计模式的六大原则
1 开闭原则(Open Close Principle)
所谓开闭原则(OCP),指的是一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。
这个原则说的是,在设计一个模块时,应该是这个模块在不被修改的前提下被扩展。
详细介绍见《开闭原则详述》
2 里氏代换原则(Liskov Substitution Principle)
里氏代换原则(LSP)指的是,一个软件实体如果是用的是一个基类的话,那么一定适用于其子类,而且它根本不能察觉出基类对象和子类对象的区别。
LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。
详细介绍见《里氏替换原则详述》
3 依赖倒转原则(Dependence Inversion Principle)
依赖倒转原则(DIP)要求客户端依赖于抽象耦合,表述是:
抽象不应当依赖于细节;细节应当依赖抽象。
另一种表述是:
要针对接口编程,不要针对实现编程。
如果设计师希望遵守OCP,那么DIP便是达到要求的途径。
详细介绍见《依赖倒转原则详述》
4 接口隔离原则(Interface Segregation Principle)
接口隔离原则(ISP)讲的是:使用多个专门的接口,比使用单一的总接口要好。
从客户类的角度来讲:一个类对另外一个类的依赖性应该是建立在最小的接口上的。
详细介绍见《接口隔离原则详述》
5 迪米特法则(最少知识原则)(Law of Demeter )
迪米特法则(LOP)又叫最少知识原则(Least Knowledge Principle,LKP),就是说,一个对象应当对其他对象有尽可能少的了解。
详细介绍见《迪米特法则详述》
6 合成复用原则(Composite Reuse Principle)
CRP就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过向这些对象的委派达到复用已有功能的目的。
要尽量使用合成/聚合的方式,而不是使用继承。
详细介绍见《合成复用原则详述》
总结
设计模式本身并不能保证一个系统的可复用性和可维护性,但设计思想可以指引我们持续改进。一个好的设计,不会在投入之后再进行大量修改。这简单的目标恰恰是让我们可以持续精进的驱动力。
参考书籍:
1.《Java与模式》,电子工业出版社,阎宏
2.《Head First 设计模式(中文版)》,中国电力出版社
网友评论