射击末世--代理模式

代理模式分为三部分
1.静态代理
1.抽象主题类


//抽象主题类
public interface SellTicket {
    public void sell();
}

2.具体主题类


//具体主题类
public class TranStation implements SellTicket {
    @Override
    public void sell() {
        System.out.println("火车站卖票");
    }
}

3.代理类


//代理🥱
public class PointProxy implements SellTicket {
    public static void main(String[] args) {
        PointProxy pointProxy = new PointProxy();
        pointProxy.sell();
    }

    private TranStation tranStation=new TranStation();
    @Override
    public void sell() {
        System.out.println("代售点开始卖票");
        tranStation.sell();
    }
}

2.动态代理
使用Proxy.newProxyInstance()生成代理对象并实现加强方法


public class ProxyFactory {
    public static void main(String[] args) {
        ProxyFactory.sellTicket().sell();
    }
    private static TranStation tranStation=new TranStation();

    public static SellTicket sellTicket(){
        Object object = Proxy.newProxyInstance(tranStation.getClass().getClassLoader(), tranStation.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("这里是jdk代理类");
                //执行被代理的方法
                method.invoke(tranStation, args);
                return null;
            }
        });
        return (SellTicket)object;
    }

}

动态代理类生成是在内存中
会调用proxy中invokecationhandler.invoke的方法也就是上main定义的子实现的方法

3.cglib动态代理
使用 TranStation tranStation = (TranStation) enhancer.create();底层使用asm生成代理对象


public class ProxyFactory implements MethodInterceptor {

    TranStation tranStation=new TranStation();

    public static void main(String[] args) {
        ProxyFactory proxyFactory = new ProxyFactory();
        TranStation proxyObject = proxyFactory.getProxyObject();
        proxyObject.sell();
    }

    public TranStation getProxyObject(){
        //创建enhancer类
        Enhancer enhancer=new Enhancer();
        //设置父类
        enhancer.setSuperclass(TranStation.class);
        //设置代理方法
        enhancer.setCallback(this);
        //创建代理对象
        TranStation tranStation = (TranStation) enhancer.create();
        return tranStation;
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("cglib加强");
        method.invoke(tranStation,objects);
        return null;
    }
}

jdk1.8以后有接口的都用jdk动态代理没有的用cglib

代理模式的优点
1.保护目标对象的访问
2.降低了系统的耦合度
3.扩张了目标对象的功能
缺点
增加了代码的复杂度

1.远程代理
rpc思想远程调用方法
2.防火墙代理
vpn
3.保护代理
控制对一个对象的访问

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值