24种设计模式的归纳

关于设计模式是什么这里就不作讲解,可以自行去看其它文章,这里我主要就是收集的别人讲得比较浅显易懂的文章进行了归纳,然后又加上了自己的理解

在学习设计模式之前首先要了解面向对象的七大原则

面向对象设计的7大原则S.O.L.I.D 迪米特 合成复用

1.S:单一职责 设计的类,接口,对象都只有一个单一的职责(并非单一方法,可以理解为实现某个单一的功能)

2.O:开闭原则 对修改关闭,对扩展开放

(开闭原则具有理想主义的色彩,它是面向对象设计的终极目标。其他设计原则都可以看作是开闭原则的实现手段或方法)

3.L:里氏替换原则 子类可以扩展父类的功能,但不能修改父类的功能

4.I:接口隔离原则 一个接口中不应该存在实现它的子类用不到的方法,否则实现它的子类就需要去实现子类不应该实现的方法。

5.D:依赖倒置原则 高层不应该依赖于低层,高层和低层都应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。

6.迪米特法则:知道得越少越好,即一个类应该保持对其它对象的最小了解程度

7.合成复用: 组合优于继承,能用组合的地方就不要用继承

接下来我们来看看设计模式

设计模式是一种软件的设计思想,它不光可以用在Unity中,只要是需要设计软件都可以使用设计模式。设计模式可以让代码结构更加清晰

设计模式有24种,可以分为三大类,分别是创造型模式,结构型模式,行为型模式

创建型模式有

1. 简单工厂模式 将New对象进行封装,用户直接调用封装函数就可以获得对象

2. 工厂方法模式 解决了如果要扩展产品,需要对工厂代码进行修改的问题,也就是给工厂加一层抽象来实现开闭原则

3.抽象工厂 增加多个产品的抽象,这样就可以实现一个工厂做多个产品(因为工厂方法只能一个工厂生产一个产品)

4.单例模式一个类只允许有一个实例

5.原型模式创建相同的对象时不用new,而是在已有对象的基础上进行拷贝,C#提供了ICloneable接口,实现该接口就可以实现深拷贝(深浅拷贝的区别这里就不再赘述)

6.建造者模式 工厂只关心能拿到对象。建造器关心对象的初始化顺序和参数组合输入。工厂模式关心整体(因为它是直接new了一个具体的产品,没有将具体构建产品的步骤进行拆分),建造者模式关心细节,(因为它将一个产品构建时的每一步都分离了出来)这里直接看两张对比图就能够发现区别,其中建造者模式的指挥者可以理解为包工头,构建者可以理解为工人(有高级,中级,普通工人)

 结构型模式

7.代理模式 类A需要访问类B的方法,通过代理模式,将类B的方法封装到代理对象中,并且还可以增加一些方法,类A直接通过代理对象调用,这样就保护了类B,而且还可以方便拓展方法,代理模式和适配器模式的区别(代理对象和真实对象需要实现代理接口,这里可以看出来代理模式和适配器模式结构很像,但前者更关注在目标方法的基础上增强功能,后者更关注接口兼容)。代理模式和命令模式都是通过中间人达到目的,但是也有区别。装饰模式主要关注在不改变接口的情况下增强对象的功能,而代理模式主要关注在对象访问的过程中添加一些额外的行为或控制(代理模式类A,类B都实现接口C;装饰器模式是类A,类B(装饰器)实现接口C,随后类D继承自类B目)。代理模式和装饰器模式区别 代理模式和装饰器模式区别

8.适配器模式 核心是复用已有的接口或者方法,让原本因接口(这里的接口并不是Interface,这是一个统称,可以理解为供外部使用的一个方法)不匹配不能一起工作的两个类可以协同工作,简而言之就是类A的方法一不能在类B中使用,这个时候使用适配器模式就可以在类B中使用适配器转换好的类A的方法。(适配器类和适配者都需要实现目标接口)

9.装饰器模式 各类扩展方法时,不采用继承生成子类的方式,而采用该方式,使用对象关联代替继承,增强了类的功能

