代理模式(Proxy Pattern)

合集下载

代用单的使用流程

代用单的使用流程

代用单的使用流程
1. 简介
代用单(Proxy Pattern)是一种结构型设计模式,用于向其他对象提供一种代理以控制对目标对象的访问。

这种模式可以在不改变目标对象的情况下,通过引入代理对象来控制对目标对象的访问。

2. 使用场景
代用单模式常见的使用场景包括:
•远程代理:在不同的地址空间中代理一个对象。

•虚拟代理:根据需要创建一个代表对象。

•安全代理:用于控制真实对象的访问权限。

•智能指引:在访问对象时,用于添加额外的处理逻辑。

3. 代用单的使用流程
以下是使用代用单模式的一般流程:
步骤1: 定义接口
首先,我们需要定义一个接口,该接口将是代理类和目标对象的共同协议。

这个接口将规定所有可以通过代理访问的方法。

public interface Subject {
void request();
}
步骤2: 实现目标对象
接下来,我们需要实现目标对象,该对象将被代理对象所代理。

```java public class RealSubject implements Subject { @Override public void request() { System.out.println(。

委托代理模式

委托代理模式

委托代理模式委托代理模式(Delegate Proxy Pattern)是一种常见的软件设计模式,它通过将任务的执行委托给其他对象来实现任务的解耦和增强。

在软件开发中,我们经常会遇到一些需要将特定任务委托给其他对象处理的情况。

委托代理模式就是一种解决这类问题的方法。

通过使用委托对象和代理对象,可以将任务的执行从原对象中分离出来,实现更加灵活和可维护的代码结构。

委托代理模式的基本结构由三个角色组成:委托对象、代理对象和实际执行任务的对象。

委托对象(Delegate)是一个拥有某个特定任务的对象,它将这个任务委托给代理对象来完成。

委托对象通常只负责定义任务的接口,而不关心任务的实际执行过程。

代理对象(Proxy)是委托对象和实际执行任务的对象之间的中间层。

代理对象接收到委托对象的任务请求后,会负责将任务传递给实际执行任务的对象,并在任务执行前后进行必要的处理。

代理对象既可以是和委托对象具有相同接口的对象,也可以是一个完全不同的对象。

实际执行任务的对象(RealSubject)是具体执行任务的对象。

它负责实现委托对象定义的任务接口,并在代理对象的调用下执行具体的任务逻辑。

下面以一个简单的示例来说明委托代理模式的应用场景和用法。

假设我们有一个文档编辑器的应用程序,其中包含一个保存文件的功能。

为了将保存文件的过程解耦和增强,我们可以引入委托代理模式。

首先,我们定义一个委托对象 DocumentSaveDelegate,它包含一个名为 Save 的方法,用于保存文件的逻辑。

```csharppublic delegate void DocumentSaveDelegate(string fileName);```接下来,我们创建代理对象 DocumentSaveProxy,它实现了相同的Save 方法,并在方法中添加了额外的日志记录功能。

```csharppublic class DocumentSaveProxy{private DocumentSaveDelegate documentSaveDelegate;public DocumentSaveProxy(DocumentSaveDelegate documentSaveDelegate){this.documentSaveDelegate = documentSaveDelegate;}public void Save(string fileName)Console.WriteLine("开始保存文件:" + fileName);// 添加额外的日志记录逻辑documentSaveDelegate(fileName);Console.WriteLine("文件保存完成:" + fileName);}}```最后,我们定义实际执行任务的对象 DocumentSaver,它实现了Save 方法的具体逻辑。

代理模式

代理模式

Subject
A
C
B
我可以印刷与卖书
我要买书 publishing house 被 代 理
customer;
我可以卖书、打 折以及送优惠券
bookstore
代理模式的种类
代理模式根据其目的和实现方式不同可分为很多种类,其中常用的几种代理模式简 要说明如下: (1) 远程代理(Remote Proxy):为一个位于不同的地址空间的对象提供一个本地的 代理对象,这个不同的地址空间可以是在同一台主机中,也可是在另一台主机中, 远程代理又称为大使(Ambassador)。 (2) 虚拟代理(Virtual Proxy):如果需要创建一个资源消耗较大的对象,先创建一 个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建。 (3) 保护代理(Protect Proxy):控制对一个对象的访问,可以给不同的用户提供不 同级别的使用权限。 (4) 缓冲代理(Cache Proxy):为某一个目标操作的结果提供临时的存储空间,以便 多个客户端可以共享这些结果。 (5) 智能引用代理(Smart Reference Proxy):当一个对象被引用时,提供一些额外 的操作,例如将对象被调用的次数记录下来等。
代理模式的缺点
• 代理模式的主要缺点如下: (1) 由于在客户端和真实主题之间增加了代理对象,因此 有些类型的代理模式可能会造成请求的处理速度变慢, 例如保护代理。 (2) 实现代理模式需要额外的工作,而且有些代理模式的 实现过程较为复杂,例如远程代理。
代理模式的应用场景
• 代理模式的类型较多,不同类型的代理模式有不同的优缺点,它们应用于不同的场合: (1) 当客户端对象需要访问远程主机中的对象时可以使用远程代理。 (2) 当需要用一个消耗资源较少的对象来代表一个消耗资源较多的对象,从而降低系统 开销、缩短运行时间时可以使用虚拟代理,例如一个对象需要很长时间才能完成加载时。 (3) 当需要为某一个被频繁访问的操作结果提供一个临时存储空间,以供多个客户端共 享访问这些结果时可以使用缓冲代理。通过使用缓冲代理,系统无须在客户端每一次访 问时都重新执行操作,只需直接从临时缓冲区获取操作结果即可。 (4) 当需要控制对一个对象的访问,为不同用户提供不同级别的访问权限时可以使用保 护代理。 (5)当需要为一个对象的访问(引用)提供一些额外的操作时可以使用智能引用代理。

安卓常用的6种设计模式总结

安卓常用的6种设计模式总结

安卓常⽤的6种设计模式总结最近看到两篇博客,觉得很不错,记录⼀下由于项⽬变更的频繁性,作为⼀名程序员,我们需要掌握设计模式的必要性,就不⾔⽽喻~~,下⾯就是⼀些我⾃⼰学习的设计模式总结。

接下来,主要是针对⼏个⽐较常⽤模式进⾏讲解,主要是以下⼏种:观察者模式适配器模式代理模式⼯⼚模式单例模式命令模式1.观察者模式(Observer Pattern)释义:观察者模式定义了⼀种⼀对多的依赖关系,让多个观察者对象同时监听某⼀个主题对象,这个主题对象在状态上发⽣变化时,会通知所有观察者对象,使他们能够⾃动更新⾃⼰。

故事理解:观察者想知道公司所有MM的情况,只要加⼊公司的MM情报邮件组就⾏了,tom负责搜集情报,当发现新情报时,不⽤⼀个⼀个通知我们,直接发布给邮件组,我们作为订阅者(观察者)就可以及时收到情报啦。

常见实例:1.BaseAdapter.registerDataSetObserver和BaseAdapter.unregisterDataSetObserver两⽅法来向BaseAdater注册、注销⼀个DataSetObserver ; 2.使⽤ContentObserver去监听数据库变化。

适⽤场景:1.当对⼀个对象的改变需要同时改变其他对象,⽽不知道具体有多少对象有待改变;2.当⼀个对象必须通知其它对象,⽽它⼜不能假定其它对象是谁.观察者模式主要有观察者和被观察者2个对象,在该模式中,Observable表⽰被观察者,这个对象是⼀个抽象类,只能被继承。

Observer表⽰观察者,他是⼀个接⼝,所以观察者可以有多个,实现了该接⼝的类都是属于观察者。

这是⽹上⼀个⽣动细致的demo:被观察者:public class MyPerson extends Observable {private int age;private String name;private String sax;public int getAge() {return age;}public void setAge(int age) {this.age = age;setChanged();notifyObservers();}public String getName() {return name;}public void setName(String name) { = name;setChanged();notifyObservers();}public String getSax() {return sax;}public void setSax(String sax) {this.sax = sax;}@Overridepublic String toString() {return "MyPerson [age=" + age + ", name=" + name + ", sax=" + sax + "]";}}MyPerson是被观察者,类中调⽤了setChange()以及notifyObservers()两个⽅法,前者是告知数据改变,后者是发送信号通知观察者。

SpringAOP的原理和应用场景

SpringAOP的原理和应用场景

SpringAOP的原理和应用场景SpringAOP(Aspect-Oriented Programming)是Spring框架中的一个重要组成部分,它提供了一种通过预定义的方式,将横切关注点(Cross-cutting Concerns)与业务逻辑进行解耦的机制。

本文将介绍SpringAOP的原理及其在实际应用场景中的应用。

一、SpringAOP的原理SpringAOP基于代理模式(Proxy Pattern)实现。

在SpringAOP中,通过生成与原始类(被代理类)具有相同接口的代理类,将横切逻辑编织到业务逻辑中。

在运行时,当调用代理类的方法时,会在方法执行前、后或异常抛出时插入相应的横切逻辑代码。

具体而言,SpringAOP使用了以下几个核心概念:1. 切面(Aspect):切面是横切逻辑的模块化单元,它包含了一组通知(Advice)和切点(Pointcut)。

2. 通知(Advice):通知定义了实际的横切逻辑代码,并规定了何时执行该代码。

SpringAOP提供了五种类型的通知:前置通知(Before)、后置通知(After)、返回通知(After-returning)、异常通知(After-throwing)和环绕通知(Around)。

3. 切点(Pointcut):切点指定了在哪些连接点(Join Point)上执行通知。

连接点可以是方法调用、属性访问等程序执行的点。

4. 连接点(Join Point):连接点是程序执行过程中的一个特定点,如方法调用前、方法调用后等。

通知通过切点来选择连接点。

5. 织入(Weaving):织入是将切面应用到目标对象,并创建代理对象的过程。

织入可以在编译时、类加载时或运行时进行。

二、SpringAOP的应用场景SpringAOP可应用于各种场景,用于解决跨越多个模块或类的横切关注点问题。

以下是一些常见的SpringAOP应用场景:1. 日志记录:通过在关键方法的前后插入日志代码,实现对系统运行状态的监控和记录。

设计模式的定义和分类

设计模式的定义和分类

设计模式的定义和分类1、设计模式的定义和分类设计迷失的出现可以让开发⼈员站在前⼈的肩膀上,通过⼀些成熟的设计⽅案来指导新项⽬的设计和开发没以便于开发出具有更好的灵活性和可拓展性。

也更易于复⽤的软件系统,设计模式是⼀套被反复使⽤的、多数⼈知晓的、经过分类编⽬的、代码设计经验的总结,使⽤设计模式是为了可重⽤代码,让代码更容易被他⼈理解并且提⾼代码的可靠性。

设计模式是⼀种⽤于对系统中不断重现的设计问题的解决⽅案进⾏⽂本化的技术,也是⼀种共享专家设计经验的技术。

GoF对设计模式的定义如下:设计模式是指在特定环境下为解决某⼀通⽤软件设计问题提供的⼀套定制的解决⽅案,该解决⽅案描述了对象和类之间的相互作⽤2、设计模式的基本要素(1)模式名称模式名称通过⼀两个关键词来描述模式的问题、解决⽅案和效果,以便⽤户更好地理解设计模式并便于开发⼈员之间的交流。

绝⼤多数数模式都是跟据其功能或者模式结构来命名的,在学习设计模式时候,⾸先应该准确的记忆该设计模式的中引⽂模式名,在已有的类库中,很多使⽤了设计模式的类名通常包含了使⽤的设计模式的名称,如果⼀个类名称为XXXAdapter,则该类是⼀个适配器类,在设计时使⽤了适配器模式,如果⼀个类名称为XXXFactory,则该类是⼀个⼯⼚类,⼀定包含了⼀个⼯⼚⽅法⽤于返回⼀个类的实例对象。

(2)问题问题描述了应该在什么时候使⽤设计模式,包含了原始设计中存在的问题以及问题存在的原因。

这些问题有些事特定的设计问题,如怎样使⽤对象封装状态或者使⽤对象标识算法等,也可能是系统中存在不灵活的类或对象结构导致系统的可维护性较差,有时候,在模式的问题藐视部分可能会包含使⽤该设计模式时必须满⾜的⼀系列先决条件,如在使⽤桥接模式时系统中的类必须存在两个独⽴变化的维度,在使⽤组合模式的时候系统中必须存在整体和部分的层次结构等。

在对问题进⾏描述的同时实际上确定了模式所对应的使⽤环境以及模式的使⽤动机(3)解决⽅案解决⽅案描述了设计模式的组成成分,以及这些组成成分之间的相互关系,各⾃的职责和协作⽅式,模式时⼀个通⽤的模板,它可以应⽤于各种不同的场合。

一文彻底搞懂代理模式(Proxy)

一文彻底搞懂代理模式(Proxy)

⼀⽂彻底搞懂代理模式(Proxy)⽂章已收录我的仓库:代理模式引⾔代理模式是⾮常常见的模式,在⽣活中的例⼦也⾮常多,例如你不好意思向你关系不太好朋友帮个忙,这时需要找⼀个和它关系好的应⼀个朋友帮忙转达,这个中间朋友就是代理对象。

例如购买⽕车票不⼀定要去⽕车站买,可以通过12306⽹站或者去⽕车票代售点买。

⼜如找⼥朋友、找保姆、找⼯作等都可以通过找中介完成。

代理模式的定义与特点代理模式的定义:由于某些原因需要给某对象提供⼀个代理以控制对该对象的访问。

这时,访问对象不适合或者不能直接引⽤⽬标对象,代理对象作为访问对象和⽬标对象之间的中介。

考虑⽣活中⼀个常见的例⼦,客户想买房,房东有很多房,提供卖房服务,但房东不会带客户看房,于是客户通过中介买房。

你可能⽆法理解这⾥中介是代替客户买房还是代替房东卖房,其实这是很好理解的。

我们程序编写代码是为客户服务的,中介是代替⼀名服务商处理业务,这种服务可能被定义为卖房,也可能被定义为帮助客户买房,但中介唯独不可能去实现买房的功能,在代码中,我们定义的是服务于客户的业务接⼝,⽽不是客户的需求接⼝,如果让客户和中介都去实现买房接⼝,那么这⾥的买房就是⼀种业务,服务于卖房的客户,这样房东就是客户端,买房的⼀⽅就是服务端。

但在⽣活中,买房的⼀⽅往往是客户端,卖房的才是服务端,因此这⾥中介和房东都要实现卖房的接⼝⽅法,换句话说,中介是代替房东卖房⽽不是代替客户买房。

客户将中介抽象看成房东,直接从中介⼿中买房(中介==房东,提供卖房服务)。

这⾥中介就是代理对象,客户是访问对象,房东是⽬标对象,实际由代理完全操控与⽬标对象的访问,访问对象客户仅与代理对象交流。

,代理模式的结构代理模式的结构⽐较简单,主要是通过定义⼀个继承抽象主题的代理来包含真实主题,从⽽实现对真实主题的访问,下⾯来分析其基本结构。

代理模式的主要⾓⾊如下。

1. 抽象主题(Subject)类(业务接⼝类):通过接⼝或抽象类声明真实主题和代理对象实现的业务⽅法,服务端需要实现该⽅法。

代理模式和适配器模式的对比

代理模式和适配器模式的对比

代理模式和适配器模式的对比介绍软件开发一直是一个变化规律极为频繁的行业,随着时间的推移,软件设计模式被广泛应用于软件开发。

设计模式是一种特殊的代码重构技巧,它们被设计用于解决一些在软件开发中经常遇到的问题。

其中代理模式和适配器模式是两种常见的设计模式。

本文将对它们进行对比探讨,旨在深入了解它们之间的异同点。

代理模式代理模式(Proxy Pattern)是软件开发中的一种设计模式,它的目的是通过使用一个代理对象来控制对设计对象的访问。

代理是对象的一个抽象,可以在原对象之前进行前置处理,在原对象之后进行后置处理,并且不影响原对象的逻辑实现。

例如,假设我们需要访问一个网络资源,而这个资源的访问需要耗费大量的时间和数据带宽。

在这种情况下,我们可以使用代理模式,将代理对象作为访问网络资源的入口,代理对象会负责从网络中加载必要的资源。

此外,代理模式还可以用于实现权限和安全控制。

适配器模式适配器模式(Adapter Pattern)是软件开发中的一种设计模式,它的目的是在不改变现有代码的基础上,将不兼容的对象包装到一个可用对象中。

适配器模式主要用于解决两个接口不兼容的问题,可以将不同的接口封装到一个通用的接口中,从而可以实现彼此之间的协作。

例如,在一个应用中,我们可能需要将一些数据从一个数据源中提取出来,并将其转换为另一种格式,以便在另一个应用中使用。

在这种情况下,我们可以使用适配器模式来实现数据的转换和传输。

对比代理模式和适配器模式都是常见的设计模式,它们在实际的软件开发中有不同的应用场景。

首先,代理模式和适配器模式的目的和实现方式不同。

代理模式的目的是在原有的基础上添加额外的控制和安全性,而适配器模式的目的是实现两个不兼容的接口之间的协作。

代理模式通过在原对象之前和之后进行前置和后置处理来实现额外控制的目的。

其次,代理模式和适配器模式的实现方式不同。

适配器模式通过将不兼容的对象包装在一个可用的对象中来实现数据转换和传输的目的。

23种设计模式 详解

23种设计模式 详解

23种设计模式详解设计模式是指面向对象编程中,经过多次验证、被广泛接受的代码实现方法。

这些设计模式可以帮助开发者更快地解决问题,提高代码的可读性、可维护性、可扩展性。

目前,常用的设计模式有23种。

下面,我们来详细介绍一下这23种设计模式。

1. 单例模式(Singleton)单例模式是一种只允许生成一个实例的模式。

在实例化对象时,单例模式的生成过程比较特殊,需要先判断该类是否已经实例化过,如果已经实例化,则直接返回已有的实例对象,否则再进行实例化。

2. 工厂模式(Factory)工厂模式是一种生产对象实例的设计模式。

它将对象实例的生成过程封装在一个工厂类中,客户端需要对象时,只需要调用工厂类中对应的方法即可。

3. 抽象工厂模式(Abstract Factory)抽象工厂模式是一种扩展了工厂模式的模式。

它可以生成一系列相关或相互依赖的对象实例。

具体实现时,通常需要定义一个抽象工厂类和一些具体工厂类,来生产各种相关的对象实例。

4. 建造者模式(Builder)建造者模式是一种用于构建复杂对象的模式。

它将一个复杂对象的构建过程分解成多个简单的步骤,然后通过一个指挥者来管理这些步骤的执行,最终构建出一个复杂的对象。

5. 原型模式(Prototype)原型模式是一种通过复制已有对象来创建新对象的模式。

一般来说,系统中的对象包含大量相同或相似的部分,通过复制对象可以帮助我们节省生成对象的时间和资源。

6. 适配器模式(Adapter)适配器模式是一种将不兼容接口转换为兼容接口的模式。

具体实现时,需要定义一个适配器类,该类实现了客户端所期望的接口,而且还包装了原有不兼容的接口,使其能够兼容客户端期望的接口。

7. 桥接模式(Bridge)桥接模式是一种将抽象部分与其实现部分分离开来的模式。

具体实现时,需要定义抽象部分和实现部分的接口,然后定义一个桥接类,将抽象部分和实现部分联系起来。

8. 组合模式(Composite)组合模式是一种将具有相同属性和方法的对象组合成树形结构的模式。

详解ES6中的代理模式——Proxy

详解ES6中的代理模式——Proxy

详解ES6中的代理模式——Proxy⽬录什么是代理模式什么是Proxy对象Proxy所能代理的范围--handlerProxy的兼容性什么是代理模式代理模式(英语:Proxy Pattern)是程序设计中的⼀种设计模式。

所谓的代理者是指⼀个类别可以作为其它东西的接⼝。

代理者可以作任何东西的接⼝:⽹络连接、内存中的⼤对象、⽂件或其它昂贵或⽆法复制的资源。

著名的代理模式例⼦为引⽤计数(英语:reference counting)指针对象。

当⼀个复杂对象的多份副本须存在时,代理模式可以结合享元模式以减少内存⽤量。

典型作法是创建⼀个复杂对象及多个代理者,每个代理者会引⽤到原本的复杂对象。

⽽作⽤在代理者的运算会转送到原本对象。

⼀旦所有的代理者都不存在时,复杂对象会被移除。

上⾯是维基百科中对代理模式的⼀个整体的定义.⽽在JavaScript中代理模式的具体表现形式就是ES6中的新增对象---什么是Proxy对象在MDN上对于 Proxy 的解释是:Proxy 对象⽤于定义基本操作的⾃定义⾏为(如属性查找,赋值,枚举,函数调⽤等)。

简单来说: Proxy 对象就是可以让你去对JavaScript中的⼀切合法对象的基本操作进⾏⾃定义.然后⽤你⾃定义的操作去覆盖其对象的基本操作.也就是当⼀个对象去执⾏⼀个基本操作时,其执⾏的过程和结果是你⾃定义的,⽽不是对象的.:sweat:好吧,⽤⽂字表达可能太复杂了.我们还是直接上代码吧.⾸先Proxy的语法是:let p = new Proxy(target, handler);其中:1. target 是你要代理的对象.它可以是JavaScript中的任何合法对象.如: (数组, 对象, 函数等等)2. handler 是你要⾃定义操作⽅法的⼀个集合.3. p 是⼀个被代理后的新对象,它拥有 target 的⼀切属性和⽅法.只不过其⾏为和结果是在 handler 中⾃定义的.然后让我们来看这段代码:let obj = {a: 1,b: 2,}const p = new Proxy(obj, {get(target, key, value) {if (key === 'c') {return '我是⾃定义的⼀个结果';} else {return target[key];}},set(target, key, value) {if (value === 4) {target[key] = '我是⾃定义的⼀个结果';} else {target[key] = value;}}})console.log(obj.a) // 1console.log(obj.c) // undefinedconsole.log(p.a) // 1console.log(p.c) // 我是⾃定义的⼀个结果 = '李⽩';console.log(); // 李⽩obj.age = 4;console.log(obj.age); // 4 = '李⽩';console.log(); // 李⽩p.age = 4;console.log(p.age); // 我是⾃定义的⼀个结果从上⾯这段代码中,我可以很清楚的看到 Proxy 对象的作⽤.即是之前所受的⽤于定义基本操作的⾃定义⾏为 .同样的 get 和 set 操作.没有没代理的对象所得的结果是其JavaScript本⾝的执⾏机制运⾏计算后所得到的.⽽被代理了的对象的结果则是我们⾃定义的.Proxy所能代理的范围--handler在上⾯代码中,我们看到了构造⼀个代理对象时所传的第⼆个参数 handler ,这个 handler 对象是由 get 和 set 两个函数⽅法组成的.这两个⽅法会在⼀个对象被 get 和 set 时被调⽤执⾏,以代替原⽣对象上的操作.那么为什么在 handler ,定义 get 和 set 这两个函数名之后就代理对象上的 get 和 set 操作了呢?实际上 handler 本⾝就是ES6所新设计的⼀个对象.它的作⽤就是⽤来⾃定义代理对象的各种可代理操作。

软件架构的设计模式

软件架构的设计模式

软件架构设计模式随着面向对象技术的发展和广泛应用,设计模式不再是一个新兴的名词,它已逐步成为系统架构人员、设计人员、分析人员以及程序开发人员所需掌握的基本技能之一。

设计模式已广泛应用于面向对象的设计和开发,成为面向对象领域的一个重要组成部分。

设计模式通常可分为三类:创建型模式、结构型模式和行为型模式。

1.创建型模式概述创建型模式(CreationalPattern)对类的实例化过程及对象的创建过程进行了抽象,能够使软件模块做到与对象的创建和组织无关。

创建型模式隐藏了对象的创建细节,通过隐藏对象如何被创建和组合在一起达到使整个系统独立的目的。

在掌握创建型模式时,需要回答以下三个问题:创建什么(What)、由谁创建(Who)和何时创建(When)。

创建型模式主要包括简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式、单例模式。

以下介绍其中使用频率较高的几种模式,包括简单工厂模式、工厂方法模式、抽象工厂模式、单例模式。

1.1简单工厂模式简单工厂模式(SimpleFatoryPattern),又称静态工厂方法模式(StaticFactotyMethodPattern),属于类创建型模式。

在简单工厂模式中,定义一个类,可以根据参数的不同返回不同的类的实例,这些类具有公共的父类和一些公共的方法。

简单工厂模式不属于GoF设计模式,它是最简单的工厂模式。

简单工厂模式专门定义一个类来负责创建其他类的实例,这个类称为工厂类,被创建的实例通常都具有共同的父类。

在简单工厂模式中,工厂类包含必要的判断逻辑,决定在什么时候创建哪一个产品类实例,客户端可以免除直接创建产品对象的责任,而仅仅“消费”产品,简单工厂模式通过这种方式实现了对责任的划分。

但是由于工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响;同时系统扩展较为困难,一旦添加新产品就不得不修改工厂逻辑,违反了开闭原则,并造成工厂逻辑过于复杂。

agent概念

agent概念

agent概念"Agent"(代理)这个概念在计算机科学和信息技术领域中有多种含义,具体涵盖的范围可能取决于上下文。

以下是一些常见的含义:1. 代理服务器(Proxy):代理服务器是一种服务器,它充当客户端和目标服务器之间的中间人。

它接收来自客户端的请求,然后将请求转发给目标服务器,最后将目标服务器的响应返回给客户端。

代理服务器可以用于访问控制、日志记录、内容过滤等。

2. 网络代理(Network Agent):在网络安全领域,代理可以指代一种用于监控、过滤或修改网络流量的软件或硬件。

网络代理通常用于实施安全策略,例如防火墙或入侵检测系统。

3. 代理模式(Agent Pattern):代理模式是一种设计模式,其中有一个代理对象作为其他对象的接口。

代理对象可以充当另一个对象的代表,以控制对该对象的访问。

这种模式可以用于实现懒加载、远程代理、保护代理等。

4. 智能代理(Intelligent Agent):智能代理是一种能够在用户或其他系统的指导下执行任务的程序。

这些代理可以具有一定的智能,能够学习和适应环境。

5. 移动代理(Mobile Agent):移动代理是一种程序,它具有在分布式系统中移动并执行任务的能力。

移动代理通常用于优化网络通信和分布式计算。

6. 操作系统代理(Operating System Agent):在分布式系统中,操作系统代理是一种能够管理和协调系统资源的软件实体。

这种代理可能负责任务分配、负载均衡、容错等。

这些是代理概念的一些常见用法。

具体情况下,"Agent" 的含义可能因上下文而异,因此在具体讨论中需要注意特定领域或系统中的定义。

23种设计模式记忆技巧

23种设计模式记忆技巧

23种设计模式记忆技巧设计模式是一种解决设计问题的方案,在软件开发过程中起到了重要的作用。

然而,记忆设计模式的名称、特征和用法有时可能会让人感到困难。

为了帮助大家记住常用的23种设计模式,我将分享一些记忆技巧。

1. 单例模式(Singleton Pattern):想象一个宇宙中只存在一个唯一的太阳。

2. 简单工厂模式(Simple Factory Pattern):把工厂当做一个有丰富经验的魔术师,可以根据参数创建魔术道具。

3. 工厂方法模式(Factory Method Pattern):把工厂当做一个可以生产各种不同产品的工厂。

4. 抽象工厂模式(Abstract Factory Pattern):想象一个超级工厂,可以生产各种不同类型的产品。

5. 建造者模式(Builder Pattern):抽象出建造过程,让一个团队可以用不同的组件构建出不同的产品。

6. 原型模式(Prototype Pattern):把对象看作是一个可复制的模板。

7. 适配器模式(Adapter Pattern):把一个接口转换成另一个接口,就像使用插头转换器。

8. 桥接模式(Bridge Pattern):想象一个人过河,桥是连接两岸的桥梁。

9. 装饰器模式(Decorator Pattern):想象一个圣诞树,可以在上面加入各种装饰品。

11. 外观模式(Facade Pattern):把一系列复杂的操作封装成一个简单的接口。

12. 享元模式(Flyweight Pattern):把对象分为内部状态和外部状态,尽量共享内部状态。

13. 代理模式(Proxy Pattern):想象一个忙碌的明星,通过经纪人代理各种事务。

14. 策略模式(Strategy Pattern):将不同的策略封装成不同的对象,可以根据需求动态选择策略。

15. 模板方法模式(Template Method Pattern):定义一个算法的骨架,具体步骤由子类实现。

技术研发主管岗位招聘笔试题及解答(某世界500强集团)

技术研发主管岗位招聘笔试题及解答(某世界500强集团)

招聘技术研发主管岗位笔试题及解答(某世界500强集团)一、单项选择题(本大题有10小题,每小题2分,共20分)1、在软件开发过程中,哪个阶段通常用于确定软件系统的需求、功能和性能要求?A. 需求分析B. 设计C. 编码D. 测试答案:A解析:需求分析是软件开发过程中的一个关键阶段,它的主要目的是收集和分析客户或用户的需求,确定软件系统的功能、性能、可靠性、易用性、可维护性等方面的要求,并为后续的设计、编码和测试工作奠定基础。

2、在面向对象编程(OOP)中,封装的主要目的是什么?A. 提高代码的可读性B. 提高代码的可重用性C. 隐藏对象的内部实现细节D. 增强代码的执行效率答案:C解析:封装是面向对象编程(OOP)的三大基本特性之一(另外两个是继承和多态)。

封装的主要目的是将对象的内部实现细节隐藏起来,只对外提供有限的访问接口(即公有方法或属性),从而保护对象的数据不被随意访问和修改,同时保证对象的行为能够被精确控制。

这样做不仅可以提高代码的安全性,还可以降低代码之间的耦合度,使得代码更加模块化,易于维护和扩展。

3、在软件开发过程中,敏捷方法论强调以下哪一项原则最为重要?A. 详细规划所有需求后再开始编码B. 个体和交互高于流程和工具C. 遵循严格的变更管理流程D. 使用详细的文档来指导开发过程答案:B解析:敏捷方法论的核心价值之一就是重视个体与交互而非流程与工具。

这意味着团队之间的有效沟通比遵循固定的流程更为重要。

此外,敏捷方法也强调响应变化胜过遵循计划,并通过持续的反馈循环来改进产品。

4、下列哪一种设计模式是用来创建对象的?A. 观察者模式B. 单例模式C. 装饰器模式D. 策略模式答案:B解析:在面向对象设计模式中,单例模式确保一个类只有一个实例,并提供一个全局访问点。

这使得它成为创建对象的一种典型模式。

观察者模式用于定义对象间的一对多依赖关系;装饰器模式允许动态地给对象添加新的功能;策略模式则定义了一系列可互换的算法,这些算法封装起来使它们可以互相替换。

pattern 翻译

pattern 翻译

一.pattern 翻译
翻译:pattern,英语单词,名词、及物动词、不及物动词,作名词时意为“模式;图案;样品”,作及物动词时意为“模仿;以图案装饰”,作不及物动词时意为“形成图案”。

短语:
Strategy Pattern 策略模式; 计谋模式; 计谋形式; 形势形式
Proxy Pattern 代理模式; 代办形式; 代办模式; 代办别人代理标准样式
Flyweight pattern 享元模式; 轻量级模式; 轻量模式; 享元形式
Visitor Pattern 访问者模式 ; 接见者模式; 访问者
Iterator Pattern 迭代器模式 ; 迭代模式; 迭代器 ; 第十二章
Tone pattern 平仄; 色调图型; 声调格局
Pattern Matching [计] 模式匹配; 样式比对; 模板匹配; 图像匹配
conductive pattern [电子] 导电图形; 导电图; 非导电图形
expenditure pattern 开支模式; 消费模式; 费用构成
例句:
Do you like the pattern?
你喜欢这个图案吗?
I like it because of its color and pattern.
我喜欢它是因为它的颜色和图案。

But once you know the pattern then it explains what these relationships are about. 但你一旦理解了模式,他就会解释这些关系是关于什么的。

设计模式之代理模式(Proxy)详解及代码示例

设计模式之代理模式(Proxy)详解及代码示例

设计模式之代理模式(Proxy)详解及代码⽰例⼀、代理模式的定义 代理模式的定义:由于某些原因需要给某对象提供⼀个代理以控制对该对象的访问。

这时,访问对象不适合或者不能直接引⽤⽬标对象,代理对象作为访问对象和⽬标对象之间的中介,代理模式也叫做委托模式。

⼆、为什么使⽤代理模式中介隔离作⽤:在某些情况下,⼀个客户类不想或者不能直接引⽤⼀个委托对象,⽽代理类对象可以在客户类和委托对象之间起到中介的作⽤,其特征是代理类和委托类实现相同的接⼝。

开闭原则,增加功能:代理类除了是客户类和委托类的中介之外,我们还可以通过给代理类增加额外的功能来扩展委托类的功能,这样做我们只需要修改代理类⽽不需要再修改委托类,符合代码设计的开闭原则。

代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后对返回结果的处理等。

代理类本⾝并不真正实现服务,⽽是同过调⽤委托类的相关⽅法,来提供特定的服务。

真正的业务功能还是由委托类来实现,但是可以在业务功能执⾏的前后加⼊⼀些公共的服务。

例如我们想给项⽬加⼊缓存、⽇志这些功能,我们就可以使⽤代理类来完成,⽽没必要打开已经封装好的委托类。

三、代理模式优缺点 代理模式的主要优点有:代理模式在客户端与⽬标对象之间起到⼀个中介作⽤和保护⽬标对象的作⽤;代理对象可以扩展⽬标对象的功能;代理模式能将客户端与⽬标对象分离,在⼀定程度上降低了系统的耦合度; 代理模式的主要缺点是:在客户端和⽬标对象之间增加⼀个代理对象,会造成请求处理速度变慢;增加了系统的复杂度;四、代理模式的结构与实现 代理的实现是有多种⽅式的,常见就是静态代理、动态代理(JDK动态代理、CGLIB动态代理),因此接下来⼀⼀讲解这三种实现⽅式。

1、静态代理 静态代理模式的结构⽐较简单,主要是通过定义⼀个继承抽象主题的代理来包含真实主题,从⽽实现对真实主题的访问。

代理模式的主要⾓⾊如下:抽象主题(Subject)类:通过接⼝或抽象类声明真实主题和代理对象实现的业务⽅法。

软件开发的23种设计模式

软件开发的23种设计模式

软件开发的23种设计模式 ⼆⼗三种设计模式1.单例模式(Singleton Pattern)定义:Ensure a class has only one instance, and provide a global point of access to it.(确保某⼀个类只有⼀个实例,⽽且⾃⾏实例化并向整个系统提供这个实例。

)通⽤代码:(是线程安全的)public class Singleton {private static final Singleton singleton = new Singleton();//限制产⽣多个对象private Singleton(){}//通过该⽅法获得实例对象public static Singleton getSingleton(){return singleton;}//类中其他⽅法,尽量是staticpublic static void doSomething(){}}使⽤场景:●要求⽣成唯⼀序列号的环境;●在整个项⽬中需要⼀个共享访问点或共享数据,例如⼀个Web页⾯上的计数器,可以不⽤把每次刷新都记录到数据库中,使⽤单例模式保持计数器的值,并确保是线程安全的;●创建⼀个对象需要消耗的资源过多,如要访问IO和数据库等资源;●需要定义⼤量的静态常量和静态⽅法(如⼯具类)的环境,可以采⽤单例模式(当然,也可以直接声明为static的⽅式)。

线程不安全实例:public class Singleton {private static Singleton singleton = null;//限制产⽣多个对象private Singleton(){}//通过该⽅法获得实例对象public static Singleton getSingleton(){if(singleton == null){singleton = new Singleton();}return singleton;}}解决办法:在getSingleton⽅法前加synchronized关键字,也可以在getSingleton⽅法内增加synchronized来实现。

适配器模式和代理模式的区别

适配器模式和代理模式的区别

适配器模式和代理模式的区别代理模式组成:抽象角色:通过接口或抽象类声明真实角色实现的业务方法。

代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。

真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。

即Proxy Pattern,23种常用的面向对象软件的设计模式之一。

(设计模式的说法源自《设计模式》一书,原名《Design Patterns:Elements of Reusable Object-Oriented Software》。

1995年出版,出版社:Addison Wesly Longman.Inc。

该书提出了23种基本设计模式,第一次将设计模式提升到理论高度,并将之规范化。

)代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。

在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

(1)职责清晰真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。

(2)代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了中介的作用和保护了目标对象的作用。

(3)高扩展性适配器模式在计算机编程中,适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的。

一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。

共有两类适配器模式:对象适配器模式-- 在这种适配器模式中,适配器容纳一个它包裹的类的实例。

在这种情况下,适配器调用被包裹对象的物理实体。

类适配器模式-- 这种适配器模式下,适配器继承自已实现的类(一般多重继承)。

使用的前提:1.接口中规定了所有要实现的方法2.但一个要实现此接口的具体类,只用到了其中的几个方法,而其它的方法都是没有用的。

9代理模式

9代理模式
第九讲
代理(Proxy)模式
场景

跟MM在网上聊天,一开头总是"hi,你好 ","你从哪儿来呀?""你多大了?""身高多 少呀?"这些话,真烦人,写个程序做为 我的Proxy吧,凡是接收到这些话都设置 好了自动的回答,接收到其他的话时再 通知我回答,怎么样,酷吧。
代理模式概述


代理模式给某一个对象提供一个代理对象,并由代理 对象控制对源对象的引用。 代理就是一个人或一个机构代表另一个人或者一个机 构采取行动。某些情况下,客户不想或者不能够直接 引用一个对象,代理对象可以在客户和目标对象直接 起到中介的作用。客户端分辨不出代理主题对象与真 实主题对象。 代理模式可以并不知道真正的被代理对象,而仅仅持 有一个被代理对象的接口,这时候代理对象不能够创 建被代理对象,被代理对象必须有系统的其他角色代 为创建并传入。
代理模式的角色

抽象主题(Subject) 实际主题(RealSubject) 代理(Proxy)
代理模式的UML类图
代理模式示例
1.抽象主题(Subject): Geometry.java public interface Geometry{ public double getArea(); }
虚代理例子

在文档中嵌入图形对象的文档编辑器,有些图形对象的创建开销 很大。但是打开文档必须很迅速,因此我们在打开文档时避免一 次性创建所有开销很大的对象。意味着应该根据需要进行创建, 我们使用一个图像代理,替代那个真的图像,能够实现这个需求 。
保护代理例子

访问论坛系统的用户有多种类型:注册普通用户 论坛管 理者 系统管理者 游客,注册普通用户才能发言;论坛管 理者可以管理他被授权的论坛;系统管理者可以管理所 有事务等,这些权限划分和管理是使用Proxy完成的.

Adapter模式与包装器模式的区别

Adapter模式与包装器模式的区别

Adapter模式与包装器模式的区别在软件开发中,适配器模式和包装器模式是两种常用的设计模式。

虽然它们的作用和功能有些相似,但是它们之间还是有一些区别的。

本文就来详细介绍一下这两种设计模式的区别。

一、适配器模式适配器模式(Adapter Pattern)是指将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。

适配器模式分为类适配器和对象适配器两种方式。

1. 类适配器类适配器用于将一个类的接口转换成客户希望的接口,通过继承源类和实现目标类的接口实现。

类适配器一般采用多重继承的方式,同时继承源类和目标类。

这种方式的优点是能够重定义源类的行为,同时也能够适配目标类。

但是这种方式也存在一些缺点,比如如果需要适配的目标接口过于复杂,就需要定义很多的适配器类。

2. 对象适配器对象适配器用于将一个对象的接口转换成客户希望的另一个接口。

对象适配器不是通过继承的方式实现,而是通过在适配器类中包含一个源类的对象实例,使得可以调用源类对象的方法来实现目标接口。

这种方式的优点是可以避免由于过多的继承关系导致代码的复杂性和可读性变差。

但是这种方式也存在一些缺点,比如适配器类和源类必须是同一类型的接口,这样才能实现适配。

二、包装器模式包装器模式(Wrapper Pattern)是指将一个已有的类包装起来,以满足某些特定的需求。

包装器模式分为两种方式:装饰器模式和代理模式。

1. 装饰器模式装饰器模式(Decorator Pattern)是指在不改变原有对象的基础上,使用包装器进行包装,以扩展其功能。

装饰器模式的核心思想是可以为一个对象添加新的功能,同时还不必改变原有的代码。

装饰器模式一般通过继承来实现,在装饰器类中包含了一个被装饰的对象,通过调用被装饰对象的方法,可以在其基础上添加新的功能,从而扩展其原有的功能。

2. 代理模式代理模式(Proxy Pattern)是指通过一个代理对象来控制对实际对象的访问。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

描述:让我们思考一下下面的代码://Client1.class Customer{2.public void someMethod(){3.//Create the Service Provider Instance4. FileUtil futilObj=new FileUtil();5.//Access the Service6.futilObj.writeToFile(“Some Data”);7. }8.}作为它实现的一部分,Customer类创建了一个FileUtil类的一个实例并且直接访问它的服务。

换句话说,对于客户对象,访问FileUtil对象的方式是很直接的。

它的实现可能是客户对象访问服务提供者对象最为普通的方式了。

相比较,有些时候客户对象可能不直接访问服务提供者(也就是指目标对象),这种情况是由于下面的原因导致的:(1)目标对象的位置??目标对象可能存在于同一台或者不同机器的不同地址空间。

(2)目标对象的存在形式??目标对象可能直到他被请求服务的时候还不存在,或者对象被压缩。

(3)特殊的行为??目标对象可以根据客户对象的访问权限接受或拒绝服务。

在多线程环境,一些服务提供者对象需要特殊的考虑。

在这些情况下,代理模式(Proxy Pattern)建议不要使有特殊需求的客户对象直接访问目标对象,而是使用一个单独的(分离的)对象(也就是指代理对象)为不同的客户提供通常的、直接的访问目标对象的方式。

代理对象提供和目标对象一样的接口。

代理对象负责与目标对象交互的细节,代表客户对象与目标对象交互。

所以客户对象不再需要处理访问目标对象的服务时的特殊需求。

客户对象通过它的接口调用代理对象,代理对象直接把这些调用依次地传递给目标对象。

客户对象不需要知道代理的原对象(目标对象)。

代理对象隐藏了与客户对象进行交互的对象细节,如:对象是否是远程的、是否初始化、是否需要特殊的权限等。

换句话说,代理对象作为客户和不可访问的远程对象或推迟初始化对象之间的透明桥梁。

代理对象因使用的场景不同,代理的种类也不同。

让我们来快速的浏览一下一些代理和它们的目标。

注意:表23.1列出了不同种类的代理对象,在一章中,仅讨论远程代理,其他的一些代理会在本书后面的模式中讨论。

Table 23.1: List of Different Proxy Types代理类型目的远程代理提供对在不同地址空间的远程对象的访问缓存代理/服务代理为了提供能够保存目标操作经常用到的结果,代理对象以存储方式保存这些结果。

当客户对象请求同一个操作时,代理不需要直接访问目标对象,而是从存贮介质返回操作结果。

防火墙代理使用防火墙代理主要是为了保护目标对象以防止有害客户的访问。

同时也可以防止客户访问有害的目标对象。

保护代理提供了不同客户访问不同层次的目标对象的功能。

在创建代理时,定义了一个权限的集合。

虽后,这些权限用来限制访问代理的特定部分,如果没有执行方法的权限,客户对象不允许访问特定的方法。

同步代理提供了允许不同的客户对象安全的同步访问目标对象的功能。

计数代理在执行目标对象的方法前,提供了一些审计机制。

代理模式和其他模式从讨论不同的代理对象中可以看出:代理对象有两个主要的特征:(1)它介于客户对象和目标对象之间。

(2)它接受客户对象的调用,然后转发调用给目标对象。

在这种情形下,看上去和本书中前面讨论的其他模式有些相似。

让我们讨论一下代理模式和一些与它相似的模式之间的相同点和不同点。

代理模式和装饰模式:代理模式:(1)客户对象不能直接访问目标对象(2)代理对象提供了对目标对象的访问控制(在保护代理中)(3)代理对象不能再增加其他的功能。

装饰模式:(1)如果需要,客户对象不能直接访问目标对象。

(2)装饰对象不能控制对目标对象的访问。

(3)装饰对象可以增加额外的功能。

代理模式和外观模式:代理模式:(1)代理对象代表一个单一对象。

(2)客户对象不能直接访问目标对象。

(3)代理对象提供了对于单一目标对象的访问控制。

外观模式:(1)外观对象代表了对象的一个子系统。

(2)如果必要,客户对象可以直接访问子系统中的对象。

(3)一个外观对象提供了一个对子系统组件的简单的、高层次的接口.代理模式和责任链模式:代理模式:(1)代理对象代表了一个单一的对象。

(2)克辉请求首先被代理对象所接受,但是不直接被代理对象处理。

(3)客户请求总是被传递给目标对象。

(4)假设客户与服务器正常工作,可以保证请求会得到响应,责任链模式:(1)责任链包括很多对象。

(2)接受客户请求的对象首先处理请求。

(3)近当现在的接收者不能处理请求时,客户请求才被传递给下一个对象。

(4)不能保证请求会得到响应。

也就是请求已经到达责任链尾,担仍然没有被处理。

在Java中,远程方法调用(RMI)充分的利用了远程代理模式,让我们快速的浏览一下远程方法调用(RMI)的概念和远程方法调用(RMI)通信过程应用的组件。

RMI:快速浏览RMI使客户对象像访问本地对象一样访问远程对象并调用其方法成为可能。

(如图23.1)Figure 23.1: Client’s View of Its Communication with a Remote Object Using RMI下面是为实现RMI功能而一起协作的不同组件。

(1)远程接口(Remote Interface)??一个远程对象必须实现一个远程接口(这个接口扩展java.rmi.Remote)。

远程接口声明可以被客户访问的远程对象的方法。

换句话说,远程接口可以看成远程对象对客户的视图。

需求(要求):1) 扩展java.rmi.Remote2) 在远程接口中定义的所有方法必须声明抛出java.rmi.RemoteException 异常。

(2)远程对象(Remote Object)??远程对象负责实现在远程接口中定义的方法。

需求(要求):1)必须提供远程接口的实现。

