假设我的Facade类有两个子系统类。每个子系统都有不同的事件
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);
}
}
}
假设我有另一个使用facade类的类,我想从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
}
}
提前致谢,
问候布莱恩......
答案 0 :(得分:1)
你的解决方案对我来说似乎很好。这有什么问题?在某种程度上,您将不得不指定SubSystemClass或在FacadeClass上添加某种包装器。因为SubSystemClasses是私有的,所以除非你向FacadeClass添加一些代码,否则无法访问事件。我能想到的唯一另一个选择是反思,这可能是一个可行的解决方案。
编辑:我不知道这与想要暴露s1或s2的属性的情况有什么不同。如果你想这样做,你需要将s1 / s2设为公共,提供包装属性或使用反射。