代理( Proxy)模式 顾名思义就是对象之间不直接发生联系,而是通过中间的代理人进行沟通。这种关系在现在的娱 乐圈中普遍存在:明星通常都有经纪人来代理自己的演出事宜,而不是直接去联系演出商。下面 就通过这个实际中的例子来说明代理模式 首先画出关系类图: > Artist o showO: void Broker c SuperStar o star: Superstar ● subcontr act0:woid o show(: void ●sow():woi o paytax () void 演艺人士:包括经纪人和明星,都属于娱乐圈中人。 ·演艺人士 日田 public interface Artist{ *演出活动 public void show(String showType):
代理(Proxy)模式 顾名思义就是对象之间不直接发生联系,而是通过中间的代理人进行沟通。这种关系在现在的娱 乐圈中普遍存在:明星通常都有经纪人来代理自己的演出事宜,而不是直接去联系演出商。下面 就通过这个实际中的例子来说明代理模式。 首先画出关系类图: 演艺人士:包括经纪人和明星,都属于娱乐圈中人。 /** * 演艺人士 * */ public interface Artist { /** * 演出活动 */ public void show(String showType); }
经纪人 日田/* 1·经纪人(参考(Java与模式》一"代理Pox)模式”一章部分代码) APublic class Broker implements Artist private String SIGN="[经纪人" ∥旗下明星 private Starstar; *签订和约 中申 public void subcontract System. out. printIng(sGN+"签订和约" 由P 经纪人代明星打理一切演出事宜 白由 public void show(String show lype) ∥/签约 subcontract ∥通知明星演出 if (star = null)
经纪人: /** * 经纪人(参考《Java 与模式》- "代理(Proxy)模式"一章部分代码) * * */ public class Broker implements Artist { private String SIGN = " [经纪人] " ; // 旗下明星 private Star star; /** * 签订和约 */ public void subcontract() { System.out.println(SIGN + " 签订和约 " ); } /** * 经纪人代明星打理一切演出事宜 */ public void show(String showType) { // 签约 subcontract(); // 通知明星演出 if (star == null ) {
star show(showType) 交税 pay Taxo *演出后交税 System. out. println((sGN+"演出后交税") 明星 日田 *明星 APublic class Star implements Artist private String SIGN="[明星] Fe public void show(String showType)( System. out. printIn(SIGN showType)
star = new Star(); } star.show(showType); // 交税 payTax(); } /** * 演出后交税 */ public void payTax() { System.out.println(SIGN + " 演出后交税 " ); } } 明星: /** * 明星 * * */ public class Star implements Artist { private String SIGN = " [明星] " ; public void show(String showType) { System.out.println(SIGN + showType); }
赞助商:通过联系经纪人安排明星演出 ·赞助商:与经纪人联系安排演出事宜 曰田 Po public static void main(String args)( Broker broker broker show("演电影") broker show("拍电视"); broker. show 唱片"); broker. show("演唱会"); [运行结果] 经纪人】签订和约 明星】演电影 经纪人】演出后交税 经纪人】签订和约 明星】拍电视 经纪人]演出后交税
} 赞助商:通过联系经纪人安排明星演出 /** * 赞助商: 与经纪人联系安排演出事宜 * */ public class Patron { /** * @param args */ public static void main(String[] args) { Broker broker = new Broker(); broker.show( " 演电影 " ); broker.show( " 拍电视 " ); broker.show( " 出唱片 " ); broker.show( " 演唱会 " ); } } [运行结果]: [ 经纪人 ] 签订和约 [ 明星 ] 演电影 [ 经纪人 ] 演出后交税 [ 经纪人 ] 签订和约 [ 明星 ] 拍电视 [ 经纪人 ] 演出后交税
经纪人]签订和约 明星】出唱片 经纪人】演出后交税 经纪人]签订和约 明星]演唱会 经纪人】演出后交税 并没有真正的把Java的 Proxy的概念用出来 首先 Bro ker不应该是 Artist Broker只应该是 Invocation Handler, Artist代理是 Proxy的 new ProxyInstance方法自动构造出来 的, Broker自己去找 Artist(当然也可以采用IOC让 Artist自己去找 Bro ker),通过 Invocation Handler的 invoke方法截获Show方法,找适应的 Artist去处理 代理( Proxy)模式(续) Java apl中提供了对 Proxy模式的支持,主要是通过反射( Reflec包中的 Proxy类和 Invocatio hAndler接口实现,具体过程如下
[ 经纪人 ] 签订和约 [ 明星 ] 出唱片 [ 经纪人 ] 演出后交税 [ 经纪人 ] 签订和约 [ 明星 ] 演唱会 [ 经纪人 ] 演出后交税 并没有真正的把 Java 的 Proxy 的概念用出来。 首先 Broker 不应该是 Artist。 Broker 只应该是 InvocationHandler,Artist 代理是 Proxy 的 newProxyInstance 方法自动构造出来 的 , Broker 自己去找 Artist ( 当 然 也 可以 采 用 IOC 让 Artist 自己去找 Broker), 通 过 InvocationHandler 的 invoke 方法截获 Show 方法,找适应的 Artist 去处理。 代理(Proxy)模式(续) Java API 中提供了对 Proxy 模式的支持,主要是通过反射(Reflect)包中的 Proxy 类和 Invocatio nHandler 接口实现,具体过程如下:
(1)实现 Invocation Handler接口,在 invo ke)方法中实现代理类要完成的操作; (2 )itis Proxy. new Proxylnstance(ClassLoader loader, Class interfaces, nvo handler h)方法生成一个代理类从参数可以看出代理类将实现被代理对 象的接口,而具体的实现过程是在上面实现的 In vocation Handler. invoke()中定义的 还是用演艺圈的例子来说明 首先,类的关系图需要修改一下: I> ①> InvocationHandler Artist o invoke(: object C BrokerHandler o star: sta o showO: void o subcontract(: void ● payTax():void o invoke(: void 可以看出,这里并没有经纪人( Broke)类,而是新增了一个经纪人操作类( BrokeHandler),这是因 为通过 Proxy. newProxy Instance0方法, Java APl将自动为我们生成一个对于 Artist接口的代理 类(即: Broke),我们只需定义代理的操作即可 经纪人工作 *经纪人工作
---------------------------------------------------------------- (1) 实现 InvocationHandler 接口,在 invoke()方法中实现代理类要完成的操作; (2) 通过 Proxy.newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h)方法生成一个代理类,从参数可以看出代理类将实现被代理对 象的接口,而具体的实现过程是在上面实现的 InvocationHandler.invoke()中定义的. ---------------------------------------------------------------- 还是用演艺圈的例子来说明: 首先,类的关系图需要修改一下: 可以看出,这里并没有经纪人(Broke)类,而是新增了一个经纪人操作类(BrokeHandler),这是因 为通过 Proxy.newProxyInstance()方法,Java API 将自动为我们生成一个对于 Artist 接口的代理 类(即:Broke),我们只需定义代理的操作即可. 经纪人工作: /** * 经纪人工作 *
EEpublic class BrokerHandler implements InvocationHandler I private String SIGN=“[经纪人工们"; 旗下明星 private Star star po public BrokerHandler(Star star)( this star star *签订和约 Fe private void subcontract System. out. printin(SGN+"签订和约") *演出后 税 白 private void pay Tax0{ System. out. printin(SGN+"演出后交税") @see java. lang reflect. InvocationHandlerffinvoke(java. lang Object, I. java. lang reflect Method, java. lang. Object)
*/ public class BrokerHandler implements InvocationHandler { private String SIGN = " [经纪人工作] " ; // 旗下明星 private Star star; public BrokerHandler(Star star) { this .star = star; } /** * 签订和约 */ private void subcontract() { System.out.println(SIGN + " 签订和约 " ); } /** * 演出后交税 */ private void payTax() { System.out.println(SIGN + " 演出后交税 " ); } /** * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, * java.lang.reflect.Method, java.lang.Object) */
public Object invoke(object proxy, Method method, Object[ args) throws Throwable null ∥/签约 subcontract: ∥安排艺人演出 I obj= method. invoke(star, args) ∥1交税 pay Taxo retum obj 艺人 日田 ·艺人 public interface Artist public void show(String showType) 明星 日田r *明星 日田 public class Star implements Artist… pnvate String SIGN 明星]";
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object obj = null ; // 签约 subcontract(); // 安排艺人演出 obj = method.invoke(star, args); // 交税 payTax(); return obj; } } 艺人: /** * 艺人 * */ public interface Artist { public void show(String showType); } 明星: /** * 明星 * */ public class Star implements Artist { private String SIGN = " [明星] ";
public void show(string showtype /Type) 演出赞助商 赞助商 日 public class Patron… /** public static void main(String[] args)..i ew StarO BrokerHandler broker new BrokerHandler(star) Artist b =(Artist) Proxy. newProxyInstance(star. getclassO getclassLoadero, star.getClasso.getlnterfaceso, broker) b show("演电影") b show("拍电视") b show("出唱片") b show("演唱会")
public void show(String showType) { System.out.println(SIGN + showType); } } 演出赞助商: /** * 演出赞助商 * */ public class Patron { /** *//** * @param args */ public static void main(String[] args) { Star star = new Star(); BrokerHandler broker = new BrokerHandler(star); Artist b = (Artist) Proxy.newProxyInstance(star.getClass() .getClassLoader(), star.getClass().getInterfaces(), broker); b.show( " 演电影 "); b.show( " 拍电视 "); b.show( " 出唱片 "); b.show( " 演唱会 "); } }
[运行结果]: 【经纪人工作]签订和约 明星]演电影 经纪人工作]演出后交税 经纪人工作]签订和约 明星]拍电视 经纪人工作]演出后交税 经纪人工作] 明星]出唱片 经纪人工作]演出后交税 经纪人工作]签订和约 明星]演唱会 经纪人工作】演出后交税
[运行结果]: [ 经纪人工作 ] 签订和约 [ 明星 ] 演电影 [ 经纪人工作 ] 演出后交税 [ 经纪人工作 ] 签订和约 [ 明星 ] 拍电视 [ 经纪人工作 ] 演出后交税 [ 经纪人工作 ] 签订和约 [ 明星 ] 出唱片 [ 经纪人工作 ] 演出后交税 [ 经纪人工作 ] 签订和约 [ 明星 ] 演唱会 [ 经纪人工作 ] 演出后交税