本篇来看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里面默认集成了。 重要的是理解思路想法,设计模式嘛!不想说了!