寄生模式的导出
根据上面的对辅助类内存泄露方案的处 理,可以推广到所有存在寄生特征的设计场景中进行通用化,进而定义寄生模式。
寄生模式结构示意图
宿主对象:为其他对象提供所需服务的。调用寄生对象提供服务并为它提供一个钩子,以前面章节的实例对应可以理解 为,GUIEngine 是宿主提供 Outdoor_UPS.XML 文件描述的界面创建服务,实际是调用对应的辅助类来实现界面组件的访问 服务的,辅助类会调用 GUIEngine 类,同样 GUIEngine 也会挂接辅助类。
寄生对象:为宿主对象提供服务,如:为真实对象提供服务的模拟等;此处可以理解为,辅助类为界面对象提供模拟服 务,使得操作起来更方面和符合习惯。
开关变量:确定寄生对象如何提供服务的变量,我们可以认为其实宿主类本身是可以提供服务的,但有寄生类来提供更 为方便,但在某些情况下,以上文的案例,如果仅仅只需要临时访问某个界面的很少数量的控件,而界面本身控件数量很多 ,如果还创建寄生类就不太合算了,此时可以由宿主类直接提供服务;
创建者:创建宿主对象的对象,它将开关变量传递给寄生变量以动态决定谁提供服务;
客户对象:使用宿主对象服务的对象,当开关变量被设置,则由寄生对象提供服务;
以前面的案例为例,我们想访问并设置 UPS TYPE 界面中文本输入控件的值为 100,首先创建一个 GUIEngine 对象,通 过开关变量,设置是否创建辅助界面类,如果创建,可以通过 UPSTypeHelper 来完成对界面值的设置了。
寄 生模式对象调用顺序
我们来看代码的实现过程
清单 8. 寄 生模式的实现实例
public class Client {
private Create ct;
public Client(){
ct=new Create("Outdoor_UPS.xml",true );/* 打开开关辅助对象提供服务 */
}
public boolean SetUPSTypeValue(int typeValue)
{
try {
ct.getServiceObj().setText(String.valueOf (typeValue));
return true ;
}catch (Exception ex){
ex.printStackTrace();
return false ;
}
}
/**
* @param args
*/
public static void main(String[] args) {
Client clt=new Client();
System.out .println(clt.SetUPSTypeValue(100));
}
}
¥498.00
¥399.00
¥299.00
¥29.00