代理模式+观察者模式
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
10 1-10
动态代理 -- 动态生成代理对象
不用手工编写代理类;而是在运行时候动态生成; 不用手工编写代理类;而是在运行时候动态生成;作用和手工生 成的代理对象一致。 成的代理对象一致。 实现同一个接口: 实现同一个接口: 创建ng.reflect.InvocationHandler ng.reflect.InvocationHandler, 创建ng.reflect.InvocationHandler,每个代理实例都有 一个与它对应的InvocationHandler实例,就是一个方法拦截器。 InvocationHandler实例 一个与它对应的InvocationHandler实例,就是一个方法拦截器。 用以控制对某个对象的访问的拦截。 用以控制对某个对象的访问的拦截。 创建动态代理对象的步骤: 创建动态代理对象的步骤: 指明一系列的接口来创建一个代理对象 创建一个调用处理器Invocation 创建一个调用处理器Invocation handler 对象 将这个代理指定为某个其他对象的代理对象 在调用处理器的invoke()方法中采取代理, invoke()方法中采取代理 在调用处理器的invoke()方法中采取代理,一方面将调用传递给 真实对象,另一方面执行各种需要做的操作。 真实对象,另一方面执行各种需要做的操作。
1) 2) 3) 4)
11 1-11
代理模式——智能引用 代理模式——智能引用 ——
Java虚拟机对内存的管理能力是有限的,但有些应用 虚拟机对内存的管理能力是有限的, 虚拟机对内存的管理能力是有限的 又出于效率的考虑需要将一些较大的对象装载到内存中 为了保证虚拟机不会出现内存溢出,采用软引用,虚 ,为了保证虚拟机不会出现内存溢出,采用软引用 虚 拟机在内存不够的时候能够回收较大的对象。 拟机在内存不够的时候能够回收较大的对象。采用智能 引用能够保证一旦较大对象被回收后能够重新创建大对 象保证客户端的正常使用。 象保证客户端的正常使用。
13 1-13
观察者模式---行为模式 观察者模式---行为模式 --观察者模式的组成: 观察者模式的组成: 观察者模式的静态结构中包含这样一些角色: 观察者模式的静态结构中包含这样一些角色: 抽象主题角色subject: 1)抽象主题角色subject: 抽象观察者角色Observer 2)抽象观察者角色Observer 具体主题角色(concreteSubject) 3)具体主题角色(concreteSubject) 具体观察者(ConcreteObserver) (ConcreteObserver)角色 4)具体观察者(ConcreteObserver)角色
15 1-15
观察者模式---行为模式 观察者模式---行为模式 --定义主题类 public class product extends Observable{ private String name; private float price; public String getName(){ return name;} public void setName(String name){ =name; //设置变化点 设置变化点 setChanged(); notifyObservers(name); } public float getPrice(){ return price;} public void setPrice(float price){ this.price=price; //设置变化点 设置变化点 setChanged(); notifyObservers(new Float(price)); } //以下可以是数据库更新 插入命令 以下可以是数据库更新 插入命令. public void saveToDb(){ ..................... }
3 1-3
代理模式
代理模式结构图
4 1-4
代理模式 --- 结构模式
哪些情况下使用代理模式? 哪些情况下使用代理模式? 虚拟代理( ),如果某一个对象 如果某一个对象( 1)虚拟代理(Virtual Proxy ),如果某一个对象(例如图 需要很长时间才能加载完成,可以使用代理在后台加载。 片)需要很长时间才能加载完成,可以使用代理在后台加载。 远程代理(Remote Proxy), 2)远程代理(Remote Proxy),为一个远程机器提供一个本地 对象来实现远程调用的时候,使用远程代理。 对象来实现远程调用的时候,使用远程代理。客户端无法直接调 用代理所指定的对象, 用代理所指定的对象,比如位于不同主机中的类之间是无法直接 调用的,此时就需要建立代理类并通过代理来调用实际的对象; 调用的,此时就需要建立代理类并通过代理来调用实际的对象; 智能引用 引用( 3)智能引用(Smart Reference ),它在访问对象时执行一 些附加操作。 它的典型用途包括: 些附加操作。 它的典型用途包括:
设计模式
1
目标
掌握静态代理和动态代理的目标,实现方式, 掌握静态代理和动态代理的目标,实现方式,实现步骤 掌握观察者模式的目标,实现方式。 掌握观察者模式的目标,实现方式。理解观察者模式体 现的面向对象的设计原则。 现的面向对象的设计原则。
2 1-2
代理代理以控制对这个对象的访问。 代理模式: 为其他对象提供一种代理以控制对这个对象的访问。 为什么要使用代理模式? 为什么要使用代理模式? 隐藏与业务无关的操作或者访问。通过引入间接性, 隐藏与业务无关的操作或者访问。通过引入间接性,可以动态的 附加一些行为实现。这些附加操作一般用于实际对象的状态控制、 附加一些行为实现。这些附加操作一般用于实际对象的状态控制、 访问控制、生命周期管理等。 访问控制、生命周期管理等。
5 1-5
代理模式 – 体现的设计原则
代理模式有效的向客户端屏蔽了附加行为细节, 代理模式有效的向客户端屏蔽了附加行为细节,降低了客户端和 屏蔽了附加行为细节 系统之间的耦合度。 系统之间的耦合度。 代理模式体现的OO设计原则: OO设计原则 代理模式体现的OO设计原则: 里氏替换原则是代理模式的基础; 1)里氏替换原则是代理模式的基础; 2)代理模式体现了里氏替换原则和开闭原则 多用组合, 3)多用组合,少用继承 代理模式所涉及的角色有: 代理模式所涉及的角色有: 1)真实主题 ReadSubject):客户端实际要操作的对象。 真实主题( ):客户端实际要操作的对象 1)真实主题(ReadSubject):客户端实际要操作的对象。 2)代理 Proxy):代理中含有对真实主题(RealSubject) 代理( ):代理中含有对真实主题 2)代理(Proxy):代理中含有对真实主题(RealSubject) 的一个 引用,可以对真实主题进行操作。 引用,可以对真实主题进行操作。 抽象主题(Subject): ):定义了真实主题和代理的共同操作的接 3) 抽象主题(Subject):定义了真实主题和代理的共同操作的接 这样在任何可以操作真实主题的地方也就可以操作代理。。 口,这样在任何可以操作真实主题的地方也就可以操作代理。。
12 1-12
观察者模式---行为模式 观察者模式---行为模式 --又称作”发布 订阅 模式。 订阅” 又称作”发布—订阅”模式。 定义了一种一对多的依赖关系. 定义了一种一对多的依赖关系. 让多个观察者对象同时 监听某一个主题对象, 监听某一个主题对象, 这个主题对象在状态发生变化的 时候,会通知所有的观察者对象, 时候,会通知所有的观察者对象,使他们能够自动更新自 己。 什么时候使用: 什么时候使用: 当一个对象的改变需要同时通知其他对象的时候, 当一个对象的改变需要同时通知其他对象的时候, 而且 它不知道具体有多少对象需要通知的时候, 它不知道具体有多少对象需要通知的时候,需要通知的 对象能够动态地增加 为什么要使用观察者模式? 为什么要使用观察者模式? 交互对象之间的松耦合设计使得观察者和主题之间达到 一个松耦合。 一个松耦合。
6 1-6
代理模式
首先定义一个接口,在接口中定义一些业务方法, 首先定义一个接口,在接口中定义一些业务方法,客户 所需要的真正的对象和代理对象都来实现这个接口 public interface ProxyInterface{ public void function(); }
7 1-7
代理模式
实现ProxyInterface ProxyInterface接 定义客户所需要的真正的对象 ,实现ProxyInterface接 口 public class ProxyClass implements ProxyInterface{ public ProxyClass(){ } public void function(){ System.out.println("in ProxyClass"); } }
9 1-9
代理模式
public class Proxy implements ProxyInterface{ private ProxyClass proxyclass; //代理类持有一个主题对象的引用 代理类持有一个主题对象的引用 public Proxy(ProxyClass proxyClass){ this.proxyclass = proxyClass; } public void before(){ } public void function(){ before(); if(proxyClass==null){ proxyclass=new ProxyClass(); } proxyclass.function(); after(); } public void after(){ } }
对指向实际对象的引用计数,这样当该对象没有引用时, 对指向实际对象的引用计数,这样当该对象没有引用时,可以自 动释放它(例如从缓存中移除) 动释放它(例如从缓存中移除) 当第一次访问实际对象时,将它从持久层或者缓存中装入内存。 当第一次访问实际对象时,将它从持久层或者缓存中装入内存。 在访问一个实际对象前,检查是否已经锁定了它, 在访问一个实际对象前,检查是否已经锁定了它,以确保其他对 象不能改变它。 象不能改变它。 在访问一个实际对象前,检查是否有相应的权限。 在访问一个实际对象前,检查是否有相应的权限。
14 1-14
观察者模式---行为模式 观察者模式---行为模式 --如何使用观察者模式: 如何使用观察者模式: 价格等方面有变化, 如果网上商店中商品在名称 价格等方面有变化,如果系 统能自动通知会员, 为会员发一封电子邮件信息, 统能自动通知会员, 为会员发一封电子邮件信息,将是 网上商店区别传统商店的一大特色. 网上商店区别传统商店的一大特色. 这就需要在商品product中加入Observer这样角色, 这就需要在商品product中加入Observer这样角色,以便 product中加入Observer这样角色 product细节发生变化时,Observer能自动观察到这种变 细节发生变化时,Observer product细节发生变化时,Observer能自动观察到这种变 并能进行及时的update notify动作 update或 动作. 化,并能进行及时的update或notify动作.
8 1-8
代理模式
客户在不能直接得到他所想要的对象 而是需要通过一个中介机构, 而是需要通过一个中介机构,就是代理设计模式中的代 理对象 代理对象与前面真正的对象一样, 代理对象与前面真正的对象一样,实现同一个接口 用户在调用的时候就不会感觉代理的存在 代理模式不让客户端感觉到代理的存在; 代理模式不让客户端感觉到代理的存在; 代理主题起到 的是传递请求的作用; 的是传递请求的作用; 代理使用委派机制将客户端的调 用委派给真正的主题对象
动态代理 -- 动态生成代理对象
不用手工编写代理类;而是在运行时候动态生成; 不用手工编写代理类;而是在运行时候动态生成;作用和手工生 成的代理对象一致。 成的代理对象一致。 实现同一个接口: 实现同一个接口: 创建ng.reflect.InvocationHandler ng.reflect.InvocationHandler, 创建ng.reflect.InvocationHandler,每个代理实例都有 一个与它对应的InvocationHandler实例,就是一个方法拦截器。 InvocationHandler实例 一个与它对应的InvocationHandler实例,就是一个方法拦截器。 用以控制对某个对象的访问的拦截。 用以控制对某个对象的访问的拦截。 创建动态代理对象的步骤: 创建动态代理对象的步骤: 指明一系列的接口来创建一个代理对象 创建一个调用处理器Invocation 创建一个调用处理器Invocation handler 对象 将这个代理指定为某个其他对象的代理对象 在调用处理器的invoke()方法中采取代理, invoke()方法中采取代理 在调用处理器的invoke()方法中采取代理,一方面将调用传递给 真实对象,另一方面执行各种需要做的操作。 真实对象,另一方面执行各种需要做的操作。
1) 2) 3) 4)
11 1-11
代理模式——智能引用 代理模式——智能引用 ——
Java虚拟机对内存的管理能力是有限的,但有些应用 虚拟机对内存的管理能力是有限的, 虚拟机对内存的管理能力是有限的 又出于效率的考虑需要将一些较大的对象装载到内存中 为了保证虚拟机不会出现内存溢出,采用软引用,虚 ,为了保证虚拟机不会出现内存溢出,采用软引用 虚 拟机在内存不够的时候能够回收较大的对象。 拟机在内存不够的时候能够回收较大的对象。采用智能 引用能够保证一旦较大对象被回收后能够重新创建大对 象保证客户端的正常使用。 象保证客户端的正常使用。
13 1-13
观察者模式---行为模式 观察者模式---行为模式 --观察者模式的组成: 观察者模式的组成: 观察者模式的静态结构中包含这样一些角色: 观察者模式的静态结构中包含这样一些角色: 抽象主题角色subject: 1)抽象主题角色subject: 抽象观察者角色Observer 2)抽象观察者角色Observer 具体主题角色(concreteSubject) 3)具体主题角色(concreteSubject) 具体观察者(ConcreteObserver) (ConcreteObserver)角色 4)具体观察者(ConcreteObserver)角色
15 1-15
观察者模式---行为模式 观察者模式---行为模式 --定义主题类 public class product extends Observable{ private String name; private float price; public String getName(){ return name;} public void setName(String name){ =name; //设置变化点 设置变化点 setChanged(); notifyObservers(name); } public float getPrice(){ return price;} public void setPrice(float price){ this.price=price; //设置变化点 设置变化点 setChanged(); notifyObservers(new Float(price)); } //以下可以是数据库更新 插入命令 以下可以是数据库更新 插入命令. public void saveToDb(){ ..................... }
3 1-3
代理模式
代理模式结构图
4 1-4
代理模式 --- 结构模式
哪些情况下使用代理模式? 哪些情况下使用代理模式? 虚拟代理( ),如果某一个对象 如果某一个对象( 1)虚拟代理(Virtual Proxy ),如果某一个对象(例如图 需要很长时间才能加载完成,可以使用代理在后台加载。 片)需要很长时间才能加载完成,可以使用代理在后台加载。 远程代理(Remote Proxy), 2)远程代理(Remote Proxy),为一个远程机器提供一个本地 对象来实现远程调用的时候,使用远程代理。 对象来实现远程调用的时候,使用远程代理。客户端无法直接调 用代理所指定的对象, 用代理所指定的对象,比如位于不同主机中的类之间是无法直接 调用的,此时就需要建立代理类并通过代理来调用实际的对象; 调用的,此时就需要建立代理类并通过代理来调用实际的对象; 智能引用 引用( 3)智能引用(Smart Reference ),它在访问对象时执行一 些附加操作。 它的典型用途包括: 些附加操作。 它的典型用途包括:
设计模式
1
目标
掌握静态代理和动态代理的目标,实现方式, 掌握静态代理和动态代理的目标,实现方式,实现步骤 掌握观察者模式的目标,实现方式。 掌握观察者模式的目标,实现方式。理解观察者模式体 现的面向对象的设计原则。 现的面向对象的设计原则。
2 1-2
代理代理以控制对这个对象的访问。 代理模式: 为其他对象提供一种代理以控制对这个对象的访问。 为什么要使用代理模式? 为什么要使用代理模式? 隐藏与业务无关的操作或者访问。通过引入间接性, 隐藏与业务无关的操作或者访问。通过引入间接性,可以动态的 附加一些行为实现。这些附加操作一般用于实际对象的状态控制、 附加一些行为实现。这些附加操作一般用于实际对象的状态控制、 访问控制、生命周期管理等。 访问控制、生命周期管理等。
5 1-5
代理模式 – 体现的设计原则
代理模式有效的向客户端屏蔽了附加行为细节, 代理模式有效的向客户端屏蔽了附加行为细节,降低了客户端和 屏蔽了附加行为细节 系统之间的耦合度。 系统之间的耦合度。 代理模式体现的OO设计原则: OO设计原则 代理模式体现的OO设计原则: 里氏替换原则是代理模式的基础; 1)里氏替换原则是代理模式的基础; 2)代理模式体现了里氏替换原则和开闭原则 多用组合, 3)多用组合,少用继承 代理模式所涉及的角色有: 代理模式所涉及的角色有: 1)真实主题 ReadSubject):客户端实际要操作的对象。 真实主题( ):客户端实际要操作的对象 1)真实主题(ReadSubject):客户端实际要操作的对象。 2)代理 Proxy):代理中含有对真实主题(RealSubject) 代理( ):代理中含有对真实主题 2)代理(Proxy):代理中含有对真实主题(RealSubject) 的一个 引用,可以对真实主题进行操作。 引用,可以对真实主题进行操作。 抽象主题(Subject): ):定义了真实主题和代理的共同操作的接 3) 抽象主题(Subject):定义了真实主题和代理的共同操作的接 这样在任何可以操作真实主题的地方也就可以操作代理。。 口,这样在任何可以操作真实主题的地方也就可以操作代理。。
12 1-12
观察者模式---行为模式 观察者模式---行为模式 --又称作”发布 订阅 模式。 订阅” 又称作”发布—订阅”模式。 定义了一种一对多的依赖关系. 定义了一种一对多的依赖关系. 让多个观察者对象同时 监听某一个主题对象, 监听某一个主题对象, 这个主题对象在状态发生变化的 时候,会通知所有的观察者对象, 时候,会通知所有的观察者对象,使他们能够自动更新自 己。 什么时候使用: 什么时候使用: 当一个对象的改变需要同时通知其他对象的时候, 当一个对象的改变需要同时通知其他对象的时候, 而且 它不知道具体有多少对象需要通知的时候, 它不知道具体有多少对象需要通知的时候,需要通知的 对象能够动态地增加 为什么要使用观察者模式? 为什么要使用观察者模式? 交互对象之间的松耦合设计使得观察者和主题之间达到 一个松耦合。 一个松耦合。
6 1-6
代理模式
首先定义一个接口,在接口中定义一些业务方法, 首先定义一个接口,在接口中定义一些业务方法,客户 所需要的真正的对象和代理对象都来实现这个接口 public interface ProxyInterface{ public void function(); }
7 1-7
代理模式
实现ProxyInterface ProxyInterface接 定义客户所需要的真正的对象 ,实现ProxyInterface接 口 public class ProxyClass implements ProxyInterface{ public ProxyClass(){ } public void function(){ System.out.println("in ProxyClass"); } }
9 1-9
代理模式
public class Proxy implements ProxyInterface{ private ProxyClass proxyclass; //代理类持有一个主题对象的引用 代理类持有一个主题对象的引用 public Proxy(ProxyClass proxyClass){ this.proxyclass = proxyClass; } public void before(){ } public void function(){ before(); if(proxyClass==null){ proxyclass=new ProxyClass(); } proxyclass.function(); after(); } public void after(){ } }
对指向实际对象的引用计数,这样当该对象没有引用时, 对指向实际对象的引用计数,这样当该对象没有引用时,可以自 动释放它(例如从缓存中移除) 动释放它(例如从缓存中移除) 当第一次访问实际对象时,将它从持久层或者缓存中装入内存。 当第一次访问实际对象时,将它从持久层或者缓存中装入内存。 在访问一个实际对象前,检查是否已经锁定了它, 在访问一个实际对象前,检查是否已经锁定了它,以确保其他对 象不能改变它。 象不能改变它。 在访问一个实际对象前,检查是否有相应的权限。 在访问一个实际对象前,检查是否有相应的权限。
14 1-14
观察者模式---行为模式 观察者模式---行为模式 --如何使用观察者模式: 如何使用观察者模式: 价格等方面有变化, 如果网上商店中商品在名称 价格等方面有变化,如果系 统能自动通知会员, 为会员发一封电子邮件信息, 统能自动通知会员, 为会员发一封电子邮件信息,将是 网上商店区别传统商店的一大特色. 网上商店区别传统商店的一大特色. 这就需要在商品product中加入Observer这样角色, 这就需要在商品product中加入Observer这样角色,以便 product中加入Observer这样角色 product细节发生变化时,Observer能自动观察到这种变 细节发生变化时,Observer product细节发生变化时,Observer能自动观察到这种变 并能进行及时的update notify动作 update或 动作. 化,并能进行及时的update或notify动作.
8 1-8
代理模式
客户在不能直接得到他所想要的对象 而是需要通过一个中介机构, 而是需要通过一个中介机构,就是代理设计模式中的代 理对象 代理对象与前面真正的对象一样, 代理对象与前面真正的对象一样,实现同一个接口 用户在调用的时候就不会感觉代理的存在 代理模式不让客户端感觉到代理的存在; 代理模式不让客户端感觉到代理的存在; 代理主题起到 的是传递请求的作用; 的是传递请求的作用; 代理使用委派机制将客户端的调 用委派给真正的主题对象