设计模式笔记

文章详细介绍了软件设计中的重要原则,如单一职责原则、开闭原则、依赖反转原则等,并通过工厂模式、单例模式、观察者模式等设计模式举例说明如何在实际编程中实现模块化和解耦。设计模式旨在使代码更易维护和扩展,降低团队间的影响。
摘要由CSDN通过智能技术生成

设计原则

单一职责原则(SRP)、开闭原则(OCP)、闭包原则(CCP)、依赖反转原则(DIP)。

模块划分:单一职责、闭包原则;
相同目标,相同改动原因的内容,作为一个模块单元。

模块解耦:依赖反转,开闭原则;
增加抽象层,解耦合上层和依赖层,使依赖的修改不会影响其他模块。

设计模式的总体思想是团队合作,怎么能让一方的修改不影响另一方,怎么能易于扩展减小修改量。

开闭原则是,对修改关闭,都扩展开放。

设计模式很多使我们编程中已经用到的技巧了,但是经过命名后,反而不能理解了,哈哈哈。

但是每抽象一个抽象层,都会多出一个逻辑层。

可扩展性。

创建型

创建型用于构造对象。

单例模式

单例模式是全局变量的扩展,相比全局变量,除了提供多属性和方法,单例模式确保某个类只有一个实例,这样做的目的是为了全局共享同一个对象的状态,就像是全局共享同一个变量一样。

要实现单例模式:

  • 私有默认构造函数、拷贝构造函数和赋值运算符
  • 禁止生成拷贝构造函数和赋值运算符
  • 在公有方法中使用static和默认构造函数创建实例
  • static确保只被创建一次

单例模式和静态全局对象没啥区别吧,不知道有啥好处。
难道是因为对象需要在代码中实例化才能用,而类不需要实例化就可以包含?
这样多个团队

工厂模式

工厂模式是为了解耦创建者和使用者的,这通常是因为创建者和使用者是两个团队,如果创建者新增了子类,那么使用者通常就要去修改自己的调用代码,这很麻烦,因为使用者不想知道创建者在折腾什么,他只想管好自己的代码。因此提供抽象层工厂类,使用者只需要引用工厂类,创建者自己去折腾吧。

简单工厂用于创建一类类。

int main(int argc,char* argv[]) {
    Factory* fac = new ConcreteFactory();
    //调用者直接调用工厂类对象的方法,不直接调用产品子类对象(如果太多或多变)
    //这样产品类自己维护CreateProduct(),去关联需要的子类。
    Product* p = fac->CreateProduct();
    return 0; 
}

抽象工厂用于创建多类类

int main(int argc,char* argv[]) {
    AbstractFactory* cf1 = new ConcreteFactory1();
    cf1->CreateProductA(); cf1->CreateProductB();
    AbstractFactory* cf2 = new ConcreteFactory2(); cf2->CreateProductA();
    cf2->CreateProductB();
    return 0; 
}

工厂方法:
以输入法为例,通过环境变量配置默认输入法,
QT会去LD_LIBRARY_PATH搜索相应的so,并调用so的工厂方法,返回一个实例。
换句话说,基类提供一个返回工厂方法,

比如: 基类input,子类1 input1,子类2 input2, 子类3 input3
不使用工厂方法:

input *p = new input1;
input *p = new input2;
input *p = new input3;

那么如果配置使用输入法后,就需要多个if来判断子类的方法。

使用工厂方法:
提供create接口。

input *p = create(input1);

通过传参避免if else,这样做主要是提供了统一接口,方便用户使用。
或者通过环境变量配置,那么create就不需要参数,直接简化为create()了

建造者模式

建造者模式就是过程分解,将一长段代码,分别包装在多个函数中,行成模块化。

这样逻辑既清晰,又能通过函数复用。

原型模式

就是拷贝构造,使用已有的对象创建新对象。

结构型

桥接模式

抽象类和实现类分离。
当抽象类和实现类都需要扩展时,采用桥接模式实现各改各的。

适配器模式

通过继承原来的类,修改成自己需要的类。
为什么要继承呢,因为目标可能是另一个团队的产品,而且不想改,所以就得自己拿来改。

装饰模式

如果想扩展一个类,可以使用继承,但还可以使用组合。
先继承旧类,然后创建一个新类,包含刚才的继承类。

复合模式

递归。

享元模式

将共性部分抽离出来,行成一个资源类。

门面模式

就是创建一个抽象层,屏蔽底层的复杂性,简化和统一操作。

代理模式

代理模式就是将通用的模块提出来,就像写一个函数一样,本来这部分可以耦合进对象中,但是如果用的人很多,就需要单独出来,所以代理模式就是抽象共性,行成单独的模块。

组件默认提供了一组行为,但是用户希望按照自己的方式实现这个行为,就可以使用代理模式。
比如基础组件提供了输入焦点,但是用户希望焦点聚焦在行编辑器上,所以可以在基础组件上使用代理模式,将焦点行为代理到行编辑器上。

再比如网络代理,默认有默认的配置,也可以替换为代理模式。

行为模式

策略模式/模板模式

使用多态功能。

状态模式

状态模式就是将状态封装成一个类,将状态对应的行为使用抽象类继承出来。
状态模式就是为了分解switch/case多分支的情况。

观察者模式

以上的设计模式,要么利用封装,要么利用多态,要么利用包含,
而观察者模式是一种通信模式,当状态改变时,通过多态接口调用注册者。

观察者模式建立了一个一对多的模式,当一个数据改变时,通知(调用)多个对象方法。

发布者(subject)提供订阅和取消的方法,实际上是维护一个数据,用来添加订阅对象,当数据改变时,通过抽象接口遍历数组并调用方法。

观察者模式通常由以下几个组件构成:

  • Subject(发布者):包含了所有观察者的列表,以及一些用于添加、删除和通知观察者的方法。
  • Observer(订阅者):定义了在发布者状态发生改变时所需执行的更新方法。
  • ConcreteSubject(具体发布者):实现了Subject接口,并且包含了一些需要被观察的状态。当这些状态发生改变时,它会通知所有注册的观察者。
  • ConcreteObserver(具体订阅者):实现了Observer接口,并且定义了在发布者状态发生改变时所需执行的更新方法。

备忘录模式

建立一个备忘录类,用于保存状态,每一个对象是一个状态,并且可以通过对象方法返回状态。
有时候想想,这和数组有什么区别。

中介者模式

通过增加逻辑层,处理对象交互,解耦对象间的耦合。

命令模式

命令模式,可以规定一套平台无关,代码无关的命令,组合一套动作,
这样就可以隔离接口变更,而总是使用文字类型进行传参,来完成一组动作,或一个类型。

访问者模式

也是接口和实现分离。

责任链模式

连续请求,类似于业务部门,主要思想是模块化。

迭代器模式

如其名,将迭代器从容器中抽离出来。

解释器模式

自定义规则,并自定义解释器。

MVC

模型、视图、控制器;
本质就是数据、前端、逻辑层;

参考链接

23种设计模式UML类图图解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

多弗朗强哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值