【总结】代理模式

1.概述

代理模式:为其它对象提供一种代理以便控制这个对象的访问

2.代理模式分类

1.静态代理:我们自己静态定义的代理类
2.动态代理:通过程序动态生成代理类
(1)基于接口的动态代理:jdk动态代理
(2)基于类的动态代理:CGLIB

3.静态代理

1.角色

(1)接口(租房):是对象和他的代理共同的接口
(2)真实角色(房东):是实现抽象接口的类
(3)代理角色(中介):内部含有真实对象的引用,从而可以操作真实对象

2.实现

//租房接口
public interface Rent {
    public void rent();
}
//主人去实现租房接口
public class Host implements Rent {
    @Override
    public void rent() {
        System.out.println("房东要出租房子");
    }
}
//代理类
public class Proxy implements Rent{
    private Host host;
    //有参
    public Proxy(Host host){
        this.host=host;
    }

    @Override
    public void rent() {
        //代理直接掉host的方法  进行代理
        host.rent();
        seeHouse();
        Money();
    }

    public void seeHouse(){
        System.out.println("看房子");
    }
    public void Money(){
        System.out.println("谈金钱");
    }
}
//客户
public class Client {
    public static void main(String[]args){
        //需要把房东new出来
        Host host = new Host();
        //把房东拿给代理   让代理直接掉房东的方法
        Proxy proxy = new Proxy(host);
        proxy.rent();
    }
}

3.优缺点

1.优点:
业务类只需要关注业务逻辑本身,保证了业务类的重用性

2.缺点:
(1)代理类实现接口,接口增加一个方法,代理类也需要增加。增加了维护的复杂度
(2)静态代理中的代理类是针对某一个类去做代理的,那么假设一个系统中有100个Service,则需要创建100个代理类

4.动态代理

1.角色

同静态代理

2.实现方式


public interface Subject {
    void doSomething();
}
//真实对象
public class RealSubject implements Subject {
    @Override
    public void doSomething() {
        System.out.println("RealSubject do something");
    }
}
//代理类
public class JDKDynamicProxy implements InvocationHandler {

    private Object target;

    public JDKDynamicProxy(Object target) {
        this.target = target;
    }


    public <T> T getProxy() {
        return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("Do something before");
        Object result = method.invoke(target, args);
        System.out.println("Do something after");
        return result;
    }
}
//测试
public class Client {
    public static void main(String[] args) {

        // jdk动态代理测试
        Subject subject = new JDKDynamicProxy(new RealSubject()).getProxy();
        subject.doSomething();
    }
}

猜你喜欢

转载自www.cnblogs.com/muacheng/p/13388034.html