如何将Facade中的事件附加到另一个类?

4
假设我有一个Facade类,其中包含两个子系统类。每个子系统都有不同的事件。
Facade类是:
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);
        }
    }
}

然后是子系统类2

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。

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
    }
}

提前感谢您,

此致敬礼Brian ...

1个回答

1

你的事件包装解决方案看起来对我来说非常好。这个有什么问题吗?在某种程度上,你要么必须指定SubSystemClass,要么在FacadeClass上添加某种包装器。因为SubSystemClasses是私有的,除非你在FacadeClass中添加一些代码,否则无法访问事件,而你已经做到了这一点。我能想到的唯一其他选择是反射,这可能是可行的解决方案。

编辑:我不知道这是否与想要公开s1或s2的属性的情况有所不同。如果你想这样做,你需要将s1/s2设置为public,提供一个包装属性或使用反射。


我这么做是为了信息隐藏。如果有多个类使用子系统类,我必须重新定义它。 - Hensembryan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接