代理模式
概述
代码示例
public interface Subject {
public void sailBook();
}
public class RealSubject implements Subject {
public void sailBook() {
System.out.println("卖书");
}
}
public class ProxySubject implements Subject{
private RealSubject realSubject;
public void sailBook() {
dazhe();
if(realSubject == null) {
realSubject = new RealSubject();
}
realSubject.sailBook();
give();
}
public void dazhe() {
System.out.println("打折");
}
public void give() {
System.out.println("赠送代金券");
}
}
主函数
public class MainClass {
public static void main(String[] args) {
ProxySubject proxySubject = new ProxySubject();
proxySubject.sailBook();
}
}
动态代理
以上的部分我们需要手动代理,但是我们想要自动的让它进行代理
代码示例
public interface Subject {
public void sailBook();
}
public class RealSubject implements Subject {
public void sailBook() {
System.out.println("卖书");
}
}
public class MyHandler implements InvocationHandler {
private RealSubject realSubject;
public void setRealSubject(RealSubject realSubject) {
this.realSubject = realSubject;
}
public Object invoke(Object proxy, Method method, Object[] args){
Object result = null;
dazhe();
try {
result = method.invoke(realSubject, args);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
give();
return result;
}
public void dazhe() {
System.out.println("打折");
}
public void give() {
System.out.println("赠送代金券");
}
}
主函数
public class MainClass {
public static void main(String[] args) {
RealSubject realSubject = new RealSubject();
MyHandler myHandler = new MyHandler();
myHandler.setRealSubject(realSubject);
Subject proxySubject = (Subject)Proxy.newProxyInstance(RealSubject.class.getClassLoader(), realSubject.getClass().getInterfaces(), myHandler);
proxySubject.sailBook();
}
}