代理模式之spring的AOP

来源:互联网 发布:sql server有mac版吗 编辑:程序博客网 时间:2024/05/21 22:34

先理解一下概念:

 什么是代理模式

        有一座山,  这座山以前每个人都可以经过,但是突然有一天,有一个恶霸把这座山霸占了,他说此树是我载,此路是我开,以后这座山归我管了。任何想要经过这座山的,必须向我献上财物,最后经过我的同意,我才允许你们经过这座山。

        有一个操作系统,以前是免费的,每个人都可以下载。但是有一天,运营商突然说,这个操作系统要收费了,谁想要下载的,必须向我支付费用,我才给你们下载的链接。

   

这里的恶霸和运营商就相当于代理角色。

代理角色掌握着真实角色的控制权。

要通过代理角色访问真实角色,必须满足代理角色的业务条件(交上财物,支付费用等)。


别人眼中的代理模式

所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之前起到中介的作用。
代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。

生活中的例子:过年加班比较忙,没空去买火车票,这时可以打个电话到附近的票务中心,叫他们帮你买张回家的火车票,当然这会附加额外的劳务费。但要清楚票务中心自己并不卖票,只有火车站才真正卖票,票务中心卖给你的票其实是通过火车站实现的。这点很重要!

上面这个例子,你就是“客户”,票务中心就是“代理角色”,火车站是“真实角色”,卖票称为“抽象角色”!


代理模式JAVA代码示例:

 1//抽象角色:抽象类或接口
 2interface Business
 3{
 4    void doAction();
 5}

 6//真实角色:真正实现了业务逻辑接口
 7class BusinessImpl implements Business
 8{
 9    public void doAction()
10    {
11        System.out.println("真实角色中的方法被执行!");
12    }

13}

14//代理角色:自己并未实现业务逻辑接口,而是调用真实角色来实现
15class BusinessImplProxy implements Business
16{
17    private BusinessImpl bi;
18    public void doAction()
19    {
20        if (bi==null)
21        {
22            bi = new BusinessImpl();
23        }

24        doBefore();
25        bi.doAction();
26        doAfter();
27    }

28    public void doBefore()
29    {
30        System.out.println("前置处理!");
31    }

32    public void doAfter()
33    {
34        System.out.println("后置处理!");
35    }

36}

37//测试类
38class Test
39{
40    public static void main(String[] args)
41    {
42        //引用变量定义为抽象角色类型
43        Business bi = new BusinessImplProxy();
44        bi.doAction();
45    }

46}

47

代理模式允许使用抽象类或接口作为“抽象角色”,每个“代理角色”代理了一个“真实角色”,如果要代理的“真实角色”比较多,这势必造成大量的“代理角色”造成代码的急剧膨胀,其实其内部结构都是类似的,要是在运行时能动态生成“代理角色”就好了。


0 0
原创粉丝点击