代理模式与模板模式.pptx
《代理模式与模板模式.pptx》由会员分享,可在线阅读,更多相关《代理模式与模板模式.pptx(25页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、依赖(依赖(Dependency):虚线箭头表示:虚线箭头表示:元素A的变化会影响元素B,但反之不成立,那么B和A的关系是依赖关系,B依赖A;类属关系和实现关系在语义上讲也是依赖关系,但由于其有更特殊的用途,所以被单独描述。uml中用带箭头的虚线表示Dependency关系,箭头指向被依赖元素。关联(关联(Association):实线箭头表示:):实线箭头表示:元素间的结构化关系,是一种弱关系,被关联的元素间通常可以被独立的考虑。uml中用实线表示Association关系,箭头指向被依赖元素。其中带箭头是单向关联,无箭头即一个实线是双向关联。UML类图说明聚合(聚合(Aggregation
2、):带空心菱形头表示:):带空心菱形头表示:关联关系的一种特例,表示部分和整体(整体 has a 部分)的关系。uml中用带空心菱形头的实线表示Aggregation关系,菱形头指向整体。合成合成/组合(组合(Composition):带实心菱形头的实线表示:):带实心菱形头的实线表示:组合是聚合关系的变种,表示元素间更强的组合关系。如果是组合关系,如果整体被破坏则个体一定会被破坏,而聚合的个体则可能是被多个整体所共享的,不一定会随着某个整体的破坏而被破坏。uml中用带实心菱形头的实线表示Composition关系,菱形头指向整体。泛化(泛化(Generalization):通常所说的继承(特
3、殊个体 is kind of 一般个体)关系,不必多解释了。uml中用带空心箭头的实线线表示Generalization关系,箭头指向一般个体。实现(实现(Realize):元素A定义一个约定,元素B实现这个约定,则B和A的关系是Realize,B realize A。这个关系最常用于接口。uml中用空心箭头和虚线表示Realize关系,箭头指向定义约定的元素。代理模式的定义定义 代理模式(Proxy Pattern),为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不 想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。代理模式一般涉及到的角
4、色有:抽象角色:声明真实对象和代理对象的共同接口;代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。并且,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。代理模式的基本UML类图Subject obj=new Proxy()代理模式的基本时序图 动机1.为了在我们确实需要这个对象时才对它进行创建和初始化。2.用户希望程序和某个对象打交道,程序不希望用户直接访问该对象为什么要使用为什么要使用Proxy模式?模式?/抽象角色
5、:abstractpublicclassSubjectabstractpublicvoidrequest();/真实角色:实现了Subject的request()方法。publicclassRealSubjectextendsSubjectpublicRealSubject()publicvoidrequest()System.out.println(Fromrealsubject.);代理实例代理实例/代理角色:publicclassProxySubjectextendsSubjectprivateRealSubjectrealSubject;/以真实角色作为代理角色属性 publicPro
6、xySubject()publicvoidrequest()/该方法封装了真实对象的request方法 preRequest();if(realSubject=null)realSubject=newRealSubject();realSubject.request();/此处执行真实对象的request方法 postRequest();privatevoidpreRequest()/somethingyouwanttodobeforerequestingprivatevoidpostRequest()/somethingyouwanttodoafterrequesting/客户端调用:Sub
7、jectsub=newProxySubject();Sub.request();由以上代码可以看出,客户实际需要调用的是RealSubject类的request()方法,现在用ProxySubject来代理RealSubject类,同样达到目的,同时还封装了其他方法(preRequest(),postRequest(),可以处理一些其他问题。另外,如果要按照上述的方法使用代理模式,那么真实角色必须是事先已经存在的,并将其作为代理对象的内部属性。但是实际使用时,一个真实角色必须对应一个代理角色,如果大量使用会导致类的急剧膨胀;此外,如果事先并不知道真实角色,该如何使用代理呢?这个问题可以通过Ja
8、va的动态代理类来解决。动态代理所谓DynamicProxy是这样一种class:它是在运行时生成的class,在生成它时你必须提供一组interface给它,然后该class就宣称它实现了这些interface。你当然可以把该class的实例当作这些interface中的任何一个来用。当然啦,这个DynamicProxy其实就是一个Proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作。Java动态代理类位于包下,一般主要涉及到以下两个类:(1).InterfaceInvocationHandler:该接口中仅定义了一个方法Object:inv
9、oke(Objectobj,Methodmethod,Objectargs)。在实际使用时,第一个参数obj一般是指代理类,method是被代理的方法,如上例中的request(),args为该方法的参数数组。这个抽象方法在代理类中动态实现。(2).Proxy:该类即为动态代理类,作用类似于上例中的ProxySubject,其中主要包含以下内容:a)ProtectedProxy(InvocationHandlerh):构造函数,参数为InvocationHandler实现类的实例。b)StaticClassgetProxyClass(ClassLoaderloader,Classinterfa
10、ces):获得一个代理类,其中loader是类装载器,interfaces是真实类所拥有的全部接口的数组。c)StaticObjectnewProxyInstance(ClassLoaderloader,Classinterfaces,InvocationHandlerh):返回代理类的一个实例,返回后的代理类可以当作被代理类使用(可使用被代理类的在Subject接口中声明过的方法)。在使用动态代理类时,我们必须实现InvocationHandler接口,以第一个示例为例:/抽象角色(之前是抽象类,此处应改为接口):publicinterfaceSubjectpublicvoidrequest
11、();/具体角色RealSubject:实现了Subject接口的request()方法。publicclassRealSubjectimplementsSubjectpublicRealSubject()publicvoidrequest()System.out.println(Fromrealsubject.);/代理角色:importjava.lang.reflect.Method;importjava.lang.reflect.InvocationHandler;publicclassDynamicSubjectimplementsInvocationHandlerprivateObj
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 代理 模式 模板
限制150内