代理模式~Thread代理实现,静态代理,动态代理

代理模式

代理模式分为静态代理和动态代理。

一、Thread代理模式实现

public class Thread implements Runnable {
    private Runnable target;
    public Thread(Runnable target) {
        init(null, target, "Thread-" + nextThreadNum(), 0);
    }
    public void run() {
        if (target != null) {
            target.run();
        }
    }
  	、、、
}

二、实现一个租房代理的静态代理

根据Thread代理模式的实现,写一个租户代理,即中介。

package com.ykq;

/**
 * 租房代理
 */
public class ProxyRent {
    /**
     * 租户
     */
    private ITenant1 tenant;

    /**
     * 无参构造函数
     */
    public ProxyRent() {
    }

    /**
     * 有参构造函数
     */
    public ProxyRent(ITenant1 tenant) {
        this.tenant = tenant;
    }

    /**
     * 租房
     */
    public void rentHouse(String person) {
        if (tenant == null) {
            return;
        }
        System.out.println("中介和" + person + "谈拢价格");
        tenant.rentHouse("中介");
        System.out.println("中介收取中介费");
    }

    public static void main(String[] args) {
        ITenant1 tenant = new Tenant1();
        tenant.rentHouse("房东");
        System.out.println("##########");
        System.out.println("##########");
        System.out.println("##########");
        ProxyRent proxyRent = new ProxyRent(tenant);
        proxyRent.rentHouse("房东");
    }
}

interface ITenant1 {
    void rentHouse(String person);
}

/**
 * 租户
 */
class Tenant1 implements ITenant1{

    public void rentHouse(String person) {
        System.out.println("我和" + person + "谈拢价格");
        System.out.println("租房成功");
    }
}

实现结果:
在这里插入图片描述

三、实现租房中介、售车销售的动态代理

静态代理,对于不同的被代理对象,需要写对应的代理对象,例如对于住房,需要写一个租房中介,对于售车销售需要写一个销售中介。而动态代理可以只写一个代理对象,即可实现既代理租房,又代理销售,甚至代理卖票等。
下面的实现方式是通过jdk反射实现的动态代理,对于cglib的动态代理,知道即可,不做更深层次的了解。

package com.ykq;

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

/**
 * 动态代理对象需要实现InvocationHandler接口
 */
public class DynamicProxy implements InvocationHandler {
    /**
     * 被代理对象
     */
    private Object client;

    /**
     * 有参构造方法,将要被代理的对象的clazz传入
     */
    public DynamicProxy(Class clazz) {
        try {
            this.client = clazz.newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("中介(销售)和货主谈拢价格");
        Object rtn = method.invoke(client, args);
        System.out.println("中介(销售)收取中介费");
        return rtn;
    }

    /**
     * 测试方法,测试既作为中介代理租房,又代理销售代理卖车
     */
    public static void main(String[] args) {
        DynamicProxy dynamicProxy = new DynamicProxy(Tenant.class);
        ITenant tenant =(ITenant) Proxy.newProxyInstance(Tenant.class.getClassLoader(),
                new Class[]{ITenant.class}, dynamicProxy);
        tenant.rent("中介");
        System.out.println("##########");
        DynamicProxy dynamicProxy1 = new DynamicProxy(Sell.class);
        ITenant sell = (ITenant) Proxy.newProxyInstance(Sell.class.getClassLoader(),
                Sell.class.getInterfaces(), dynamicProxy1);
        sell.rent("二手车销售");
    }
}

/**
 * 租赁接口
 */
interface ITenant {
    // 租赁
    void rent(String person);
}

/**
 * 租户
 */
class Tenant implements ITenant {
    public void rent(String person) {
        System.out.println("我和" + person + "谈拢价格");
        System.out.println("租房成功");
    }
}

/**
 * 销售
 */
class Sell implements ITenant {

    @Override
    public void rent(String person) {
        System.out.println("我和" + person + "谈拢价格");
        System.out.println("销售成功");
    }
}

实现结果:
在这里插入图片描述

四、复习或作业

当你忘了动态代理是怎么实现的,那么参考第三点的代码,在租房中介,售车中介的基础上,再添加售票站点代理售票的功能。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值