代理模式:使用代理对象对源对象进行访问控制
优点:
1.以调用者透明的方式,动态的改变对象的行为
2.主题对象不会改变,高扩展性,需要产生新的行为通过建立代理对象进行
3.职责明确,不同的代理类进行不同职责的代理,又跟主题对象进行了严格的区别
标准类图:
静态代理:
抽象主题类:
public interface Subject {
public void doSomething();
}
具体主题类:
public class ConcreteSubject implements Subject{
@Override
public void doSomething() {
System.out.println("original do something");
}
}
代理类:
public class Proxy implements Subject{
private Subject subject;
public Proxy(Subject subject){
this.subject = subject;
}
@Override
public void doSomething() {
System.out.println("access control");
subject.doSomething();
}
}
场景类:
public class Client {
public static void main(String[] args) {
Subject subject = new ConcreteSubject();
Subject proxy = new Proxy(subject);
proxy.doSomething();
}
}
动态代理(JDK):
抽象主题类和具体主题类没有变化,代理类进行修改:
public class DynamicProxy implements InvocationHandler{
private Subject subject;
public DynamicProxy(Subject subject){
this.subject = subject;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("access control");
return method.invoke(subject, args);
}
public Subject getInstance(){
return (Subject)Proxy.newProxyInstance(subject.getClass().getClassLoader(),
subject.getClass().getInterfaces(),
this);
}
}
场景类:
public class Client {
public static void main(String[] args) {
Subject subject = new ConcreteSubject();
DynamicProxy proxyFactory = new DynamicProxy(subject);
Subject proxy = proxyFactory.getInstance();
proxy.doSomething();
}
}