设计模式(三)代理模式

xiaoxiao2025-04-21  9

代理模式:一个代理角色和一个真正的角色,代理角色代替真正角色执行操作

代理模式又分为静态代理模式和动态代理模式。

静态代理模式:

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() 收钱

本文参考武哥

转载请注明原文地址: https://www.6miu.com/read-5028825.html

最新回复(0)