Skip to content

HanlynnKe/DesignPattern-cpp

Repository files navigation

DesignPattern 设计模式

原则篇

单一职责原则

  • 定义

    就一个类而言,应该仅有一个引起它变化的原因。 如果一个类承担的职责过多,就等于把这些类耦合在一起,一个职责的变化可能会削弱或抑制这个类完成其他职责的能力

  • 补充

    软件设计真正要做的许多内容就是发现职责并把那些职责相互分离。 如果有多于一个的动机去改变一个类,那么这个类就具有多于一个的职责。

开放封闭原则

  • 定义

    软件实体(类、模块、函数等等)应该可以扩展,但是不可修改。 该原则有两个特征:对于扩展是开放的,对于更改是封闭的

  • 补充

    开放封闭原则是面对对象设计的核心所在,遵循这个原则可以带来面对对象技术的好处:可维护、可扩展、可复用、灵活性好。 开发人员应该仅对程序中呈现出频繁变化的部分做出抽象。拒绝不成熟的抽象和抽象本身一样重要。

依赖倒转原则

  • 定义

    抽象不应该依赖细节,细节应该依赖于抽象。 简单地说,要针对接口编程,不要针对实现编程。

  • 补充

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

里氏代换原则

  • 定义

    子类型必须能够替换掉它们的父类型。 只有当子类可以替换掉父类,软件单位的功能不受到影响时,父类才能真正被复用,而子类也能够在父类的基础上增加新的行为。

BACK TO TOP ⬆︎

模式篇

简单工厂模式

  • 定义

    用一个单独的类来创造实例。

  • 优缺点

    • 优点

      1、客户端创建对象时只需要记住特定的参数,而不需要记住复杂的类名,也不用关注实现的过程。(实现了封装和部分解耦)

      2、创建对象不需要单独实例化,而是通过工厂类直接获取示例(实现复用)

    • 缺点

      1、实例化对象的逻辑全部封装在一个工厂类里,每次需求变化都要单独修改工厂类(违反了开闭原则),而且出了异常可能没法正常工作。

      2、不方便扩展子类。

  • 代码示例

BACK TO TOP ⬆︎

策略模式

  • 定义

    定义了算法家族并分别封装,让算法之间可以互相替换。此模式让算法的变化不会影响到使用算法的用户。 策略模式是一种定义一系列算法的方法。所有的算法完成的是相同的工作,只是实现不同。 它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。

  • 优缺点

    • 优点

      1、简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独调试。

      2、只要在分析过程中发现需要在不同时间应用不同的业务规则,可以考虑使用策略模式处理这种变化的可能性。

  • 代码示例

BACK TO TOP ⬆︎

装饰模式

  • 定义

    动态地给一个对象添加额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。 装饰模式利用实例方法对对象进行包装,每个装饰对象的实现与如何使用这个对象分离开,每个装饰对象只关心自己的功能,不需要关心如何被添加到对象链中。

  • 补充

    Component定义一个对象接口,可以给这些对象动态地添加职责。ConcreteComponent是定义了一个具体的对象,也可以对这个对象添加一些职责。 Decorator,装饰抽象类,继承了Component,从外类来扩展Component类的功能,但对于Component来说,是无需知道Decorator的存在的。 ConcreteDecorator是具体的装饰对象,起到给Component添加职责的功能。

    如果只有一个ConcreteComponent类而没有抽象的Component类,那么Decorator类可以是ConcreteComponent的一个子类 同理,如果只有一个ConcreteDecorator类,没必要建立单独的Decorator类,可以把Decorator和ConcreteDecorator的责任合并为一个类

  • 优缺点

    • 优点

      1、有效地把类的核心职责和装饰功能区分开。

      2、去除相关类中重复的装饰逻辑。

  • 代码示例

BACK TO TOP ⬆︎

代理模式

  • 定义

    为其他对象提供一种代理以控制这个对象的访问。 代理就是真实对象的代表。

  • 应用场景

    1、远程代理 ,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。

    2、虚拟代理 ,根据需要创建开销很大的对象,通过它来存放示例化需要很长时间的真实对象。

    3、安全代理 ,用来控制真实对象访问时的权限。

    4、智能指引 ,指当调用真实对象时,代理处理另外一些事。

  • 代码示例

BACK TO TOP ⬆︎

工厂方法模式

  • 定义

    定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

  • 补充

    工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现某一类,选择判断的问题还是存在的。 工厂方法把简单工厂的内部逻辑判断转移到客户端代码来进行。

  • 优缺点

    • 优点

      克服了简单工厂模式违背开放封闭原则的缺点,同时保持了封装对象创建过程的优点

    • 缺点

      每增加一个产品就需要增加一个产品工厂的类,增加了额外的开发量。

  • 代码示例

BACK TO TOP ⬆︎

原型模式

  • 定义

    用原型示例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建细节。

  • 优缺点

    • 优点

      1、在初始化的信息不发生变化的情况下,克隆是最好的方法。这既隐藏了对象创建的细节,又大大提高了性能。

      2、不用重新初始化对象,而是动态地获得对象运行时的状态

    • 缺点

      需要注意深复制与浅复制的区别。浅复制的引用仍指向原对象,而深复制的引用指向新创建的对象。

  • 代码示例

BACK TO TOP ⬆︎

About

C++实现《大话设计模式》示例(更新中)

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages