对于23种设计模式的学习,需要掌握的是“道”,而不只是“术”
设计模式是一门艺术,因为它们来源于生活,不要为了套用设计模式而去使用设计模式。我们在编写程序的时候用好设计模式可以防范于未然,它们可以很好地提供一种解决问题的方案。从古至今,我们在遇到问题的时候,都会去寻求帮助,咨询懂的人,或者去图书馆查阅资料,或者在电脑前面搜索,等等方法。在学习23种设计模式之前我们必然需要学习软件架构的设计原则,下面用一句话来概括这七大设计原则。
更多设计模式学习视频资料,添加公众号:Java架构师联盟,回复Java即可查看获取方式
一、一句话总结设计原则
二、设计模式简介
建筑师克里斯托佛·亚历山大在1977/79年编制了一本汇集设计模式的书,但是这种设计模式的思想在建筑设计领域里的影响远没有后来在软件开发领域里传播的广泛。
肯特·贝克和沃德·坎宁安在1987年,利用克里斯托佛·亚历山大在建筑设计领域里的思想开发了设计模式并把此思想应用在Smalltalk中的图形用户接口(GUI)的生成中。一年后埃里希·伽玛在他的苏黎世大学博士毕业论文中开始尝试把这种思想改写为适用于软件开发。与此同时James Coplien 在1989年至1991年也在利用相同的思想致力于C++的开发,而后于1991年发表了他的著作Advanced C++ Programming Styles and Idioms。同年Erich Gamma 得到了博士学位,然后去了美国,在那与Richard Helm, Ralph Johnson ,John Vlissides 合作出版了《设计模式:可复用面向对象软件的基础》(Design Patterns - Elements of Reusable Object-Oriented Software) 一书,在此书中共收录了 23 种设计模式。
这四位作者在软件开发领域里以“四人帮”(英语,Gang of Four,简称GoF)而闻名,并且他们在此书中的协作导致了软件设计模式的突破。有时,GoF也会用于代指《设计模式》这本书。
设计模式是前人经验的总结,提供给后人去借鉴使用的,前人种树后人乘凉。它不但可以解决复杂的业务问题,也可以帮助我们提高代码的可读性、扩展性,降低维护成本。下面对GoF23种设计模式进行归纳和总结。
2.1 创建型
创建型全部是关于如何创建实例的。这组范例可以被划分为两组:类创建范例及对象创建范例。类创建实例在实例化过程中有效的使用类之间的继承关系,对象创建范例则使用代理来完成其任务。
抽象工厂 (Abstract Factory)
建造者 (Builder Pattern)
工厂方法 (Factory Method pattern)
原型 (Prototype pattern)
单例模式 (Singleton pattern)
2.2 结构型
这组都是关于类及对象复合关系的。
适配器(Adapter pattern)
桥接(Bridge pattern)
组合(Composite pattern)
装饰器(Decorator pattern)
门面(Facade pattern)
享元(Flyweight pattern)
代理(Proxy pattern)
2.3 行为型
这组都是关于对象之间如何通讯的。
职责链(Chain-of-responsibility pattern)
命令(Command pattern)
翻译器(Interpreter pattern)
迭代器(Iterator pattern)
中介者(Mediator pattern)
备忘录(Memento pattern)
观察者(Observer pattern)
状态(State pattern)
策略(Strategy pattern)
模板方法(Template method pattern)
访问者(Visitor)
2.4 创建型使用频率
2.5 结构型使用频率
2.6 行为型使用频率
三、一句话总结设计模式
四、设计模式之间的关系和对比
4.1 单例模式和工厂模式
在实际业务中,通常把工厂类设计为单例模式。
4.2 策略模式和工厂模式
1、工厂模式包含工厂方法模式和抽象工厂模式,它是创建型模式,而策略模式是行为型模式;
2、工厂模式的目的是封装好创建逻辑,策略模式接收工厂创建好的对象,从而实现不同的行为。
4.3 策略模式和委派模式
1、策略模式是委派模式内部的一种实现形式,策略模式关注的结构是否能够相互替代。
2、委派模式更关注分发和调度的过程。
4.4 模板方法模式和工厂方法模式
工厂方法是模板方法的一种特殊实现。
4.5 模板方法模式和策略模式
1、模板方法模式和策略模式都有封装的算法;
2、策略模式是使不同的算法可以相互替换,且不影响客户端应用层的使用;
3、模板方法是针对定义一个算法的流程,将一些有细微差异的部分交给子类实现;
4、模板方法模式不能改变算法流程,策略模式可以改变算法流程且可以替换。策略模式通常用来代理if...else等分支条件语句。
4.6 装饰者模式和静态代理模式
1、装饰者模式在于给对象动态添加方法,而代理更加关注控制对象的访问;
2、代理模式通常会在代理类中创建被代理对象的实例,而装饰者模式通常把装饰者作为构造行数。
4.7 装饰者模式和适配器模式
1、装饰者模式和适配器模式都属于包装器模式;
2、装饰者模式可以实现被装饰者与相同的接口或者继承被装饰者作为它的子类,而适配器和被适配着可以实现不同的接口。
4.8 适配器模式和静态代理模式
适配器模式可以结合静态代理来实现,保存被适配对象的引用,但不是唯一的实现方式;
4.9 适配器模式和策略模式
在适配业务复杂的情况下,利用策略模式优化动态适配逻辑。