代理模式 三个角色:抽象主题 具体主题 代理类 ( 抽象主题约束)
代理主要是 给某个对象提供一个代理以控制对该对象的访问。 类似于 中介
静态代理 :直接提供代理类,实现与具体主题(被代理类)一样的接口 new 代理类 去掉用重写的方法
package com.qf.proxydemo.staticproxy;
//抽象主题,定义具体具体与代理类 实现的业务方法
public interface SellTickets {
//卖票方法
void sell();
}
package com.qf.proxydemo.staticproxy;
//具体主题 被代理类
public class TrainStation implements SellTickets {
@Override
public void sell() {
System.out.println("火车站卖票");
}
}
package com.qf.proxydemo.staticproxy;
//代售点
//代理类 proxy 与具体主题实现一样的业务
//实现一个 接口 是代理的思想 客户是对一个接口的功能感兴趣 所以要保证 实现同一个功能
public class ProxyPoint implements SellTickets {
//被代理类对象
private TrainStation trainStation = new TrainStation();
@Override
public void sell() {
System.out.println("代售点收取一点手续费");
//被代理类方法
trainStation.sell();
}
}
package com.qf.proxydemo.staticproxy;
//静态代理测试
/**
* 直接访问代理类 但是代理类 实现了与 被代理类(具体主题)一样的接口
*/
public class Client {
public static void main(String[] args) {
ProxyPoint proxyPoint = new ProxyPoint();
proxyPoint.sell();
}
}
JDK代理
package com.qf.proxydemo.jdkproxy;
//卖票的业务 被代理类与代理类都要实现的接口
public interface SellTickets {
//卖票的功能
void sell();
}
package com.qf.proxydemo.jdkproxy;
//真是主题 被代理类对象
public class TrainStation implements SellTickets {
@Override
public void sell() {
System.out.println("车站卖票");
}
}
package com.qf.proxydemo.jdkproxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//代理工厂 用来生成代理类对象(真是主题对象) 不是代理类 只是提供代理类的创建
//需要 调用jdk 提供的proxy 类中的 一个newInstance方法
public class ProxyFactoryTwo implements InvocationHandler {
//真是主题对象
private TrainStation station = new TrainStation();
public SellTickets getProxyObjectTwo() {
return (SellTickets)
Proxy.newProxyInstance(station.getClass().getClassLoader(),
station.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("收取一定的费用");
Object invoke = method.invoke(station, args);
return invoke;
}
}
package com.qf.proxydemo.jdkproxy;
//测试
public class Client {
public static void main(String[] args) {
// ProxyFactory factory = new ProxyFactory();
// SellTickets proxyObject = factory.getProxyObject();
// proxyObject.sell();
//获得代理工厂
ProxyFactoryTwo proxyFactoryTwo = new ProxyFactoryTwo();
//获得代理对象
SellTickets sellTickets = proxyFactoryTwo.getProxyObjectTwo();
sellTickets.sell();
}
}
还有一个cglb代理 略
总结 :代理模式 主要注重的是提供代理类工厂 去产生代理对象(程序运行中动态生成),
隔离了 目标对象与访问对象