C++ 设计模式

一、简介

实现低耦合度、(高)可复用的面向对象的设计模式。

对象:1.封装代码和数据;2.一系列可以使用公共接口;3.某种拥有责任的抽象

二、设计原则

1、依赖倒置原则(DIP)(隔离高层模块与实现细节)

(1)高层模块(稳定)不应该依赖底层模块(变化),二者都依赖与抽象(稳定)

(2)抽象(稳定)不应该依赖与实现细节(变化),实现细节应该依赖与抽象(稳定)

2、开放封闭原则(OCP)

(1)对扩展开放,对更改封闭

(2)类模块应该是可以扩展的,但是不可以修改

3、单一职责原则(SRP)

(1)一个类应该仅有一个引起他变化的原因

(2)变化的方向隐含着类的责任

4、Liskov替换原则(LSP)

(1)子类必须能够替换它的基类(IS-A)

(2)继承表达类抽象

5、接口隔离原则(ISP)

(1)不应该强迫客户程序依赖它们不用的方法

(2)接口应该小而完备

6、优先对象组合,而不是类继承

(1)类继承通常为“白箱复用”,对象组合通常为“黑箱复用”

(2)集成在某种程度上破坏了封装性,子类父类耦合度高

(3)对象组合只要求被组合的对象具有良好的定义的接口,耦合度低

7、封装变化点

(1)使用封装来创建对象直接的分界层

8、针对接口编程,而不是针对实现编程

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

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

(3)减少系统中各部分的依赖关系,从而实现“高内聚,低耦合”的类型设计方案

三、重构关键技法

        静态->动态

        早绑定->晚绑定

        继承->组合

        编译时依赖->运行时依赖

        紧耦合->松耦合

四、模式

1、组件协作模式:晚绑定

(1)Template Method(模板方法)

       使用原因:

                1.使用同一套框架实现不同的功能

                2.在已经实现的框架中,添加一些新功能

        原理:父类给出的逻辑骨架调用由子类实现的动态方法(虚函数),实现稳定方法(父类)具有变化功能。

//模板类(抽象类)
class AbstractClass
{
    public:
    ~AbstractClass();
    
    void Run()
    {
      step1();
      step2();
      step3();  
    }

    void step1()
    {  ...  }
    void step3()
    {  ...  }
    virtual void step2();
}

//多态实现
class ConcreteClass: public AbstractClass
{
    public:
    void step2()
    {    ...    }
}

//调用应用
class UseClass
{
    public:
    UseClass(AbstractClass* abstractClass)
    {
        m_obj = abstractClass;
    }
    ~UseClass()
    {
        delete m_obj;
    }

    void DoSomeThing()
    {
        ...
        m_obj->Run();
        ...
    }
    private:
    AbstractClass *m_obj;
}

(2)Strategy(策略模式)

        使用原因:依赖的单一算法,多种算法之间可相互替代

        原理:父类给出的接口由子类实现的动态方法(虚函数),实现稳定方法(父类)具有变化功能。

//模板类(抽象类)
class AbstractClass
{
    public:
    ~AbstractClass();
    
    virtual void work();
}

//多态实现1
class ConcreteClass1: public AbstractClass
{
    public:
    void work()
    {    ...    }
}
//多态实现2
class ConcreteClass2: public AbstractClass
{
    public:
    void work()
    {    ...    }
}

//调用应用
class UseClass
{
    public:
    UseClass(AbstractClass* abstractClass)
    {
        m_obj = abstractClass;
    }
    ~UseClass()
    {
        delete m_obj;
    }

    void DoSomeThing()
    {
        ...
        m_obj->work();
        ...
    }
    private:
    AbstractClass *m_obj;
}

UseClass use1(new ConcreteClass1());
UseClass use2(new ConcreteClass2());

(3)Observer/Event(观察者模式)

        使用原因:一对多的依赖,当发生变化时,依赖的它的对象都接受通知

class ObServer
{
   virtual void Update(int count)=0;
}

class MyObServer: public ObServer
{
    public:
    virtual void Update(int count)
    {
        //DoSomeThing
    }
}

//调用应用
class UseClass
{
    public:
    void AddObServer(ObServer* observer)
    {
        m_observer.push_back(observer);
    }
    void DelObServer(ObServer* observer)
    {
        m_observer.erease(observer);
    }
    void UndateObServer(int count)
    {
        vector<ObServer*>::iterator iter;
        while(m_observer.end() != iter)
        {
            iter->Update(int count);
        }
    }
    
    Run()
    {
        ...
        UndateObServer();
        ...
    }
    
    private:
    vector<ObServer*>m_observer;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值