設計模式之代理模式 Proxy
阿新 • • 發佈:2017-09-04
net rac style and static his public 分享 con
定義與模型
‘
應用場景和分類
代碼實現
staticProxy靜態代理
public interface Star { /** * 面談 */ void confer(); /** * 簽合同 */ void signContract(); /** * 訂票 */ void bookTicket(); /** * 唱歌 */ void sing(); /** * 收錢 */ void collectMoney(); }抽象角色
public class RealStar implements Star{ @Override public void confer() { System.out.println("真實角色面談"); } @Override public void signContract() { System.out.println("真實角色簽合同"); } @Override public void bookTicket() { System.out.println(真實角色"真實角色訂票"); } @Override public void sing() { System.out.println("真實角色唱歌"); } @Override public void collectMoney() { System.out.println("真實角色收錢"); } }
public class ProxyStar implements Star{ private Star star; public ProxyStar(Star star) {代理角色super(); this.star = star; } @Override public void confer() { System.out.println("代理角色面談"); } @Override public void signContract() { System.out.println("代理角色簽合同"); } @Override public void bookTicket() { System.out.println("代理角色訂票"); } @Override public void sing() { star.sing(); //代理角色不能唱歌 } @Override public void collectMoney() { System.out.println("代理角色收錢"); } }
public class Client { public static void main(String[] args) { Star real = new RealStar(); Star proxy = new ProxyStar(real); proxy.confer(); proxy.signContract(); proxy.bookTicket(); proxy.sing(); proxy.collectMoney(); } }調用
dynamicProxy動態代理
public interface Star { /** * 面談 */ void confer(); /** * 簽合同 */ void signContract(); /** * 訂票 */ void bookTicket(); /** * 唱歌 */ void sing(); /** * 收錢 */ void collectMoney(); }抽象角色
public class RealStar implements Star{ @Override public void confer() { System.out.println("真實角色面談"); } @Override public void signContract() { System.out.println("真實角色簽合同"); } @Override public void bookTicket() { System.out.println("真實角色訂票"); } @Override public void sing() { System.out.println("真實角色唱歌"); } @Override public void collectMoney() { System.out.println("真實角色收錢"); } }真實角色
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; 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 { //System.out.println("****查看調用過程*****"); //Client調用的時候經過這裏 Object object = null; System.out.println("真正的方法執行前,面談,簽合同,訂票"); if(method.getName().equals("sing")){ object = method.invoke(realStar, args); } System.out.println("真正的方法執行後,收錢"); return object; } }代理處理器
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.bookTicket(); proxy.sing(); } }調用
推薦博客
http://blog.csdn.net/rock_ray/article/details/22491763
設計模式之代理模式 Proxy