定义
为其他对象提供一种代理以控制对这个对象的访问
角色定义
1. Subject抽象主题角色
抽象主题类可以是抽象类也可以是接口,是一个最普通的业务类型定义,无特殊要求.
2. RealSubject具体主题角色
也叫做被委托角色,被代理角色.
3. Proxy代理主题角色
代理类
优点
1. 职责清晰
2. 高扩展性
3. 智能代
通用代码
抽象主题类
public interface Subject {
void doSomething();
}
真实主题类
public class RealSubject implements Subject {
@Override
public void doSomething() {
}
}
代理类
public class Proxy implements Subject {
private Subject subject ;
public Proxy() {
Subject = new RealSubject();
}
public Proxy(Subject subject) {
this.subject = subject;
}
private void after(){
}
private void before(){
}
@Override
public void doSomething() {
before();
realSubject.doSomething();
after();
}
}
普通代理
调用才只知代理而不用知道真实的角色是谁,屏蔽了真实角色的变更对高层模块的影响,真实的主题角色想怎么修改变怎么修改,对高层次的模块没有任何的影响.
抽象主题类
public interface Subject {
void doSomething();
}
真实主题类
public class RealSubject implements Subject {
public RealSubject(Subject subject) {
if(subject ==null){
throw new RuntimeException("不能创建");
}
}
@Override
public void doSomething() {
}
}
代理类
public class Proxy implements Subject {
private Subject subject ;
public Proxy() {
subject = new RealSubject(this);
}
public Proxy(Subject subject) {
this.subject = subject;
}
private void after(){
}
private void before(){
}
@Override
public void doSomething() {
before();
realSubject.doSomething();
after();
}
}
强制代理
强制代理的概念就是要从真实角色查找到代理角色,不允许直接访问真实角色.
抽象主题类
public interface Subject {
void doSomething();
Subject getProxy();
}
真实主题类
public class RealSubject implements Subject {
public Subject proxy ;
@Override
public void doSomething() {
if(!isProxy()){
throw new RuntimeException("请使用代理");
}
}
@Override
public Subject getProxy() {
proxy = new Proxy(this);
return proxy;
}
private boolean isProxy(){
return proxy != null;
}
}
代理类
public class Proxy implements Subject {
private Subject subject ;
public Proxy(Subject subject) {
this.subject = subject;
}
private void after(){
}
private void before(){
}
@Override
public void doSomething() {
before();
subject.doSomething();
after();
}
@Override
public Subject getProxy() {
return this;
}
}
动态代理(JDK)
JDK动态代理首要条件是:被代理类必须实现一个接口
抽象主题
public interface Subject {
void doSomething();
}
真实主题
public class RealSubject implements Subject {
@Override
public void doSomething() {
}
}
通知接口
public interface Advice {
void exec();
}
通知实现
public class BeforAdvice implements Advice {
@Override
public void exec() {
}
}
动态代理Handler类
public class DynamicProsy<T> {
public static <T> T newProxyInstance(ClassLoader classLoader,Class<?>[] interfaces,InvocationHandler handler){
new BeforAdvice().exec();
return (T)Proxy.newProxyInstance(classLoader,interfaces,handler);
}
}
具体业务动态代理
public class SubjectDynamicProxy extends DynamicProsy {
public static <T> T newProxyInstance(Subject subject) {
ClassLoader classLoader = subject.getClass().getClassLoader();
Class<?>[] classes = subject.getClass().getInterfaces();
InvocationHandler handler = new MyInvocationHandler(subject);
return newProxyInstance(classLoader, classes, handler);
}
}
场景类
public class Client {
public static void main(String[] args) {
Subject subject = new RealSubject();
Subject proxy = SubjectDynamicProxy.newProxyInstance(subject);
proxy.doSomething();
}
}