Java设计模式之计数署理模式
副标题#e#
描写:
计数署理模式在客户工具挪用处事提供者工具上要领的前后执行诸如日志(logging)和计数(counting)一系列附加成果时很有用。计数署理模式发起把这些附加成果封装在一个单独的工具,这个工具就是指计数署理工具,而不是把这些附加的成果实现放随处事提供者的内部。精采的工具设计的一个特征就是工具要专注于提供特定的成果。换句话说,抱负的工具不该该做各类不相干的工作。把诸如日志(logging)和计数(counting)等雷同的成果封装为一个单独的工具,而让处事提供者工具仅提供它本身的特定成果。也就是说,只答允处事提供者工具执行界说精采、特定的任务。
计数署理被设计成可以被客户会见的与处事提供者具有沟通接口的工具。客户工具不是直接会见处事提供者,而是挪用计数署理工具上的要领,计数署理执行须要的记载日志(logging)和计数(counting)成果后,再把要领挪用通报给处事提供着工具。如图1
Figure1: Generic Class Association When the Counting Proxy Pattern Is Applied
下面的例子说明白如安在应用措施中操作计数署理。
例子:
让我们设计一个Order类,类条理如图2,OrderIF接口声明白getAllOrders读取数据库中所有订单的简朴要领。
Figure2: Order Class Hierarchy
public interface OrderIF {
public Vector getAllOrders();
}
作为getAllOrders要领实现的一部门,Order类实用了FileUtil东西类从order.txt文件中读取订单项。
public class Order implements OrderIF {
public Vector getAllOrders() {
FileUtil fileUtil = new FileUtil();
Vector v = fileUtil.fileToVector("orders.txt");
return v;
}
}
#p#副标题#e#
让我们假定在挪用getAllOrders()时,需要把取数据文件所耗费的时间和记录条数要记录的log日志文件中。
这个附加的成果可以设计一个单独的OrderProxy类来实现,它与真实工具Order一样实现OrderIF接口。这样担保了OrderProxy工具提供应客户与真实工具Order一样的接口。如图3
Figure3: Order Class Hierarchy with the Counting Proxy
public class OrderProxy implements OrderIF {
private int counter = 0;
public Vector getAllOrders() {
Order order = new Order();
counter++;
long t1 = System.currentTimeMillis ();
Vector v = order.getAllOrders();
long t2 = System.currentTimeMillis();
long timeDiff = t2 ? t1;
String msg = "Iteration=" + counter + "::Time=" + timeDiff + "ms";
//log the message
FileUtil fileUtil = new FileUtil();
fileUtil.writeToFile("log.txt”,msg, true, true);
return v;
}
}
客户工具MainApp就想挪用真实工具Order一样挪用OrderProxy工具上的getAllOrders()要领,OrderProxy工具通报这个挪用给真实工具Order,计较读取所有订单所耗费的时间并利用FileUtil辅佐类将其记载的log日志文件中。在这个进程中,OrderProxy饰演者计数署理的脚色。
public class MainApp {
public static void main(String[] args) {
OrderIF order = new OrderProxy();
Vector v = order.getAllOrders();
v = order.getAllOrders();
v = order.getAllOrders();
v = order.getAllOrders();
}
}