10.桥接模式 将对象和行为进行分离,方便多维度组合对象,桥接模式是合成复用法则的具体实现(策略模式和桥接模式的最大区别在于,前者是为了封装一系列算法,使算法可以替换使用,后者的目的是为了事物和抽象分离,多维度组合对象)

11.组合模式 学校,学院,系如果用传统方式,就需要将学院看成是学校的子类,系是学院的子类,组合模式解除了继承关系,而是看做树的结构,以节点的形式构成,这样就方便了校,学院,系的添加,删除,遍历等。

12.享元模式享元模式的核心是对象池,使用对象时,先从对象池中获取对象如果对象池中没有,创建一个,放入对象池,然后再从对象池中获取(该对象池和传统意义上的对象池还不一样,享元模式的对象池中的对象是可以被多个模块所共用的,例如模块一和模块二都用到了对象A,使用享元模式就可以将对象A放在对象池中,供多个模块使用;而传统意义上的对象池式一个对象池中有多个相同的对象,一个对象在被一个模块使用时就不能被另一个模块使用。一句话总结就是享元模式中的一个对象可以被多个模块使用,传统意义上的对象池中的对象只能被一个模块使用)

13.外观模式 加一层外观层(非抽象),将众多子系统全部封装到该层,该层向外部提供一个接口即可,可以说外观模式是迪米特法则的实际应用

行为型模式:

14.观察者模式 观察者模式定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新,主要用于解耦代码观察者模式的具体实现就是Unity中的事件监听与广播

15.模板方法模式 算法的流程步骤固定,只是计算的内容不同时就可以使用模板方法(比如要去银行办理一些业务,必须经历的流程是取号. 排队. 办理业务. 离开。现在除了办理业务有所不同之外,其余的步骤都是相同的,这时候我们可以使用模板方法模式来设计)

16. 命令模式  增加一个command的具体实现对象,命令对象需要指定具体的执行者,命令对象的执行方法(execute)是对执行者的一些方法的封装,调用者可以持有命令的对象或者命令对象集合,调用者的执行方法就是执行持有的命令对象的execute方法,这样只需要创建不同的命令对象(指定不同的执行者方法),将该命令对象赋值给调用者,就可以实现调用者调用不同的执行者的方法,UML图参考链接

17. 状态模式 状态模式的具体实现就是Unity中的FSM有限状态机

18.职责链模式一个请求的处理,需要多个对象中的一个或若干个对象协作进行处理;采用链表的思想,每个对象都是一个节点,对象中又包含下一个节点。

19.解释器模式 为了解释一种语言 , 而为语言创建的解释器;

20.中介者模式 用于多个对象的相互通信,增加一个中介者角色,让原本的网络结构变成星型结构 (观察者模式:只能从一的一方循环的通知,属于单向。(好比上课,只能老实授课给班上所有的学生,反过来不行)中介者模式: 可以从任一方循环通知,属于双向。(好比分享会,每个人都可以分享自己的事情给别人)

21.访问者模式需要对一个对象结构中的对象进行很多不同操作(这些操作彼此没有关联),同时需要避免让这些操作"污染"这些对象的类,意思就是有一系列对象,有不同的角色想要获取对象中的数据,不同的角色关注点不一样,角色一想要获取对象的数据A,角色2想要获取这一系列对象的数据B,就可以用访问者模式。

22.策略模式 最大的特点行为之间可以相互替换,因此可以实现算法的可替代使用的功能

23.备忘录模式 用来记录一个对象的内部状态,备忘录对象作为一个中间对象,需要记录状态的对象可以创建一个备忘录对象来记录当前状态,管理者用备忘录栈中存放多个备忘录对象。创建一个对象新的状态的备忘录后可以放进备忘录栈中,方便以后恢复读取数据

24.代器模式让你能在不暴露集合底层表现形式(列表、栈和树等)的情况下遍历集合中所有的元素。代码参考

猜你喜欢

转载自blog.csdn.net/qq_62947569/article/details/135045265