大话设计模式学习笔记(29)——设计模式总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/q1052196521/article/details/79757577

各种模式样例代码git地址:https://github.com/dlovetco/designMode 例子与博客中的问题配套

创建型模式

创建型模式隐藏了这些类的实例是如何被创建和放在一起,整个系统关于这些对象所知道的是由抽象类所定义的接口。这样创建性模式在创建了什么,谁创建它,它怎么被创建的以及何时创建这些方法提供了很大的灵活性。

简单工厂

简单工厂不符合开放封闭原则:每新增加一个类(如乘方运算),我们就要修改简单工厂类的switch逻辑。所以简单工厂虽然简单,但是不是很好。
比如:计算器的例子。

抽象工厂

抽象工厂里面包含了创造每一个对象的方法,而它不同的实现类则表示用不同的方法来建立这些对象。比如:装修卧室和厨房。卧室和厨房是两个要建造的对象,如何建造这两个对象就被封装在抽象工厂里面。小明和小红分别实现抽象工厂 然后用自己的方法建造卧室和厨房。

建造者模式

建造者模式将一个复杂对象的创建与它的表示相分离,使得同样的构建过程可以创建不同的表示。简单的说就是隐藏了对象的建造过程。 比如要捏两个小人。我们在建造者类里面指定捏头,捏身体,捏四肢的方法。然后统一在指挥者类里面组合调用。如果要捏一个瘦子,就在指挥者里面定义一个捏瘦子的方法然后在捏脸,捏身体,捏四肢的时候传进去几个参数表示体重很轻。

工厂方法

工厂方法克服了简单工厂违背开放封闭的原则这个缺点(因为在工厂模式中,switch选择交给了客户端。所以如果要新增一个乘方算法,只需要增加乘方算法工厂和乘方算法类即可。剩下的事情就只是等待客户端来调用)

原型模式

原型模式就是自己定义一个深复制的克隆方法,方便生成重复的对象。

单例模式

单例模式 通过私有化构造函数,定义getInstance方法等措施来保证在系统中只存在一个本类的对象。

结构性模式

适配器模式

适配器模式将一个类的接口转换成客户希望的另外一个接口,这样使得原本由于接口不兼容而不能在一起工作的那些类可以一起工作。

桥接模式

桥接模式的特点是当一个东西可以按照多种方式进行变化时,可以把这两种变化独立起来然后使用类之间的组合方式进行低耦合。比如:手机可以按照品牌分,也可以按照功能来分类。桥接模式的做法就是抽象出两个接口(手机品牌和手机功能),再使用合成引用等方式进行低耦合。

组合模式

组合模式将对象组合成树形结构表示,每一个非叶非总根对象都可以作为父节点的儿子,也可以作为以自己开始的树结构的根。这样的好处就是所有节点的方法都是一样的,改变了节点类的结构相当于把树种每一个节点的结构都给改了,组合模式使得用户对单个对象和组合对象的使用具有一致性。

装饰模式

装饰模式的意图就是动态的为一个对象添加额外的职责。不像继承那么结构复杂,装饰模式通过引用父接口对象达到可以为所有与自己性质相同的类增加新的逻辑。

外观模式

外观模式在子系统诸多繁琐接口之上定义了一个高层接口供客户端调用。这样客户端就不需要跟底层接口打交道,高层接口自动组织好子系统接口的调用逻辑并封装好了方法。

享元模式

享元模式的主旨是运用共享的技术来有效地支持大量细粒度的对象。减少过多相似细粒度对象的创建,减少机器负担。

代理模式

代理模式就是为一个对象外面加了一层。外部想要访问到这个对象必须要通过代理对象。代理对象提供的接口与真实对象提供的接口应该是相同的。不相同就变成适配器模式咯。

行为型模式

观察者模式

观察者模式定义了一种一对多的依赖关系(一个主题类,多个观察者类)。当主题类的状态发生改变的时候,主题类会调用自己保存的所有观察者类的引用并调用他们的方法使观察者类也同时改变状态。

模板方法

模板方法在抽象类中定义了一个算法骨架,然后通过调用自己定义的抽象方法的方式,将每种算法一些不同的地方在子类中实现。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

命令模式

命令模式是通过把外部的一系列请求封装成一个命令类,然后把这个命令类传给被调用对象。比如:我要让厨师烧红烧肉。服务员(命令类)会过来记录我这个请求,再传递给厨师(被调用对象)。

状态模式

状态模式允许一个对象在其内部状态改变时改变它的行为,让对象看起来似乎修改了它的类。状态模式所做的事情其实就是把过长的条件分支语句用多个类之间的转换代替。ifelse的每一个判断条件分布在各个类中,运用多态来维护分支判断提高了系统的扩展和可用性。
比如:人的状态(接口)分类少年,中年,老年三个状态(三个实现类)。人在不同的状态下有不同的事情要做(work类)。客户端调用少年的对象说要娶媳妇(此时work对象初始化状态为少年),然后在少年类的方法里面会进行判断(怎么判断各有各的写法),娶媳妇这个事情不是我这个状态应该做的,之后把work类里面的状态改成中年再调用work的方法把娶媳妇的事情抛给中年。

职责链模式

职责链模式使得多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。其实职责链模式跟状态模式是比较像的。职责链模式通过设置对象之间的上下级关系,把请求接受者串联成一条链。从链首开始处理客户端请求,若某一个节点处理不了就一直向后抛。这种模式下,客户端只管调用就完事了,具体哪个对象处理就不关客户端什么事了。
比如:请假的时候,需要通过一层一层的审批。

解释器模式

解释器模式顾名思义就是定义了一组语法,用来把客户端提供的数据解释成程序可阅读的数据。

中介者模式

中介者模式通过中介者对象把系统中复杂的网状结构改成以中介者类为中心的星型结构。中介者模式大大减少了其他类与类之间的耦合,使他们之间的相互引用不再显示而是通过中介者中定义的接口。但是相应的自己对于其他类的耦合程度非常高。

访问者模式

访问者模式表示一个作用域某对象结构的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。访问者模式应用的前提是有一个稳定的结构。
比如人分为男人和女人,这是不可变的。然后定义一系列的访问者(比如人在成功的时候会怎么样,在失败的时候会怎么样)传入到稳定的结构中。这样如果新增加一种悲伤的状态,就不需要修改其他类了。

策略模式

策略模式定义了一系列的算法,并把它们都封装成对象使它们相互可以替换。策略模式使得算法可独立于使用它的客户而变化。
比如:商场在不同情况下会使用不同的促销手段。

备忘录模式

备忘录模式提供了一个用于保存对象瞬间状态的类(用于不破坏类的封装性)。这样对象就可以在之后的某一个时间回复到之前的状态。
比如:打游戏的存档

迭代器模式

迭代器模式提供了一种顺序遍历聚合对象元素的方法,而不需要暴露该对象的内部表示。
**比如:**foreach遍历。

猜你喜欢

转载自blog.csdn.net/q1052196521/article/details/79757577
今日推荐