什么是软件设计模式
软件行业的人,大都听过GoF(Gang of Four)总结的23个设计模式,设计模式其实并不是软件行业的专有名词,早在上世纪70年代,建筑大师Christopher Aexander针对城市建筑的模式,指出模式就是一个不断发生的问题和该问题的解决方案。
在GoF 编写的《设计模式:可复用面向对象软件的基础》一书中,对设计模式的定义是:对被用来在特定场景下解决一般设计问题的类和互相通信的的对象的描述。
通俗地讲,软件设计模式就是对某一类软件问题的通用解决方案。
设计模式主要有哪些
GoF在书中总结了23种设计模式,主要分为三类。
第一类为创建类
创建类设计模式中,要解决的是对象的创建问题,一般面向对象的编程,是先定义好所有类,然后将类实例化为对象,可现实软件开发过程却没有这么简单。
创建类设计模式中最有名的是工厂模式,该模式要解决的一个问题是,在程序中直接实例化对象时,为避免过多的参数及控制代码,造成程序与被实例化对象过多耦合,故设计出一个工厂类,专门用来实例化所需要的对象。客户程序只需要与工厂类打交道,调用工厂类的创建方法,将其它所需要的对象创建出来。
由工厂模式,又衍生出虚拟工厂模式,与工厂模式不同的是,工厂模式只能创建出同一类对象,比如客户给不同尺寸,要求工厂生产某型号的鞋子。而虚拟工厂是一次性创建出一组对象,且这组对象之间还有一定关联关系,比如客户要求一个大工厂生产某身高尺寸的一整套衣服,包括衣服裤子和鞋子。
创建类设计模式中,还包括原型,构建者,单例这三种模式。
第二类为结构类
随着系统功能的不断扩展,功能模块间的复用也越来越多,类与对象间的结构也变得越来越复杂,设计不好,类之间关系将变得混乱,结构类设计模式,正是为了解决这类关系混乱问题的。
外观模式是一个比较典型的结构类设计模式,当有多个子系统需要被调用时,如果各个子系统接口不同,客户程序需要与各个子系统接口打交道,一来麻烦,二来耦合性也大大提高。为了解决这个问题,外观模式在所有子系统前套上一层统一接口的外观类,外部程序调用时则变得非常简单,与统一规格的外观类打交道即可。
适配器,桥接,组装,享元,代理 也都属于结构类设计模式。
第三类为行为类
行为类设计模式比较多,总共有11个。
其中观察者模式是为了解决一个对象状态变化需要同时更新到多个对象中的问题。
一般的做法,要不是由被更新的对象定时查看目标对象的状态,就是由目标对象实时直接调用被更新对象的方法。问题是前者实时性不够还浪费计算资源,后者则耦合度很高,每次需要更新的对象数量或者接口规格变化时,都需要修改目标对象的更新方法。观察者模式引入一个注册类,所有需要更新的对象类都继承注册类,拥有统一的更新接口规则,这样目标对象状态发生变化时,只需要依次调用所有注册类的实例更新方法即可,很好地解决了这个问题。
一个很典型的例子是员工离职时,停用该员工各系统的账号问题。
职责链则是为了解决任务在多个对象间传递的问题,最典型的一个例子是按金额大小审批到不同层级问题,假设每个层级的主管有不同审批额度,如果由调用程序自己来决定要送到哪几个主管审批,程序逻辑将非常复杂。职责链模式为每层主管映射一个对象,每个对象设置自己的可审批额度和自己的上一级主管,这样调用程序只需要将审批任务交给自己的直属主管即可,之后任务根据审批额度一层一层自动流转到符合额度要求的主管那里完成最终审批。
除了这两个设计模式,行为类模式还包括命令,模板,访问者,备忘录,状态,策略,中介者,迭代,解释器等9个模式。
使用设计模式的好处
在开发或者设计系统时,根据问题类型参考现有设计模式,一方面可以借用前人经验,巧妙高效的解决问题,二来,也方便与大家交流设计,节约沟通成本。
网友评论