前言:
代理模式可以对原来的类进行扩展,通过代理对象来访问目标对象。例如spring aop
怎么实现:
抽象角色:真实对象与代理对象都需要实现的接口
真实角色:继承抽象角色,要被代理的类
代理类:扩展真实角色。
静态代理:
package com.xhx.designpattern;
/**
* 抽象角色
* 真实对象与代理对象都需要实现的接口
*/
public interface Subject {
void sailBook(String bookName,Double money);
}
package com.xhx.designpattern;
/**
* 真实角色
*/
public class RealSubject implements Subject {
public void sailBook(String bookName,Double money) {
System.out.println(bookName+" "+money+"元");
}
}
package com.xhx.designpattern;
import java.util.Objects;
/**
* 代理角色,要接收真实的角色,
* 然后再进行进一步封装
*/
public class ProxySubject implements Subject{
private Subject subject;
public void setSubject(Subject subject) {
this.subject = subject;
}
public void sailBook(String bookName, Double money) {
if(Objects.isNull(subject)){
subject = new RealSubject();
}
System.out.println("打折");
subject.sailBook(bookName,money);
System.out.println("返优惠券");
}
}
package com.xhx.designpattern;
/**
* 自己实现代理
* 静态代理
*/
public class App {
public static void main(String[] args) {
ProxySubject proxySubject = new ProxySubject();
RealSubject realSubject = new RealSubject();
proxySubject.setSubject(realSubject);
proxySubject.sailBook("小金梅",20.00);
}
}
运行结果:
动态代理:继承InvocationHandler,利用反射
package com.xhx.designpattern;
/**
* 被代理类的抽象父类
*/
public interface Subject {
void sailBoot(String bookName,Double money);
}
package com.xhx.designpattern;
/**
* 被代理的类
*/
public class RealSubject implements Subject {
public void sailBoot(String bookName, Double money) {
System.out.println(bookName+" "+money+"元");
}
}
package com.xhx.designpattern;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* 动态代理类必须实现这个接口 InvocationHandler
*/
public class MyHandler implements InvocationHandler {
//被代理的对象
private Subject subject;
public void setSubject(Subject subject) {
this.subject = subject;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(proxy.getClass().getName());
System.out.println("打折");
Object invoke = method.invoke(subject, args);
System.out.println("赠代金券");
return invoke;
}
}
package com.xhx.designpattern;
import java.lang.reflect.Proxy;
/**
* jdk动态代理
*/
public class App {
public static void main(String[] args) {
Subject subject = new RealSubject();
System.out.println(subject.getClass().getName());
MyHandler myHandler = new MyHandler();
myHandler.setSubject(subject);
//由哪个ClassLoader对象来对生成的代理对象进行加载
//这个代理类要继承的接口
//把代理类实例与handler关联,当动态代理类在调用方法的时候,会关联到这个对象上,invoke方法
Subject proxySubject = (Subject)Proxy.newProxyInstance(RealSubject.class.getClassLoader(), subject.getClass().getInterfaces(), myHandler);
proxySubject.sailBoot("小瓶梅",20.00);
System.out.println(proxySubject.getClass().getName());
}
}
运行结果: