代理( Proxy)模式 顾名思义就是对象之间不直接发生联系,而是通过中间的代理人进行沟通。这种关系在现在的娱 乐圈中普遍存在:明星通常都有经纪人来代理自己的演出事宜,而不是直接去联系演出商。下面 就通过这个实际中的例子来说明代理模式 首先画出关系类图: << Interface>> 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 接口实现,具体过程如下: