最近在学习AOP,发现它与代理模式有着密切的关系,所以再次学习一下代理模式吧。
代理模式:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
现在写一个静态代理模式,帮大家回忆一下《大话设计模式》中的代理模式的例子吧。
这个例子是mm的暗恋着xiaoming,让一个代理人,帮他追mm。让代理人帮xiaoming送花、送足球、送电影票给mm。这种情况正好是代理模式中说的,一个对象不适合或者不能直接饮用另一个对象。
1 恋爱宝典
<span style="font-size:18px;">package dahuashejimoshi.v2;
//恋爱宝典
public interface PursuerMethod {
public void sendFlowers();
public void sendFootball();
public void sendMovieTicket();
}</span>
2 小明根据恋爱宝典中的指示,对mm展开了攻击。
package dahuashejimoshiv1;
import dahuashejimoshi.v2.PursuitMethod;
public class Pursuer implements PursuitMethod {
SchoolGirl mm;
public Pursuer(SchoolGirl mm){
this.mm=mm;
}
//public Pursuer(){};
public void sendFlowers(){
System.out.println("追求者小明送给mm花");
}
public void sendFootball(){
System.out.println("追求者小明送给mm足球");
}
public void sendMovieTicket(){
System.out.println("追求者小明送给mm电影票");
}
}
3 但是内心羞赧的他,决定想请一个代理帮助自己完成,于是他找到了PursuerProxy进行代理。
package dahuashejimoshi.v2;
import java.util.Random;
import dahuashejimoshiv1.Pursuer;
public class PursuitProxy implements PursuitMethod {
/*Pursuiter xiaoming; //此处必须说明被代理类是谁
public PursuiterProxy(SchoolGirl mm) { //还要指明相应的参数,所以这个代理类只能被<span style="font-family:KaiTi_GB2312;">pursuiter</span>(追求者使用),追求schoolgirl都不能追求其他girl,不符合现在的大面积撒网,重点栽培 //如果下次有一个类增加买零食的追求方法。
xiaoming=new pursuiter(mm); //这个代理类就无法满足需求,必须重新写
} */
//另一种写法
private Pursuer xiaoming;
public PursuitProxy(Pursuer xiaoming) {//这样写,代理类将它只和被代理之间有关系,不知道被代理对象和哪个mm有关系,只有当真正代理的时候才知道
this.xiaoming=xiaoming;
}
@Override
public void sendFlowers() {
xiaoming.sendFlowers();
System.out.println("代理帮忙送花");
}
@Override
public void sendFootball() {
xiaoming.sendFootball();
System.out.println("代理帮忙送球");
}
@Override
public void sendMovieTicket() {
xiaoming.sendMovieTicket();
System.out.println("代理帮忙送电影票");
}
}
4 客户端:
public class Client {
public static void main(String[] args){
SchoolGirl mmGirl=new SchoolGirl();
Pursuer xiaomingPursuer=new Pursuer(mmGirl);
PursuitProxy pursuitProxy=new PursuitProxy(xiaomingPursuer);
pursuitProxy.sendFlowers();//代理送花
pursuitProxy.sendFootball();
pursuitProxy.sendMovieTicket();
}
}
5 结果
追求者小明送给mm花
代理帮忙送花
追求者小明送给mm足球
代理帮忙送球
追求者小明送给mm电影票
代理帮忙送电影票
6 提出疑问:
如果小明说,我想测试一下他们的服务质量 ,看看代理送花、送足球、送电影票分别用了多久。数字说明问题,好吧。第一个想到的方法就是为每一个方法就是在调用方法之前就记录一下时间,代用之后再记录一下时间。通过两个时间的时间差就能知道这次服务的用时了。代码展示:
public class Client {
public static void main(String[] args){
SchoolGirl mmGirl=new SchoolGirl();
Pursuer xiaomingPursuer=new Pursuer(mmGirl);
PursuitProxy pursuitProxy=new PursuitProxy(xiaomingPursuer);
long startFlowers = System.currentTimeMillis();
System.out.println("送花开始时间:" + startFlowers);
pursuitProxy.sendFlowers();//代理送花
long endFlowers = System.currentTimeMillis();
System.out.println("送花所用时间:" + (endFlowers-startFlowers));
long startFootball=System.currentTimeMillis();
System.out.println("送足球开始时间:"+startFootball);
pursuitProxy.sendFootball();
long endFootball=System.currentTimeMillis();
System.out.println("送足球所用时间:"+(endFootball-startFootball));
long startMovieTicket=System.currentTimeMillis();
System.out.println("送票开始时间:"+startMovieTicket);
pursuitProxy.sendMovieTicket();
long endMovieTicket=System.currentTimeMillis();
System.out.println("送足球所用时间:"+(endMovieTicket-startMovieTicket));
}
结果:
送花开始时间:1432784164123
追求者小明送给mm花
代理帮忙送花
送花所用时间:1
送足球开始时间:1432784167544
追求者小明送给mm足球
代理帮忙送球
送足球所用时间:1
送票开始时间:1432784167545
追求者小明送给mm电影票
代理帮忙送电影票
送足球所用时间:1
一看上面代码过多的重复是不是看到了不好的味道。
下一篇博客将继续对他进行优化。