静态代理模式和动态代理模式

静态代理模式和动态代理模式

一.静态代理模式的理解

要完成租房这件事,定义为接口

//租房这件事
public interface Rent {
    public void rent();
}

房东租房

//房东实现租房
public class Host implements Rent {
    public void rent() {
        System.out.println("我是房东,我要出租房子!");
    }
}

代理即相当于中介给房东租房

//找代理即相当于中介来完成租房
public class Proxy implements Rent {
    //房东对象
    private Host host;
    //对房东进行初始化
    public Proxy(Host host) {
        this.host = host;
    }
    //代理即中介租房时要做的所有事
    public void rent() {
        seeFang();
        //真正的目的
        host.rent();
        qianHetong();
        fare();
    }

    public void seeFang(){
        System.out.println("看房");
    }
    public void qianHetong(){
        System.out.println("签合同");
    }
    public void fare(){
        System.out.println("收费");
    }
}

代理给房东完成租房

public class Client {
    public static void main(String[] args) {
        //房东要出租房
        Host host=new Host();
        //代理中介帮房东出租房
        Proxy proxy=new Proxy(host);
        //代理中介向客户出租房
        proxy.rent();
    }
}

二.动态代理模式理解

动态代理核心即动态生成代理类
1.仍以房东租房先来理解

租房接口

//租房接口
public interface Rent {
    public void rent();
}

房东

//房东
public class Host implements Rent {
    public void rent() {
        System.out.println("我是房东,我要出租房子");
    }
}

动态代理类来生成租房代理类

//用这个类自动生成代理类
public class ProxyInvocationHandle implements InvocationHandler {
    //被代理的接口
    private Rent rent;
    public void setRent(Rent rent) {
        this.rent = rent;
    }

    //生成代理类对象
    public Object getProxy(){
       return Proxy.newProxyInstance(this.getClass().getClassLoader(),rent.getClass().getInterfaces(),this);
    }
    //处理代理实例,并返回结果
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = method.invoke(rent, args);
        return result;
    }
}

客户端

public class Client {
    public static void main(String[] args) {
        Host host=new Host();
        ProxyInvocationHandle pih = new ProxyInvocationHandle();
        pih.setRent(host);
        //生成代理类对象
        Rent proxy = (Rent) pih.getProxy();
        proxy.rent();
    }
}

2.动态代理模式工具类

dao接口定义要做的事情

public interface UserDao {
    public void addUser();
    public void deleteUser();
    public void updateUser();
    public void queryUser();
}

UserService实现接口

public class UserService implements UserDao {

    public void addUser() {
        System.out.println("增加一个用户");
    }

    public void deleteUser() {
        System.out.println("删除一个用户");
    }

    public void updateUser() {
        System.out.println("更新一个用户");
    }

    public void queryUser() {
        System.out.println("查询一个用户");
    }
}

动态代理类工具即可以产生任何一个业务接口的代理类

//用这个类自动生成代理类
public class ProxyInvocationHandle implements InvocationHandler {
    //被代理的接口
    private Object target;

    public void setTarget(Object target) {
        this.target = target;
    }

    //生成代理类对象
    public Object getProxy(){
       return Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
    }
    //处理代理实例,并返回结果
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        log(method.getName());
        Object result = method.invoke(target, args);
        return result;
    }

    public void log(String msg){
        System.out.println("执行了"+msg+"方法");
    }
}

客户端调用

public class Client {
    public static void main(String[] args) {
        //真实角色
        UserService UserService=new UserService();
        //代理角色,不存在
        ProxyInvocationHandle pih=new ProxyInvocationHandle();
        //设置要代理的对象
        pih.setTarget(UserService);
        //动态生成代理类
        UserDao proxy = (UserDao) pih.getProxy();

        proxy.addUser();

    }
}

运行结果:

posted @ 2020-11-16 11:18  zhiYong'blog  阅读(120)  评论(0)    收藏  举报