代理模式
代理模式分为静态代理和动态代理。
一、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("销售成功");
}
}
实现结果:
四、复习或作业
当你忘了动态代理是怎么实现的,那么参考第三点的代码,在租房中介,售车中介的基础上,再添加售票站点代理售票的功能。