设计模式--代理模式(jdk)

一、被代理对象

public class TrainStation implements SellTickets {
    @Override
    public void sell() {
        System.out.println("火车站卖票");
    }
}

二、规定要实现的规则

public interface SellTickets {
    void sell();
}

三、代理工厂类

public class ProxyFactory {

    //声明目标对象
    private TrainStation trainStation = new TrainStation();


    public SellTickets getProxyObject(){
        //newProxyInstance,jdk获取代理对象的接口,返回的是一个接口,不能用实现类接收
        SellTickets proxyObject = (SellTickets) Proxy.newProxyInstance(
                trainStation.getClass().getClassLoader(),
                trainStation.getClass().getInterfaces(),
                /**
                 * proxy:代理对象,和proxyObject对象是同一个,在invoke中基本不用
                 * method: 对接口中的方法进行封装的method对象
                 * args:调用方法的实际参数
                 *
                 * 返回值:方法的返回值,本例中就是sell()的返回值
                 */
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        //这里对TrainStation.sell()进行了增强,类似平时的日志打印
                        System.out.println("中间商赚差价--jdk");

                        //执行目标对象的方法,即trainStation,这里method=sell()方法
                        Object obj = method.invoke(trainStation, args);
                        return obj;
                    }
                }
        );
        return proxyObject;
    }

}

四、使用方法

public class Client {
    public static void main(String[] args) {
        ProxyFactory factory = new ProxyFactory();

        SellTickets proxyObject = factory.getProxyObject();

        proxyObject.sell();
    }
}



-------------------------------------------------------------
中间商赚差价--jdk
火车站卖票

五、执行流程

1.在测试类中通过代理对象调用sell()方法

2.factory.getProxyObject() 中 得到真正的代理类 ($Proxy0)

即 SellTickets proxyObject = $Proxy0

根据多态的特性,proxyObject .sell() 执行的是代理类代理类 ($Proxy0)中的sell()方法

3.代理类中的sell()方法中又调用了InvocationHandler接口的子实现类对象的invoke方法,即Proxy.newProxyInstance中的new InvocationHandler(){

@Override
public Object invoke(){  //增强内容   }

}这个自己写的增强方法

4.invoko方法通过反射执行了真实对象所属类(TrainStation)中sell()方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值