【注意】最后更新于 December 15, 2017,文中内容可能已过时,请谨慎使用。
本篇来看java设计模式之代理模式.
什么是代理模式?
就是说我很忙的,天天打打杀杀的,忙不过来啊,怎么办?
找个中间人,代理下,帮忙干点活,整点小钱。
这不,你看,作为一个大哥,都会以下技能
1
2
3
4
5
6
|
package top.txiner.proxy;
public interface Man {
public void swear();
public void fight();
}
|
一个具体的大哥
1
2
3
4
5
6
7
8
9
10
11
|
package top.txiner.proxy;
public class XiaoMing implements Man {
public void swear() {
System.out.println("瞅你咋地");
}
public void fight() {
System.out.println("憋吵吵,来干来干!");
}
}
|
好了,在大街上遇到了另一个大哥,问题是小明等级高啊!不想直接见他,代理人来了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
package top.txiner.proxy;
public class Agent implements Man {
private Man man;
public Agent(){
this.man=new XiaoMing();
}
public Agent(Man man) {
this.man = man;
}
public void swear() {
this.man.swear();
}
public void fight() {
this.man.fight();
}
}
|
不废话,看看具体俩怎么操作!
1
2
3
4
5
6
7
8
9
10
11
12
13
|
package top.txiner.proxy;
public class Street {
public static void main(String[] args) {
Agent agent=new Agent();
System.out.println("你瞅啥");
agent.swear();
System.out.println("再瞅一个试试");
agent.fight();
}
}
|
恩,这就结束了!
不过我们发现,有点小瑕疵啊!万一代理人在干活之前,想要高歌一曲才干活。而且,代理人想要扩大业务范围,这代码几乎就都得改了。
就代理人毛病多!
那怎么办?动态代理吧!
我不继承你这个老板有的方法了,我通过你这个类,反射找到你的方法,让反射执行!这样岂不是可以升职加薪,当上。。。。。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
package top.txiner.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class DaAgent implements InvocationHandler {
private Object object;
public DaAgent(Object object) {
this.object = object;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result=method.invoke(object,args);
return result;
}
}
|
再干活的时候,就说出来,要给谁干活,然后反射执行即可!
1
2
3
4
|
XiaoMing xiaoMing=new XiaoMing();
DaAgent daAgent=new DaAgent(xiaoMing);
Man man= (Man) Proxy.newProxyInstance(daAgent.getClass().getClassLoader(),xiaoMing.getClass().getInterfaces(),daAgent);
man.fight();
|
恩,代理人很满意!晚饭给多加个鸡腿!
好了,慢慢的,代理人发现,有好多刚入行的大哥们,并不知道要继承接口,不知道要swear和fight,根本就没实现啥接口,那怎们办?
不干了!这代理人怎么这么多事!
但还是有人实现了,有个cglib库,可以做。不过在spring里面默认集成了。
重要的是理解思路想法,设计模式嘛!不想说了!