2012-08-03 52 views
4

假设我的门面类有两个子系统类。每个子系统有不同的事件。如何将事件从门面附加到另一个类

的FacadeClass是

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

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

和SubsystemClass1

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。问题是如何附加事件,而无需在facade类中重新定义它,也不需要使用子系统类(如果有的话)?

举例redifine它在外观类

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

感谢,

问候布赖恩...

回答

1

您的解决方案来包装事件似乎对我来说很好。这有什么问题?在某些方面,你将不得不指定SubSystemClass或在FacadeClass上添加某种包装。由于SubSystemClass是私有的,因此除非向FacadeClass添加一些代码,否则无法获取事件。我能想到的唯一的其他选择是反射,这可能是一个可行的解决方案。

编辑:我不知道这是否与希望暴露s1或s2属性的情况有任何不同。如果你想这样做,你需要公开s1/s2,提供一个包装属性或使用反射。

+0

我这样做的信息隐藏。如果有多个使用子系统类的类,我必须重新配置它。 – brian 2012-08-03 02:30:10

相关问题