动态代理的中介出租房屋

房屋租房的动态代理实现


由于静态代理的弊端,代理类和被代理类成对出现,为对其优化产生了被代理类
在这里插入图片描述
Rent为租房接口
Host为房东
ProxyInvocationHandler代理类处理程序(负责代理类的生成和处理)
Client(模拟客户)

package demo1;
//动态代理的代理类和真实角色(被代理对象都需要继承指定接口)
//租房
public interface Rent {
    void rent();
}


package demo1;
//房东租房
public class Host implements Rent{

    public void rent() {
        System.out.println("房东租房");
    }
}




package demo1;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

//代理类处理程序
//InvocationHandler为了执行代理对象
public class ProxyInvocationHandler implements InvocationHandler {

    //真实对象(房东)被代理类
    Rent rent;

    public void setRent(Rent rent) {
        this.rent = rent;
    }

    public Rent getRentProxy(){
        return (Rent) Proxy.newProxyInstance(this.getClass().getClassLoader(),rent.getClass().getInterfaces(),this);
    }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        log();
        Object result = method.invoke(rent, args);//执行真实对象的方法
        after();

        return result;
    }

//    创建日志(辅助程序)
    public void log(){
        System.out.println("看房");
    }
//    创建
    public void after(){
        System.out.println("签合同");
    }

}



package demo1;
//客户
public class Client {
    public static void main(String[] args) {
//        真实角色(房东)
        Host host = new Host();

//        客户要租房要创建代理对象(中介)
        ProxyInvocationHandler proxyInvocationHandler = new ProxyInvocationHandler();
//        设置代理类的  真实角色
        proxyInvocationHandler.setRent(host);
//        创建代理对象
        Rent rentProxy = proxyInvocationHandler.getRentProxy();
//      代理对象执行程序
        rentProxy.rent();

    }
}


当涉及到我们的web开发时 我们需要对xxxServiceImpl程序需要辅助功能和日志时
XxxServiceImpl为真实对象(被代理类)
XxxService接口
夏利为动态代理实现此日志的添加

package demo2;

public interface UserService {
    void add();

    void delete();

    void update();

    void query();
}


package demo2;

//真实对象  想要在方法加入日志
public class UserServiceImpl implements UserService{

    public void add() {
        System.out.println("执行添加用户方法");
    }

    public void delete() {
        System.out.println("执行删除用户方法");
    }

    public void update() {
        System.out.println("执行更新用户方法");
    }

    public void query() {
        System.out.println("执行查询方法");
    }
}


package demo2;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyInvocationHandler implements InvocationHandler {

//    真实对象
    private Object target;

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

//    生成代理类对象
    public Object getTarget(){
        return Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
    }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//        加入日志
        show(method.getName());
        method.invoke(target,args);
        return null;
    }

    public void show(String name){
        System.out.println("执行"+name+"方法");
    }
}


package demo2;

public class Client {
    public static void main(String[] args) {
//        真实对象
        UserService userService = new UserServiceImpl();
        
//        生成代理类
        ProxyInvocationHandler proxyInvocationHandler = new ProxyInvocationHandler();
        proxyInvocationHandler.setTarget(userService);
        UserService target = (UserService) proxyInvocationHandler.getTarget();
        
//        执行方法
        target.delete();
    }
}

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值