观察者模式C ++:将模板化类从Tempalate的子类转换为Baseclass

问题描述

我正在开发观察者模式基础结构,并希望就遇到的设计问题获得一些建议。该模式背后的想法是允许用户根据他们想要的任何原始类型创建“交易”。然后,用户可以开发自己的自定义观察者,以执行日志记录/构建统计信息等操作。然后,根据工厂基于配置的要求,使用工厂方法在运行时连接所有内容。在用户希望提供一个基于基类指针的观察者并使它适用于所有派生类型之前,这一切都非常有效。添加观察者时,我检查类型是否匹配,如果类型错误则抛出异常。

下面是模式的简单示例,以及破坏它的用例。

非常感谢!


#include <cassert>
#include <stdio.h>
#include <vector>

template<typename T> 
class Observerable;

template<typename T> 
struct ObserverInfo {
    const T& data;
    const Observerable<T>& observer;
};

class IObserver {
public:
    virtual ~IObserver() {}
};

template<typename T>
class Observer : public IObserver {
public:
    virtual void Annouce(const ObserverInfo<T>& info);

}; 

class DumperBase {
public:
    virtual void Dump() const = 0;

};

class MyTransaction : public DumperBase {
public:
    void Dump() const override { printf("Hello\n"); }
};


class IObserverable {
public:
    virtual ~IObserverable() {}
    virtual void AttachObserver(IObserver* observer) = 0;
};



template<typename T>
class Observerable : public IObserverable {
public:
    void AttachObserver(IObserver* observer) override {
        // ?? Is there a way I can make this work for base clases?
        auto casted_observer = dynamic_cast<Observer<T>*>(observer);
        assert(casted_observer);
        m_observers.emplace_back(casted_observer);
    }

    void Push(T transaction) {
        Annouce({transaction,*this});
        // Do something real with T
    }

    void Annouce(const ObserverInfo<T>& info) {
        for (auto& observer : m_observers) {
            observer->Annouce(info); 
        }
    } 

private:
    std::vector<Observer<T>*> m_observers;
};

class MyTransactionObserver : public Observer<DumperBase*> {
    void Annouce(const ObserverInfo<DumperBase*>& info) override {
        info.data->Dump();
    }
};


int main() {

    Observerable<MyTransaction*> observerable{};
    Observer<DumperBase*> observer{};
    observerable.AttachObserver(&observer);

    MyTransaction transaction{};
    observerable.Push(&transaction);
    return 0;
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...