4

假设我的 Facade 类有两个子系统类。每个子系统都有不同的事件。

FacadeClass 是

public class FacadeClass
{
    private SubsystemClass1 _s1;
    private SubsystemClass2 _s2;

    public FacadeClass() 
    {
        _s1 = new SubsystemClass1();
        _s2 = new SubsystemClass2();
    }
}

和子系统类 1

public class SubsystemClass1
{
    public event EventHandler FetchComplete;

    public void OnFetchComplete(EventArgs e)
    {
        if (FetchComplete != null)
        {
            FetchComplete(this, e);
        }
    }
}

然后是 SubsystemClass2

public class SubsystemClass2
{
    public event EventHandler SendComplete;

    public void OnSendComplete(EventArgs e)
    {
        if (SendComplete != null)
        {
            SendComplete(this, e);
        }
    }
}

假设我有另一个使用外观类的类,我想附加来自 SubsystemClass1 和 SubsystemClass2 的事件。问题是如何附加事件而不在外观类中重新定义它,也不使用子系统类(如果有的话)?

在外观类中重新定义它的示例

public class FacadeClass
{
    private SubsystemClass1 _s1;
    private SubsystemClass2 _s2;

    public FacadeClass() 
    {
        _s1 = new SubsystemClass1();
        _s2 = new SubsystemClass2();
    }

    // Redifine the event
    public event EventHandler FetchComplete
    {
        add { _s1.FetchComplete += value; }
        remove { _s1.FetchComplete -= value; }
    }

    public event EventHandler SendComplete
    {
        add { _s2.SendComplete += value; }
        remove { _s2.SendComplete -= value; }
    }
}

使用子系统类的示例,将它们都设为公共

public class FacadeClass
{
    // Make both class to public
    public SubsystemClass1 _s1;
    public SubsystemClass2 _s2;

    public FacadeClass() 
    {
        _s1 = new SubsystemClass1();
        _s2 = new SubsystemClass2();
    }
}

public class AnotherClass
{
    FacadeClass _fd;

    public AnotherClass() 
    {
        _fd = new FacadeClass();
        // Little bit ugly
        _fd._s1.FetchComplete += new EventHandler(_s1_FetchComplete);
    }

    void _s1_FetchComplete(object sender, EventArgs e)
    {
        // Do Something Here
    }
}

提前致谢,

问候布赖恩...

4

1 回答 1

1

您结束活动的解决方案对我来说似乎相当不错。这有什么问题?在某种程度上,您将不得不指定 SubSystemClass 或在 FacadeClass 上添加某种包装器。因为 SubSystemClasses 是私有的,除非您将一些代码添加到您已经完成的 FacadeClass,否则无法访问事件。我能想到的唯一其他选择是反射,这可能是一个可行的解决方案。

编辑:我不知道这与想要公开 s1 或 s2 的属性的情况是否有任何不同。如果您想这样做,则需要将 s1/s2 公开,提供包装器属性或使用反射。

于 2012-08-03T02:15:41.910 回答