一、设计模式的定义
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛应用的原因。一句话来讲,设计模式一般用来解决不同问题的同一表相。
二、设计模式的六大原则
1、开闭原则(Open Close Principle)
开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果,为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,需要使用接口和抽象类。
2、里氏代换原则(Liskov Substitution Principle)
面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。
3、依赖倒转原则(Dependence Inversion Principle)
开闭原则的基础,具体内容:针对接口编程,依赖于抽象而不依赖于具体。
4、接口隔离原则(Interface Segregation Principle)
使用多个隔离的接口,比使用单个接口要好。还是一个降低类之间的耦合度的意思,设计模式就是一个软件的设计思想,从大型软件架构出发,为了升级和维护方便。所以上文中多次出现:降低依赖,降低耦合。
5、最少知道原则(迪米特法则)(Demeter Principle)
一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。
6、合成复用原则(Composite Reuse Principle)
尽量使用合成/聚合的方式,而不是使用继承。
三、设计模式的三大类
其中绿色的是经常使用的几种模式。
类型 | 模式(范围\目的上讲,加粗的为类模式,不加粗的是对象模式) | 英文 | 描述 | java源码中应用 |
创建型模式(5种) | 工厂方法 | factory | 实现松耦合,可以提高扩展性。就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。 | |
单例 | singleton | 某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式。 | ||
原型 | Prototype | 将一个对象作为原型,对其进行复制、克隆,产生一个和原对象类似的新对象 | ||
抽象工厂 | abstract factory | 创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以,提高系统扩展性 | ||
建造者 | Builder | 工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性, | ||
结构型模式(7种) | (类)适配器 | Adapter | 有一个Source类,拥有一个方法,待适配,目标接口时Targetable,通过Adapter类,将Source的功能扩展到Targetable里 | |
代理 | Proxy | 为某对象提供一种代理以控制对该对象的访问, | ||
(对象)适配器 | Adapter | 将Adapter类作修改,这次不继承Source类,而是持有Source类的实例,以达到解决兼容性的问题。可以将一个接口转换成客户希望的另一个接口,方便引入外部接口,方便适配其他的接口,提高系统扩展性 | java的IO流 | |
桥接 | Bridge | 桥接模式就是把事物和其具体实现分开,使他们可以各自独立的变化 | ||
装饰器 | decorator | 装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口。装饰对象持有被装饰对象的实例可以扩展接口,提高系统扩展性 | ||
外观 | Facade | 为了解决类与类之家的依赖关系的,像spring一样,可以将类和类之间的关系配置到配置文件中,而外观模式就是将他们的关系放在一个Facade类中,降低了类类之间的耦合度,该模式中没有涉及到接口 | ||
享元 | Flyweight | 实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用 | ||
组合 | Composite | 将多个对象组合在一起进行操作,常用于表示树形结构中,例如二叉树,数等 | ||
行为型模式(11种) | 模板方法 | 很方便地实现不稳定的扩展点,完成功能的重用 | ||
解释器 | ||||
策略 | 通过新增策略从而改变原来的执行策略 | |||
命令 | ||||
责任链 | 可以很方便地增加拦截器、过滤器,实现对数据的处理,比如struts2的责任链 | |||
状态 | ||||
观察者 | 很方便增加观察者,方便系统扩展 | |||
中介者 | ||||
迭代器 | ||||
访问者 | ||||
备忘录 |
其实还有两类:并发型模式和线程池模式。用一个图片来整体描述一下:
根据作用范围来分
根据模式是主要用于类上还是主要用于对象上来分,这种方式可分为类模式和对象模式两种。
- 类模式:用于处理类与子类之间的关系,这些关系通过继承来建立,是静态的,在编译时刻便确定下来了。工厂方法、(类)适配器、模板方法、解释器属于该模式。
- 对象模式:用于处理对象之间的关系,这些关系可以通过组合或聚合来实现,在运行时刻是可以变化的,更具动态性。
strategy(策略)模式的意图是?