文档地址:《设计模式之禅》
切入故事: 我是游戏至尊
定义: Provide a surrogate or placeholder for another object to control access to it.(为其他对象提供一种代理以控制对这个对象的访问。 )
通用类图:
● Subject抽象主题角色
抽象主题类可以是抽象类也可以是接口, 是一个最普通的业务类型定义, 无特殊要求。
● RealSubject具体主题角色
也叫做被委托角色、 被代理角色。 它才是冤大头, 是业务逻辑的具体执行者。
● Proxy代理主题角色
也叫做委托类、 代理类。 它负责对真实角色的应用, 把所有抽象主题类定义的方法限制委托给真实主题角色实现, 并且在真实主题角色处理完毕前后做预处理和善后处理工作。
优点:
1: 职责清晰
2: 高扩展性
3: 智能化
使用场景:日志,事物等
扩展:
普通代理: 普通代理就是场景类要知道代理的存在, 也就是类似的GamePlayerProxy这个类的存在
强制代理: 强制代理则是调用者直接调用真实角色, 而不用关心代理是否存在
动态代理(重点): 动态代理是在实现阶段不用关心代理谁, 而在运行阶段才指定代理哪一个对象。
实例:AOP, Struts是如何把表单元素映射到对象上的
类图:
调用过程:
注意: DynamicProxy 中的this.obj=Proxy.newProxyInstance(c.getClassLoader(),c.getInterfaces(),new MyInvocationHandler(_obj));
1:作用:创建一个对象
2:过程,c.getClassLoader() 对象的类加载器 c.getInterfaces() 查找该类的所有接口, 然后实现接口的所有方法。new MyInvocationHandler(_obj) 由InvocationHandler的实现类实现所有的方法, 由其invoke方法接管所有方法的实现
实现动态代理的首要条件是: 被代理类必须实现一个接口
个人总结:
为其他对象提供一个代理,以控制对当前对象的访问。
在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。
理解AOP时,Aspect切面, JoinPoint切入点,Advice通知,Weave织入要深入理解。