深入浅出设计模式之代理模式.pptVIP

  • 7
  • 0
  • 约8.47千字
  • 约 66页
  • 2017-06-08 发布于湖北
  • 举报
深入浅出设计模式之代理模式

代理模式 代理 企业老总门口总有一个办公室的秘书 很多企业门口有保安 老总和蔼可亲 秘书凶巴巴的 糖果机例子 上次课的糖果机例子,现在有了一个新需求,CEO需要知道分布在各地的糖果机的状况:糖果机剩余的糖果多少?(是否需要补充)糖果机目前的状况 如银行需要了解每一个ATM机的状况:现金多少?存入多少?取出多少,目前能否工作 大型连锁超市的老总也需要了解每一个分店的经营状况。 为糖果机增加一个位置属性 public class GumballMachine{ String location; public GumballMachine(String location, int count){ this.location = location; } public String getLocation(){ return location; } } 糖果机监视器 为了将糖果机的状况向CEO汇报,我们设立了糖果机监视器。可以形成一个报表 public class GumballMonitor{ GumballMachine machine; public GumballMonitor(GumballMachine machine){ this.machine = machine; } public void report(){ System.out.println(“Gumball Machine:”+machine.getlocation(); 上述的糖果机监视器可以将糖果机的情况汇报上来。 但是我们知道,一个企业的自动糖果机绝不会是一台,且不会在一处,而是分散在各地。 上述的监视器无法实现远程监控。 远程代理 远程代理:代理远程的对象的本地代表。 远程对象:不同机器上的对象。 本地代表:由本地方法调用的对象,结果发送到远程对象。 糖果机例子 了解RMI 将GumballMachine变成远程服务,提供远程调用的方法 创建一个能和远程的GumballMachine沟通的代理,这要用到RMI,结合监视系统。 远程方法 当今的世界是网络的世界,基于网络的软件系统非常流行。 基于网络的软件,有时一个对象需要和远程的对象进行交互。 ATM存取款 刷卡消费 客户调用本地对象和客户调用远程对象有何区别和联系 从被调用对象的角度看 被本地客户调用和被远程客户调用一样吗? 本地客户可以直接调用,对象将结果直接返回即可 远程客户调用,对象需要通过网络将结果返回 前面我们说过:我们不能让客户麻烦,还需考虑所调用的对象是在本地还是在远程 也不能给对象的编写带来额外的限制,还需要给本地客户和远程客户提供两种不同的接口。 那我们应该怎么做呢?大家想一想 当两个事物互相依赖,互相影响,耦合度很高时,怎么解耦? 遇到这种情况,一个非常有效的办法就是中间再加一个层次。 当两个事物互相依赖,互相影响,耦合度很高时,怎么解耦? 遇到这种情况,一个非常有效的办法就是中间再加一个层次。 如果双方的差异度很大,需要多层 利用添加多个层次的方法来解耦的优缺点 解耦 两个对象可以独立并行开发 灵活可扩展 增加了层次,造成传输的延迟,付出了时间代价 应用 以后如果遇到两个对象之间互相影响,耦合度大时,考虑添加层次 如果系统实现难度很大,考虑多层次实现。 前面我们所讲的模式,实际上都是可以用这个思想解释。 远程方法 在客户调用远程对象时,由于需要通过网络,因此添加两个层次,可以让客户和远程对象的开发不会因为需要通过网络而有任何的改变。 有了两个辅助对象,客户调用本地对象和远程对象的方法可以一致,客户不觉得,但实际运行是不一致的;而服务被本地客户调用和远程客户调用的方式也是一致的,不需重新编写。 Java RMI RMI提供了客户辅助对象和服务辅助对象,程序员可以不管网络的传输。 Stub 桩 客户辅助对象 Skeleton 骨架 服务辅助对象 远程服务的制作 制作远程接口,定义出让客户调用的方法 制作远程的实现,为接口方法提供真正的实现。 利用rmic产生stub和skeleton,rmic工具自动处理 启动rmi注册表,客户可以查到代理的位置 开始远程服务,运行服务对象,注册到rmi注册表,供客户调用。 制作远程接口 扩展 java.rmi.Remote, Remote接口是一个记号接口,不含有方法。 public interfa

文档评论(0)

1亿VIP精品文档

相关文档