C++对象之间通信的几种方式

第一种:直接调用(强耦合、循环嵌套)

#include <iostream>

using namespace std;

class CouplingB
{
public:
    void HandleMessage(int i)
    {
        cout << i << endl;
    }
};

class CouplingA
{
public:
    void SendMessage(int i)
    {
        m_b.HandleMessage(i);
    }

private:
    CouplingB m_b;
};

int main()
{
    CouplingA coupleingA;
    coupleingA.SendMessage(100);
	return 0;
}
 

第二种:中介者(解耦)

class DecouplingClassA
{
public:
    void SendMessage(int i);
    void HandleMessage(int i)
    {
        cout << "DecouplingClassB::HandleMessage(): " << i << endl;
    }
};

class DecouplingClassB
{
public:
    void SendMessage(int i);
    void HandleMessage(int i)
    {
        cout << "DecouplingClassB::HandleMessage(): " << i << endl;
    }
};

class Mediation
{
private:
    Mediation() {}

public:
    DecouplingClassA GetClassA()
    {
        return m_classA;
    }

    DecouplingClassB GetClassB()
    {
        return m_classB;
    }
public:
    static Mediation* Instance()
    {
        if(nullptr == m_instance)
        {
            m_instance = new Mediation;
        }
        return m_instance;
    }

private:
    DecouplingClassA m_classA;
    DecouplingClassB m_classB;

private:
    static Mediation *m_instance;
};

Mediation *Mediation::m_instance = nullptr;

void DecouplingClassA::SendMessage(int i)
{
    cout << "DecouplingClassA::SendMessage -> ";s

    DecouplingClassB classB = Mediation::Instance()->GetClassB();
    classB.HandleMessage(i);
}

void DecouplingClassB::SendMessage(int i)
{
    cout << "DecouplingClassB::SendMessage -> ";

    DecouplingClassA classA = Mediation::Instance()->GetClassA();
    classA.HandleMessage(i);
}

int main()
{
    // 去耦合(中介器)
    DecouplingClassA classA = Mediation::Instance()->GetClassA();
    classA.SendMessage(200);
    DecouplingClassB classB = Mediation::Instance()->GetClassB();;
    classB.SendMessage(300);
    
    return 0;
}

第三种:回调接口(常用、可扩展成观察者模式)

#ifndef CALLBACK_H
#define CALLBACK_H

#include <iostream>
using namespace std;


class Interface
{
public:
    virtual ~Interface() {}
    virtual void Test(int i) = 0;
};

class Invoker
{
public:
    Invoker() {}

    Invoker(Interface *interface)
    {
        m_interface = interface;
    }

    void SetHandler(Interface *interface)
    {
        m_interface = interface;
    }

    void Invoke()
    {
        if(nullptr != m_interface)
            m_interface->Test(500);
    }

private:
    Interface *m_interface;
};

class Realizer : public Interface
{
public:
    Realizer() {}

    void Test(int i)
    {
        cout << "Realizer::test(): " << i << endl;
    }
};

#endif // CALLBACK_H


int main()
{
    // 回调接口
    Realizer *realizer = new Realizer;
    Invoker *invoker = new Invoker(realizer);
    invoker->Invoke();

    return 0;
}

第四种:绑定函数指针

第五种:Qt的信号槽(很强大)

  • 9
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
设计模式通常遵循以下几种原则: 1. 单一职责原则(Single Responsibility Principle,SRP):一个类应该只有一个引起变化的原因。换句话说,一个类应该只负责一项职责。 2. 开闭原则(Open-Closed Principle,OCP):软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。这意味着当需要添加新功能时,应该通过扩展已有代码来实现,而不是修改已有代码。 3. 里氏替换原则(Liskov Substitution Principle,LSP):子类应该能够替换掉父类并且不会产生任何错误或异常。换句话说,子类应该能够以父类的形式出现,而不引起任何问题。 4. 依赖倒置原则(Dependency Inversion Principle,DIP):高层模块不应该依赖低层模块,两者都应该依赖于抽象。抽象不应该依赖于具体实现细节,具体实现细节应该依赖于抽象。 5. 接口隔离原则(Interface Segregation Principle,ISP):客户端不应该依赖它不需要的接口。一个类对另一个类的依赖应该建立在最小的接口上。 6. 迪米特法则(Law of Demeter,LoD):一个对象应该对其他对象有尽可能少的了解。一个类应该只与其直接合作的类进行通信,而不应该了解一大堆其他的类。 这些原则帮助开发人员设计出可维护、可扩展、松耦合的软件系统,提高代码的质量和可复用性。它们被广泛应用于设计模式中,帮助解决各种软件开发中常见的问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值