2)必须扩展java.rmi.server.UnicastRemoteObject类。

3)必须有一个没有参数的构造函数。

4)必须与一个服务器相关联。

通过调用零参数的构造函数,服务器创建远程对象的一个实例。

(3) RMI注册表(RMI Registry)??RMI注册表提供了保持不同远程对象的地址空间。

1)远程对象需要存储在一个客户可以通过命名引用(Name reference)来访问它的RMI注册表中。

2)一个给定的命名引用仅可以存储一个对象。

(4)客户(Client)??客户是一个试图访问远程对象的应用程序。

1)必须可以感知被远程对象实现的接口。

2)通过命名引用(Name reference)在RMI注册表中可以查到远程对象。

一旦查到远程对象的引用,调用这个引用上的方法。

(5)RMIC (Java RMI 桩编译器)Java RMI stub compiler??一旦远程对象编译成功,RMIC(Java RMI 桩编译器)可以生成远程对象的桩类文件(stub)和框架类文件(skeleton)。

桩类文件(stub)和框架类文件(skeleton)从编译的远程对象类中产生。

这些桩类文件(stub)和框架类文件(skeleton) 使客户对象以无缝的方式访问远程对象成为可能。

下面这部分描述客户对象和远程对象如何通信。

RMI通信机制:一般地,客户对象不能按通常方式直接访问远程对象。

