每天一个设计模式

设计原则

单一职责原则
一个模块一个功能;
一个相对独立的部分只负责一个功能,降低复杂度,职责清楚,方便维护;
开闭原则
对修改封闭,对扩展开放;
类或对象,对于修改是封闭的,对于扩展是开放的(一开一闭);
依赖倒转原则
面向接口编程,所有具体实现依赖接口;
具体就是面向接口编程,接口的设计称为抽象的过程,抽象不依赖具体实现,具体实现称为细节,细节依赖抽象;
里斯替换原则
一个地方父类能出现,那么子类一定也可以出现;
这个原则的作用是引导正确的去使用继承;
子类实现父类的抽象方法而不要去重写父类已有的方法,直接继承就好;
迪米特法则
2个对象或类之间没有直接交集,他们的交互都通过第三方发生;
产生大量的中间类,增加整个系统的复杂性,对象间的通信效率降低;
由于局部对象相对独立,减小了局部系统的设计复杂性;
聚合复用原则
一个新类里面使用一个已有类作为一部分;


创建型

1、简单工厂

生产方法根据不同的参数返回不同类的实例
工厂实例根据传入的参数不同,返回不同的实例,但是这些实例都是继承同一个抽象类;

工厂类里面实现产品实例的创建逻辑;如果要添加产品种类,就要修改工厂类了,违背开闭原则(创建哪个对象的逻辑在工厂类里面);


2、工厂方法模式

生产方法抽象,子类具体实现生产(工厂类抽象,子类实现具体工厂)
简单工厂添加新的产品就要修改工厂类,违背开闭原则;
如果在定义工厂类的时候把创建方法定义成抽象方法,再派生出具体产品的子类工厂,这样就把具体的生产方法实现推迟到子类,要新添加产品的话只需要添加新的子类工厂就好了;
所以工厂方法模式就是在简单工厂的基础上抽象了工厂生产方法,到子类实现;


3、抽象工厂模式

工厂方法扩展,生产多个有相关性的对象,抽象工厂有一族生产方法
前面讨论的简单工厂和工厂方法都是针对产品是一个整体来说的;
如果这个需要生产的产品(大产品)是由若干个产品组合而成,那么工厂具体工厂还是一个,产品就有大于1个了;
这样的话,抽象工厂的创建方法就有大于一个,这样就称之为创建一族依赖或者有相关性的对象;


4、单例模式

保证该类只有一个实例
类只允许有一个实例;
1、私有化构造方法;
2、类内保存自己的实例;
3、提供可以获取到实例的方法(类的静态方法)


5、建造者模式

将一个对象的描述和创建分开
解决一个产品的属性过多,不能用传统的构造函数的方法来创建这个对象的问题;
那么就要将这个对象的创建过程拆分成几个步骤,称之为构造过程;
那么这个抽象的建造者就描述了这个过程,但没有具体实现每步的操作;
具体的建造者,实现和每步的操作,并且有这个具体建造者确定产品的属性;
为了不让客户端直接调度这个建造者,那么调度的工作有一个指挥者类来实现;
客户端只需要给指挥者建造者,指挥者会指挥建造者,按既定的过程创建产品;


6、原型模式

高效实现对象复制,生成一个新对象
问题1、类内需要实现clone方法,如果有子类,子类也需要实现clone方法;
问题2、深拷贝,浅拷贝问题,深克隆要实现比较复杂的深拷贝,同样子类也需要实现;


结构型

7、适配器模式

解决期望接口与实际接口不匹配问题
期望接口是目标接口;
适配器继承/实现,目标类/接口,调用实际接口;
实际接口被适配器调用;

类适配器
要求多重继承;
对象适配器


8、桥接模式

解决类多个维度变化问题
类存在多个维度的变化,如果仅用继承来描述,会有问题;
一个维度的变化,只需要一级继承;
两个维度的变化,需要二级继承;依次类推;

如果把第二个维度变化独立出来一个类,使用组合的方式跟第一个类关联;
那么这两个类都只有一级继承;如果后面还有变化维度,依次类推;


9、组合模式

将对象抽象组合成树状结构
整体-部分模式;
将对象组织成树状结构;

1、根节点和树枝节点属于同一种类型;
2、叶子节点(不是容器,不能添加节点,最终的操作对象)和树枝节点(容器,可以添加节点,操作最终要到下面的叶子)不属于同一种类型;
3、将叶子节点和树枝节点看做同一种类型;
4、将根节点、树枝节点和叶子节点用同一种抽象表示;

透明式安全式
因为归根结底叶子节点和树枝节点是不一样的,叶子节点不需要实现一些树枝的操作(例如添加,删除树枝/叶子),所以抽象表示只需要定义公共的方法就好了,这样改变之后就是是属于安全式组合模式;

??? 有点像C里面的通用链表;


10、装饰器模式

对现有产品动态的增加功能,做扩展
完全遵守开闭原则;

如果要给一个已经存在的类添加功能;
1、可以添加一个子类,这个子类扩展了功能;
2、可以使用组合方法修改这个类给他添加功能;

装饰器模式,同样是新加一个类,但是这个类不是去继承原有类(也不修改原有类),而是在构造的时候以组合的方式添加被扩展类的对象到自己的属性,并且实现原来类的同名方法;

在这个同名方法中加入要新加的功能;


11、外观模式

深入浅出外观模式(一)
对一个比较复杂的任务,涉及多个模块/子系统,引入外观类处理这个过程

外观类按照既定的过程调用各个模块的功能;
客户端调用外观类抽象了这个过程的方法;


12 、享元模式

分离易变和稳定的部分,易变部分作为作为参数在够着对象的时候传进去
1、易变部分称之为非享元角色,常常作为享元角色的参数;
2、稳定部分为享元角色;


13、代理模式

隔离真实的任务对象,并且给真实任务添加前期和后期处理
1、跟装饰器模式有点类似;但装饰器是对对象类的扩展,代理主要是对真实对象的隔离,和对前期预处理以及后续处理;
2、


过滤器模式???


参考博客:
23 种设计模式详解(全23种)
设计模式-C语言中文网

猜你喜欢

转载自blog.csdn.net/GeiGe123/article/details/113869584
今日推荐