代理模式:一个代理角色和一个真正的角色,代理角色代替真正角色执行操作
代理模式又分为静态代理模式和动态代理模式。
1、首先抽象角色(参考武哥的例子)
package 代理模式; //接口类定义方法 public interface Star { public void confer(); //面谈 public void sing(); //唱歌 public void collectMoney(); //收钱 }
2、真正角色类(对接口里的方法重写)
package 代理模式; //真正的角色,被代理的角色 public class RealStar implements Star { @Override public void confer() { System.out.println("RealStar 面谈"); } @Override public void sing() { System.out.println("RealStar 唱歌(明星)"); } @Override public void collectMoney() { System.out.println("RealStar 收钱"); } }
3、代理类(代理上面真正角色类):
package 代理模式; //代理类 public class ProxyStar implements Star{ public Star star; public ProxyStar(Star star) { super(); this.star = star; } @Override public void confer() { System.out.println("ProxyStar 面谈"); } @Override public void sing() { //其他事都能干,唯一不能干的就是唱歌,唱歌还是得要周杰伦本人来唱 star.sing(); //让他本人来唱 } @Override public void collectMoney() { System.out.println("ProxyStar 收钱"); } }不需要真正角色做的事直接重写方法,不能代替的让其本人做即:
//其他事都能干,唯一不能干的就是唱歌,唱歌还是得要周杰伦本人来唱 star.sing(); //让他本人来唱4、测试类:
package 代理模式; public class test { public static void main(String[] args) { Star r1 = new RealStar(); Star p1 = new ProxyStar(r1); p1.confer(); p1.sing(); p1.collectMoney(); } }
动态代理交给工具来管。是动态代理需要实现invocationHandler接口,并重写里面的Invoke方法,如下:
由上改变:
1、代理类即可:
public class StarHandler implements InvocationHandler { Star realStar; public StarHandler(Star realStar) { super(); this.realStar = realStar; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object object = null; // 在代理真实对象前,我们可以做些自己的操作 System.out.println("面谈"); if(method.getName().equals("sing")) { object = method.invoke(realStar, args); } // 在代理真是对象后,我们可以做些自己的操作 System.out.println("收钱"); return object; } }
2、测试类:
public class Client { public static void main(String[] args) { Star realStar = new RealStar(); StarHandler handler = new StarHandler(realStar); //创建代理类 Star proxy = (Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Star.class}, handler); proxy.sing(); } }3、结果:
面谈 RealStar(周杰伦).sing() 收钱本文参考武哥