解决问题: 主要业务与次要业务松耦合的组装 本质: 监控行为特征 下面主要解决: 吃饭前洗手,wc后洗手
人的行为接口 public interface Behavior { //吃饭 void eat(); //上厕所 void wc(); } 人实现了该有的行为 public class Person implements Behavior { @Override public void eat() { System.out.println("吃饭"); } @Override public void wc() { System.out.println("上WC"); }3.代理类 实现Java动态代理类位于java.lang.reflect包下的代理处理接口
public class Invocation implements InvocationHandler { private Object target; public Invocation(Object target){ this.target=target; } /** * * @param proxy 代理类 * @param method 要被代理的多有方法 * @param args 存放实际参数的集合 * @return 返回需要的参数 * @throws Throwable */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //获取方法名 String name = method.getName(); //吃饭先洗手 if(name.equals("eat")){ wash(); method.invoke(this.target,args); //wc完后洗手 }else { method.invoke(this.target,args); wash(); } return null; } /** * 洗手的方法 */ private void wash(){ System.out.println("洗手中---------"); } }4.测试
public class RunMain { public static void main(String[] args) { //人 Person person = new Person(); //代理的多态形式 InvocationHandler invocation = new Invocation(person); Class<?> cls = person.getClass(); /** * loader 类加载器 * interfaces 实现接口 * invocation InvocationHandler接口 */ Behavior behavior = (Behavior) Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(), invocation); behavior.eat(); behavior.wc(); } }