1.2.1创建型设计模式

设计模式是指在软件开发中,经过验证的,用于解决在特定环 境下,重复出现的,特定问题的解决方案;解决问题的固定套路;慎用设计模式。

设计模式怎么来的?满足设计原则 后,然后慢慢迭代来的;

设计模式解决了什么问题?前提:具体需求既有稳定点,又有变化点;期望修改少量代码,就可以适应需求的变化。

设计模式基础

面向对象的思想:

封装:隐藏实现细节,实现模块化;

继承:无需修改原有类的情况下通过继承实现对工程的扩展;

多态:静态多态:函数重载。动态多态:继承虚函数重写。

类模型

设计原则

依赖倒置

高层模块不应该依赖低层模块,两者都应该依赖抽象;

抽象不应该依赖具体实现,具体实现应该依赖于抽象;

自动驾驶系统公司是高层,汽车生产厂商为低层,它们不应该互 相依赖,一方变动另一方也会跟着变动;而应该抽象一个自动驾 驶行业标准,高层和低层都依赖它;这样以来就解耦了两方的变 动;自动驾驶系统、汽车生产厂商都是具体实现,它们应该都依 赖自动驾驶行业标准(抽象);

开放封闭

一个类应该对扩展(组合和继承)开放,对修改关闭;

面向接口

不将变量类型声明为某个特定的具体类,而是声明为某个接口;

客户程序无需获知对象的具体类型,只需要知道对象所具有的接 口;

减少系统中各部分的依赖关系,从而实现"高内聚、松耦合"的类 型设计方案;

封装变化点

将稳定点和变化点分离,扩展修改变化点;让稳定点和变化点的 实现层次分离;

单一职责

一个类应该仅有一个引起它变化的原因;

里氏替换

子类型必须能够替换掉它的父类型;主要出现在子类覆盖父类实 现,原来使用父类型的程序可能出现错误;覆盖了父类方法却没 有实现父类方法的职责;

接口隔离

不应该强迫客户依赖于它们不用的方法;

一般用于处理一个类拥有比较多的接口,而这些接口涉及到很多 职责;

客户端不应该依赖它不需要的接口。一个类对另一个类的依赖应该建立在最小的接口上。

组合优于继承

继承耦合度高,组合耦合度低;

如何学习设计模式?明确目的:在现有设计模式的基础上,扩展代码;做功能抽象时,如何选择设计模式。

模板方法

定义

定义一个操作中的算法的骨架 ,而将一些步骤延迟到子类中。 Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 ------《 设计模式》 GoF

稳定点:算法的骨架

变化点:子流程需要变化

代码结构:基类中有骨架流程接口;所有子流程对子类开放并且是虚函数;多态使用方式。

背景

某个品牌动物园,有一套固定的表演流程,但是其中有若干个表演子流程可创新替换,以尝试迭代更新表演流程;

要点

最常用的设计模式,子类可以复写父类子流程,使父类的骨架流 程丰富;

反向控制流程的典型应用;

父类 protected 保护子类需要复写的子流程;这样子类的子流程 只能父类来调用;

本质

通过固定算法骨架来约束子类的行为;

如何扩展:实现子类继承基类,复写子流程;通过多态调用方式使用。

结构图

观察者模式

定义

定义对象间的一种一对多(变化)的依赖关系,以便当一个对 象(Subject)的状态发生改变时,所有依赖于它的对象都得到通 知并自动更新。 ------《 设计模式》 GoF

稳定点:"一"对"多"的依赖关系,"一"变化"多"跟着变化;

变化点:"多"增加;"多"减少;

背景

气象站发布气象资料给数据中心,数据中心经过处理,将气象 信息更新到两个不同的显示终端(A 和B);

要点

观察者模式使得我们可以独立地改变目标与观察者,从而使二者 之间的关系松耦合;

观察者自己决定是否订阅通知,目标对象并不关注谁订阅了;

观察者不要依赖通知顺序,目标对象也不知道通知顺序;

常用在基于事件的ui框架中,也是 MVC 的组成部分;

常用在分布式系统中、actor框架中;

结构图

策略模式

定义

定义一系列算法,把它们一个个封装起来,并且使它们可互相替换。该模式使得算法可独立于使用它的客户程序而变化。 ------《设计模式》 GoF

稳定点:客户程序与算法的调用关系。

变化点:新加算法;算法内容改变。

背景

某商场节假日有固定促销活动,为了加大促销力度,现提升国庆节促销活动规格;

要点

策略模式提供了一系列可重用的算法,从而可以使得类型在运行 时方便地根据需要在各个算法之间进行切换;

策略模式消除了条件判断语句;也就是在解耦合;

本质

分离算法,选择实现;

参考链接:0voice · GitHub

相关推荐
沐知全栈开发42 分钟前
R 绘图 - 函数曲线图
开发语言
qq_548674931 小时前
Go的env和bashrc的GOROOT配置不同
linux·开发语言·golang
freexyn1 小时前
Matlab自学笔记六十九:多项式求值、求根、积分和求导
开发语言·笔记·matlab
灵犀坠1 小时前
前端高频知识点汇总:从手写实现到工程化实践(面试&开发双视角)
开发语言·前端·javascript·tcp/ip·http·面试·职场和发展
郝学胜-神的一滴1 小时前
Linux中的alarm函数详解:定时器信号处理指南
linux·服务器·开发语言·c++·程序人生
iナナ1 小时前
Java自定义协议的发布订阅式消息队列(一)
java·开发语言·spring·消息队列·生成消费者模型
方也_arkling1 小时前
【JS】日期对象及时间戳的使用(制作距离指定日期的倒计时)
开发语言·javascript·ecmascript
Zfox_1 小时前
【Go】反射
开发语言·后端·golang