在类设计中,我们常常遇到这样的问题,类A的实现需要类B的一个实例来提供某种功能。例如,类A有一个方法:
public DataObject GetData (string id)
{
B b = new B();
return b.GetData(id);
}
需要类B的一个实例来实现数据的获取。类B的实例可以通过几种方法得到:
1、正如上述方法中所说,创建一个新的实例。
2、通过构造器, 方法,Property注入。
我们注意到,无论采用上述哪种方法,类B的类型信息都必须让类A可见,这就增加了类型之间的耦合度。
现在,我们使用指定(delegate)来把耦合度降低到方法层次。首先定义一个指定:
public delegate DataObject GetDataDelegate (string id) ;
然后在类A中定义一个Property:
GetDataDelegate getData;
public GetDataDelegate GetData
{
get{return getData;}
set{getData=value;}
}
我们就可以动态地注入GetData功能了:
A a = new A();
B b = new B();
a.GetData += b.GetData;
这个设计的好处在于:
1、任何有着Signature为DataObject Method(string id)的类型的实例都可以注入类型A的实例。
类型A不需要看见类型B。