代理和被代理实现同一个接口
package com.ij34.proxy; public interface ProxyPattern { /* 代理和被代理的共同点就是要实现同一个接口 */ public void eat(); public void sleep(); }
代理者女孩的母亲
package com.ij34.proxy; /* 代理类 */ public class GrilsMother implements ProxyPattern{ private ProxyPattern pp; public GrilsMother(ProxyPattern pp){ this.pp=pp; } @Override public void eat() { pp.eat(); } @Override public void sleep() { pp.sleep(); } }
被代理者女孩
package com.ij34.proxy; /* 被代理类 */ public class Gril implements ProxyPattern{ @Override public void eat() { System.out.println("我是girl,我在eat"); } @Override public void sleep() { System.out.println("我是girl,我在sleep"); } }
测试
package com.ij34.proxy; /* 测试代理,表面上写女孩女孩母亲吃饭睡觉,实际上写女孩吃饭睡觉 */ public class ProxyTest { public static void main(String[] args) { GrilsMother dm = new GrilsMother(new Gril()); dm.eat(); dm.sleep(); } }
测试结果
附:
Spring里代理模式,Spring AOP 利用了 AspectJ AOP实现的! AspectJ AOP 的底层用了动态代理
动态代理有两种
目标方法有接口时候自动选用 JDK 动态代理
目标方法没有接口时候选择 CGLib 动态代理