23种设计模式:现代C++实现 V2.0

CSDN全面系统介绍23中设计模式的专栏



设计模式的一些基本原则:
  1. 单一职责原则
    1. 一个类只有一个职责,不应既做这又做那,这样的好处是:

    2. 降低了类的复杂性

    3. 提高了代码的可读性,可维护性

    4. 降低了因变更带来的风险

  2. 里氏替换原则
    1. 一个子类必须实现父类的所有方法

    2. 一个子类可以拥有父类没有的方法

    3. 在所有需要父类对象的地方都可以用子类的对象替换而不会出现问题

  3. 依赖倒置原则
    1. 高层模块不应该依赖底层模块

    2. 抽象不应该依赖于细节

    3. 实现应该依赖于抽象

    4. 面向接口编程
  4. 接口隔离原则
    1. 一个类可以有多个方法,但如果打算向外部提供部分方法,则把这些方法实现为接口,返回接口类型
  5. 迪米特法则
    1. 最少知识法则
    2. 只与你直接的朋友通信
    3. 一个类不应该与过多的类发生联系
    4. 如果一个类需要调用第三个类的方法,可以加入中间者,转发调用这个方法
  6. 开关原则
    1. 最重要的一个核心原则
    2. 一个软件实体应该对扩展开放,对修改封闭
  7. 组合优先于继承
  8. 把变与不变的事物分开

  9. 委托,委托,委托
  10. 你不会用到它 


目前随着编程语言的进步,很多模式已经没有存在的必要了!

设计模式是某种程度上类C++这种静态语言在动态性方面的不足,随着各种语言动态性的增强(C++的function+bind),很多模式已经没有存在的必要了(参考陈硕的《Linux多线程服务端编程》)

全面介绍23种设计模式参考

1 创建型模式

抽象工厂Abstract Factory 1-1

意图:用工厂类的不同成员函数来返回不同类型的对象。这样一来用户不必记住各个类的名字。

这个模式有个明显的问题:添加新类要修改原来的代码!

工厂方法Factory Method 1-2

意图:定义一个创建对象的接口,让子类决定实例化哪一个类

这个模式就是想突破抽象工厂修改源代码的问题。使用C++模板就可以轻松实现新类型的创建工作

抽象工厂与工厂方法可以被std::function+std::bind代替,所以不再需要大动干戈的设计工厂方法了,参考下面的链接:

抽象工厂与工厂方法:示例代码

另外std::make_pair  std::make_shared 均可以理解为工厂方法。

单利模式Singleton 1-5

意图:保证一个类仅有一个实例,并提供一个全局访问点。

多线程的单利需要加锁访问instance()方法,关于加锁的示例代码参考:多线程同步的开发

例子: Boost中的单利模式

2 结构型模式

适配器模式Adapter 2-1

意图:将一个类的接口转换为客户希望的另一个接口。

例子:用deque实现栈或者队列

桥接模式Bridge 2-2

意图:将抽象部分与实现部分分离,使它们都可以独立的变化。(核心在抽象,为了应对变更才有了不同的实现)

例子:Windows各种窗口使用成员指针来指向具体的实现类

示例代码

组合模式Composite 2-3

意图:将对象组合成树形结构以表示“整体-部分”的层次结构,组合模式使得用户对单个对象的使用和组合对象的使用具有一致性。

例子:表达式求值(一元运算表达式、二元运算表达式、叶子节点)

代理模式Proxy 2-7

意图:为对象提供一种代理以控制对这个对象的访问。(核心是被代理对象,通常是控制创建、初始化、释放等)

例子:智能指针,shared_ptr基本用法 weak_ptr基本用法

3 行为模式

观察者模式Observer 3-7
意图:定义对象间的一种一对多的关系,当一个对象的状态发生改变时,所有依赖它的对象都得到通知并被自动更新。
例子: 发布订阅
策略模式Strategy 3-9

意图:定义一个系列算法,把他们一个个封装起来,并且使它们可互相替换。使得算法可以独立于使用它的客户。

策略模式本质上等价于工厂方法模式。可以通过多态来实现随意指定哪个算法。将来增加了新的算法,原来的程序正常运行。

例子:策略模式Strategy 





  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

C++程序员Carea

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

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

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

打赏作者

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

抵扣说明:

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

余额充值