为了使客户对象像访问本地对象一样访问远程对象的服务,RMIC(Java RMI 桩编译器)生成的远程对象的桩文件(stub)和远程接口需要拷贝到客户机器上。

桩文件(stub)负责扮演着远程对象的(远程)代理的角色,负责把方法的调用传递给真实的远程对象实现所在的远程服务器上。

任何时候,客户对象引用远程对象,这个引用实际上是远程对象的本地桩文件。

也就是,当客户调用远程对象上的方法时,调用首先被本地桩实例所接受,桩再将这个调用传递到远程服务器上。

在服务器端,RMIC产生的远程对象的框架文件(skeleton)接受这个调用。

框架文件(skeleton)在服务器端,不需要拷贝到客户机器上。

框架文件(skeleton)负责将这些调用转发到真正的远程对象的实现上。

一旦远程对象执行了方法,方法返回的结果将按照反方向返回给客户。

图23.2说明了RMI通信的过程Figure 23.2: The Actual RMI Communication Process了解更多的关于Java RMI的知识,推荐阅读RMI tutorialRMI和远程代理模式:从RMI通信的讨论中,可以看到桩类文件扮演着远程对象的远程代理的角色。

它使得客户访问远程对象就像访问本地对象一样成为可能。

因此,一些使用了RMI技术的应用就已经暗含着代理模式的实现。

