代理模式

代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。 


代理模式一般涉及到的角色有: 

  • 抽象角色:声明真实对象和代理对象的共同接口

  • 代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。

  • 真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。
           

 


动态代理:以java jdk API实现代理为例

第一步:创建接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.txmwzl.jdk;
 
/**
 * 销售接口
 * @author 政霖
 *
 */
public interface SaleAgency {
    /**
     * 销售火车票函数
     */
    public void saleTicket();
 
}



    

第二步:创建将被代理的主体类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package com.txmwzl.jdk;
 
/**
 * 火车站售票处类
 * @author 政霖
 *
 */
public class TrainStationSaleOffice implements SaleAgency {
 
    @Override
    public void saleTicket() {
        System.out.println("火车站售票处打印火车票中");
         
    }
 
}



第三步:创建代理类事务处理类(继承InvocationHandler接口)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package com.txmwzl.jdk;
 
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
 
/**
 * 火车站代售处事务处理类
 * @author 政霖
 *
 */
public class TrainTicketBookStore implements InvocationHandler {
     
    public TrainStationSaleOffice trainStationSaleOffice ;
     
    public void setTrainStationSaleOffice(TrainStationSaleOffice trainStationSaleOffice) {
        this.trainStationSaleOffice = trainStationSaleOffice;
    }
 
    @Override
    public Object invoke(Object arg0, Method method, Object[] arg2) throws Throwable {
        System.out.println("火车票代售处老板在火车站售票处帮你买票");
        System.out.println(method);
        method.invoke(trainStationSaleOffice);
        System.out.println("火车票代售处老板在回来的路上");
        return null;
    }
 
}
 
 
/*
 
为什么需要动态代理
1.为何不直接使用继承,静态代理
    {
        1.相比继承,静态代理,代理可以减少编码量, 例如在切面编程中,也是通过动态代理实现的,如果使用继承,每个切面都需要继承,重写,效果无法实现
        2.动态代理依靠动态加载类机制实现,编译期类不可知。
        3.动态代理是静态代理更高层的抽象,代理可以达到集中目标类的功能开发,符合现实中各司其职的现实意义
    }
 
*/


测试类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.txmwzl.jdk;
 
import java.lang.reflect.Proxy;
 
public class Main {
 
    public static void main(String[] args) {
        TrainStationSaleOffice trainStationSaleOffice = new TrainStationSaleOffice();
        TrainTicketBookStore ticketBookStore = new TrainTicketBookStore();
        ticketBookStore.setTrainStationSaleOffice(trainStationSaleOffice);
        SaleAgency agency = (SaleAgency)Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), ticketBookStore);
        agency.saleTicket();
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值