软件工程-----设计模式
一、设计模式概念
以下从复用模式的高中低三个等级给设计模式分类。
二、设计模式分类
主要分为三大类:创建型模式、结构型模式、行为型模式。
创建型模式:通过采用抽象类所定义的接口,封装了系统中对象如何创建,组合等信息。
结构型模式:主要用于如何组合已有的类和对象以获得更大的结构。
行为型模式:主要用于对象之间的职责及提供服务的分配方式。
三、创建型模式
- 抽象工厂模式:
关键字:一系列 是做系列产品的,比方说我们在创建数据库相关的一些组件的时候,用到抽象工厂的话,可以指定要创建的一系列的操作数据的这些对象,使用来操作access数据库的,那就指定是由access工厂进行生产,那么生产出来的所有部件,都是适用于access的。如果说指定的工厂是oracle的,那么生产出来的所有部件,都是适用于oracle的,就相当于它只需要指定系列名,而不需要指定具体的类,就能够生产出这一个系列所对应的,所需要的类的对象。
- 构件器模式:
关键字:指定不同部件 咱们要构造一个复杂的对象,这一个是由多个对象组合起来的,多个对象都需要有,但是构造不同的最终的实例,可能需要的部件不太一样,这时可以用一个构件器模式,把所需要的各个部分封装起来,对各个部分,可以指定不同的部件,最后形成所需要的实例。
- 工厂方法模式:
关键字:实例化推迟 我们在用工程方法来创建的时候,我可以在运行的时候再指定我要创建的是那一个类的对象,所以使得实例化过程推迟了。工厂模式的意图是,定义一个用于创建对象的接口,让子类决定实例化哪一个类,类的实例化延迟到子类。
- 原型模式:
关键字:拷贝 为什么不用new()而用拷贝现有对象的模式?因为用new()创建新对象,问题在于所消耗的资源比较多,如果只是通过拷贝,由于是拷贝的内存区域,根本不用考虑里面涉及的逻辑是怎么样的,直接把内存copy一份出来,这样效率肯定是最高的。就类似写代码,直接把原来的代码copy出来改一下,肯定比重新写效率高。用原型模式主要考虑的就是效率问题。
- 单例模式:
保证一个类只有一个实例,无论在系统中哪个位置调用,只有这一个实例,不会有第二个。很多时候我们需要这种场景,比如浏览器,可以打开多个网页,就是不同的标签页,浏览器的主窗口只有一个,这里就用到了单例模式,当你要打开一个新的标签页的时候,它会找到主窗口的句柄,然后在主窗口里开启一个新的标签页。
四、结构型模式
- 适配器模式:
类似电源适配器。在软件领域,我们可以用到的对外的接口很多,每种不同的厂商给我们提供了不同的接口,现在要用到这些接口并且希望用一致的方法用,就用到了适配器模式。
- 桥接模式(常考):
关键字:分离 看类图时,桥接模式就是如上图的构造。非常典型的桥的结构,为什么要这样做呢?它往往是这样的应用场景:原来呢,是一棵大的类树,如果要用继承的方式来走的话,这棵树会非常的庞大,然而我们发现,这棵树中的变化点有两个方面,所以就把它拆成两个不同的方面,让它在两个不同的维度上形成两棵树,然后把它桥接起来,这样就相当于把继承树进行了拆分,简化问题。
- 组合模式:
要表达的是以组合树的形式表达整体和部分的关系。典型代表就是树形目录结构。比如一个目录,他下面可以有目录,也可以有文件,底下的目录,又可以有目录和文件,这其实就折射了整体和部分,到了部分呢,又可以有其他部分,这样一种结构。这种结构应用非常广泛,比如操作系统的树形目录结构,还有比如在一个公司里面涉及部门,部门下又有分支机构等。
- 装饰模式:
顾名思义,是一层一层往上加,关键字“附加职责”。如何附加呢?他会有一个基础的类,其他的东西一层一层往上面叠加就行了。典型实例比如星巴克咖啡,我们可以加糖,加牛奶等,这个过程就可以用到装饰模式,因为有些人要加糖,有些人要加奶,有些人既要加糖又要加奶,就可以把这些外面的职责一层一层附加上去。
- 外观模式:
如上图,一个系统有多个边界的类,有不同职能,都需要和外界联系,这样看上去就比较复杂,同时外界来了解你的时候,也会比较困难,因为需要和多个接口类交互,因为需要和多个类交互,相当于有多个窗口对外,这是有人就想到一个办法把这个问题简化:这些“窗口”都和一个类进行交互,这个类再和外部系统交换。
- 享元模式:
记住概念就行了。
- 代理模式:
记住概念就行了。
五、行为型模
- 职责链模式:
有一个请求者,接受者会有多个,多个接收者被连成了一个串,请求者发送一个请求过来,如果说第一个接收者能够处理请求,那就直接响应了,如果不能响应,就传到第二棒,如果还不能响应,就传到第三棒.......直到能处理了,就回复。什么时候用到它呢?比如财务审批,最小的一档金额,比如500块以内,部门经理能批,第一棒对应部门经理,500块以内的请求,第一棒就批了。第二棒是副总,能处理1000块以内的请求,以此类推。所以职责链能够传递请求,好处在于,一个请求者不需要和多个接收者交互,只需要传送一次,接下来的工作后面的接收者处理就行了。
- 命令模式(常考):
关键字:日志 最大的特点:命令不是一个简单的消息,已经封装成一个对象,然后引入命令模式可以很方便的进行日志记录,可以撤销之前所进行的命令操作,有了撤销功能。
- 解释器模式:
相当于在构造一个虚拟机。构造了一个“解释器”来解释相应的语言,来进行相关的处理操作。
- 迭代器模式:
在开放过程中应用相当广泛,因为开发过程中经常用到一种类型----枚举类型,这种类型要进行遍历操作时,只需要对象指针.next就能找到下一个集合对象,这里面就用到了迭代器模式。
- 中介者模式:
意思是本来两者之间可以直接通信,但是现在通过中介通信,比如多个对象之间,引入了一个中间件,就起到了这样的效果,
如果说有一些改变的话,不需要修改对方,只需要修改中介器就可以了。
- 备忘录模式:
其实就是把它记下来,意思是我们会开辟一个空间,把对象的相关的信息存下来,一旦存下来,就可以用来做恢复的操作。
- 观察者模式:
比如平时用到的excel,A1单元格填了1,A2单元格填了2,A3=A1+A2,那么A3等于2。一旦把A1的值改成10,A3会自动变成11,这就是观察者模式,A3观察了A1,所以一旦A1发生变化,会通知A3,让它也发生变化。
- 状态模式:
意思是会状态做成相应的类,当状态发生改变,就能够改变当前弄够执行的相应的行为。我们只要做好状态的变迁,当变迁到当前的状态时,然后在做什么操作呢,会根据当前的状态的情况,他的行为呢也就变化了,相关场景:会员。会员会有不同的级别,可以享受不同折扣,如果把会员状态定义成类,每一种类能过做的行为呢,就已经做好了相应的设计了。
- 策略模式:
意思是比如我要对一组数进行排序,我可以用到的算法有快速排序法、冒泡法等多种,这是可以通过设置方便的切换我用哪种方法进行排序。所以涉及到灵活的多种方案的切换的时候,就可以用到策略模式。
- 模板方法:
了解概念就行。
- 访问者模式:
了解概念就行。