例子:在讨论外观模式时,我们建立了一个简单的客户数据管理应用来验证和保存输入的客户数据。

我们的设计由分别代表不同客户数据的三个类组成。

在应用外观模式以前,客户AccountManager可以直接与子系统的三个用来验证、保存客户数据的类交互。

应用外观模式,我们定义了一个CustomFacade外观对象代表客户与三个子系统类交互(如图23.3)。

Figure 23.3: Customer Data Management Application for the Local Mode of Operation?Class Association在这个应用中,子系统组件和外观对象对于客户对象AccountManager都是本地的。

现在,让我们建立这个应用的不同版本,这个版本已远程的方式运行。

在远程方式下,这个应用通过运用JAVA RMI技术,访问远程对象。

在使应用运行在远程操作模式下的设计中,我们要把子系统组件(Account、Address和CreditCard)和外观(CustomerFacade)移到远程服务器上。

这样会带来以下好处:1)在服务器上的对象可以被不同的客户应用所共享。

客户不再需要维护这些类的本地版本,因此,成为轻型客户端(light-weighted)。

2)可以对变化、性能和监控进行统一的集中控制。

Figure 23.4: Customer Data Management Application for the Remote Mode of Operation?Class Association让我们开始运用RMI技术设计远程操作模式下的客户数据管理应用。

第一步,先定义远程接口CustomerIntr:这个借口要满足:1)声明外观实现的方法。

2)所有的方法声明抛出RemoteException异常。

3)扩展java.rmi.Remote接口。

1.public interface CustomerIntr extends java.rmi.Remote {2.void setAddress(String inAddress) throws RemoteException;3.void setCity(String inCity) throws RemoteException;4.void setState(String inState) throws RemoteException;5.void setFName(String inFName) throws RemoteException;6.void setLName(String inLName) throws RemoteException;7.void setCardType(String inCardType) throws RemoteException;8.void setCardNumber(String inCardNumber)9.throws RemoteException;10. void setCardExpDate(String inCardExpDate)11. throws RemoteException;12. boolean saveCustomerData() throws RemoteException;13.}让我们重新定义CustomerFacade外观类,因为它要实现CustomerIntr远程接口。

相关文档
最新文档