代理模式第一篇

简单的说就是有一个远程服务和若干台监视器,监视器用来监视远程服务中的有关数据。监视任务的

障碍点在于远程服务和监视器程序不在同一个JVM上。这就导致监视器没法在本地直接调用服务器的

方法对其进行监控。我们需要一个代理来,监视器所做的就像是在做远程方法调用,但其实只是调用

本地堆中的"代理"对象上的方法,再由代理处理所有网络通信的低层细节。

制作远程服务的步骤:

1:制作远程接口,接口定义了要供客户调用的远程方法。

MyRemote.java : interface MyRemote extends Remote (接口继承接口)

2.制作远程的实现,这就是客户想要真正调用的方法。

MyRemoteImpl.java : class MyRemoteImpl extends UnicastRemoteObject implements Remote (

UnicastRemostObject让超类帮助子类成为远程对象,具备某些”远程“功能)

//3.设计一个不带变量的构造器,并声明RemoteException。因为如果超类的构造器抛出异常,那么你只能声明

子类的构造器也抛出异常。这个比编译器会检查到错误并给出提示。

public MyRemoteImpl() throws RemoteException{}

3.利用rmic产生的stub和skeleton。

% rmic MyRemoteImpl ,

就会产生两个新的类,作为辅助对象 : MyRemoteImpl_Stub.class和MyRemoteImpl_Skel.class

4.用RMI Registry注册此服务

% rmiregistry

5.开始远程服务。

%java MyRemoteImpl

远程服务实现代码如下:

MyRemote接口:

public interface MyRemote extends Remote{
public String sayHello() throws RemoteException;
}

MyRemoteImple服务类:

public class MyRemoteImpl extends UnicastRemoteObject implements MyRemote{

protected MyRemoteImpl() throws RemoteException {
super();
// TODO Auto-generated constructor stub
}

@Override
public String sayHello() throws RemoteException {
// TODO Auto-generated method stub
return "Server says, ‘Hey‘";
}

public static void main(String [] args)
{
try {
MyRemote service=new MyRemoteImpl();
Naming.rebind("RemoteHello", service);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

}

再看客户对象的工作方式:

1.客户到RMI registry中寻找。

Naming.lookup("rmi://127.0.0.1/RemoteHello");

2.RMI Registry返回Stub对象,然后RMI会自动对stub反序列化。你在客户端必须有stub类,

否则stub就无法被反序列化。

3.客户调用stub方法,就像stub就是真正的服务对象一样。

完整的客户端代码:

public class MyRemoteClient {
public static void main(String [] args)
{
new MyRemoteClient().go();
}

public void go()
{
try
{
MyRemote service=(MyRemote)Naming.lookup( rmi://127.0.0.1/RemoteHello);
String s=service.sayHello();
System.out.println(s);
}catch(Exception ex)
{
ex.printStackTrace();
}

}
}

编译过程如下图所示:

生成stub和skeleton,并启动RMI registry。rmiregistry 就像电话簿,客户可以从中查到代理的位置(也就是客户的stub helper对象)。

启动远程服务:

然后将编译时服务端生成的相应的.class文件包括stub的class文件复制到客户端类文件夹下。再对客户端类

进行编译运行。如下图所示:

到此位置,我们的任圆满完成。

在实现这个过程中遇到些阻碍,在这篇博客结束前针对于实现的过程做一下总结:

1.在利用rmic产生stub和skeleton类的过程中,找不到类。最后解决方法:set classpath=编译产生

的远程服务的class文件的路径。其中还要注意类所在的包的问题。

2.rmic只针对于远程服务创建stub和skeleton。如果针对于非远程服务将会出现如下报错:

3.在编译客户代码前,首先要把远程服务中相应的class文件以及stub类放入客户端类文件下。

4.在编译客户代码类时先要设置classpath变量:set classpath="客户代码类所在的路径"

5.在客户和远程服务至今传送的变量和返回值类型必须是可序列化的类型。因为只有是可序列化的,才可以通过

网络对变量和返回值进行打包并传送。

代理模式第一篇

时间: 2024-11-09 06:17:17

代理模式第一篇的相关文章

命令模式第一篇

需求:现有一个遥控器,有七个可编程的插槽,每个插槽都对应开关按钮,遥控器还具备一个整体的撤销按钮. 可控装置:电灯.风扇.热水器.音响设备和其它类似的可控制装备.要求能够控制目前的装置和任何未来可能出现的装置. 我们把这个过程想象成餐厅吃饭的过程:顾客根据菜单点单,然后将订单给服务员,服务员将订单放到厨房柜台上,厨师拿到订单进行执行,制作出美味的饭菜. 在这里,遥控器就是一个远程控制,它掌握一系列的命令接口,当我们按下遥控器按钮时,发出相应的命令进行执行,相应的命令对象接收到执行命令后发送命令给

命令模式第二篇

命令模式第一篇中把问题简化成一个遥控器,它只有一个按钮和对应的插槽,可以控制一个装置. 根据需求,现在有7个插槽,每个插槽都有一个开和关按钮,可以控制一个装置.只需将远程控制 对象中的单个命令组件换成命令组件数组即可.再加一个控制整个装置的撤销按钮. 实现代码如下: public interface Command { public void execute(); public void undo();} public class GargeDoorCloseCommand implements

设计模式--5.1 代理模式--入门

1.代理模式 (1) 为其它对象提供一种代理,以控制对这个对象的访问. (2) 代理模式也叫委托模式,其它模式,如状态模式.策略模式.访问者模式,本质上是在更特殊的场合使用了代理模式. 2.代理模式通用类图 (1)Subject 抽象主题角色,可以是抽象类,也可以是接口,是一个普通的业务类型定义 (IGamePlayer) (2)RealSubject 也叫被委托角色.被代理角色,它才是冤大头,是业务逻辑的具体执行者.(GamePlayer,具体执行业务) (3)Proxy 也叫委托类.代理类,

设计模式--5.2 代理模式--普通代理

1. 普通代理就是我们要知道代理类(Subject)的存在,然后才能访问 (1)调用者只知道代理存在就可以, 不用知道代理了谁 (2) 屏蔽了真实角色(RealSubject)的变更对高层类(场景类)的影响 (3)真实的主题角色想怎么修改就怎么修改, 对高层次的模块没有任何的影响,只要你实现了接口所对应的方法, 该模式非常适合对扩展性要求较高的场合. 2. (1) 接口类 package com.design.代理模式.第一阶段; public interface IGamePlayer { v

第一篇 SQL Server代理概述

本系列文章来源于sqlservercentral,详细内容请参考原文. SQL Server代理是SQL Server的作业调度和告警服务,如果使用得当,它可以大大简化DBA的工作量.SQL Server代理的核心是运行批量作业的能力.“批量”可以简单的理解成“一系列的动作”,经常是TSQL脚本.它们可以以作业的形式在特定的调度运行,这个调度你可以选择在只有少量用户访问系统的时间点/段.换而言之,可以使用SQL Server代理排定批量作业.批量作业可以是平常的T-SQL任务,也可以是运行于多个

OC学习篇之---代理模式

在前一篇文章我们介绍了OC中的协议的概念:http://blog.csdn.net/jiangwei0910410003/article/details/41776015,这篇文章我们就来介绍一下OC中的代理模式,关于代理模式,如果还有同学不太清楚的话,就自己去补充知识了,这里就不做介绍了,这里只介绍OC中是如何实现代理模式的. 这里举一个简单的例子: 小孩类,护士类,保姆类,其中小孩类有两个方法:wash和play 这里代理对象就是:护士类.保姆类,小孩类是被代理对象. 看一下代码: 首先看一

代理模式 + Effective C++ 第一章笔记

代理模式(Proxy):为其他对象提供一种代理以控制这个对象的访问. 应用: (1):远程代理,为一个对象在不同的地址空间提供局部代表.这样可以隐藏一个对象存在于不同地址空间的事实 (2):虚拟代理,根据需要创建开销大的对象.通过虚拟代理存放实例化需要很长时间的真是对象. (3):安全代理,用来控制真是对象访问时的权限. (4):智能指针,当调用真实的对象时,代理处理另外一些事. Effective C++: 1:确定对象被使用前已经被初始化 (1),为内置类型进行手工初始化,因为C++不保证初

设计模式总结篇系列:代理模式(Proxy)

时代在发展,我们发现,现在不少明星都开始进行微访谈之类的,有越来越多的参与捐赠等.新的一天开始了,首先看下新的一天的日程安排: 1 interface Schedule{ 2 3 public void weiTalk(); 4 5 public void donation(); 6 7 } Schedule接口定义了今天的形成安排,主要包括微访谈和捐款.那么看一下实现此接口的明星类定义: 1 class Star implements Schedule { 2 3 @Override 4 pu

设计模式之代理模式(Proxy Pattern)_补充篇

写在前面: 代理模式的内部原理,作用及远程代理的实现在上一篇博文中都做了详细解释,本文只是对其内容的补充,介绍其它代理 一.虚拟代理 首先,明确虚拟代理的作用:在巨大对象被真正创建出来之前,用虚拟代理来代替巨大对象(保证了巨大对象在需要的时候才被创建,避免资源浪费) 虚拟代理我们可能经常在用,只是不认识它而已,比如: 我们的程序中可能存在密集的计算或者从服务器取得大量数据这样耗时耗资源的操作,一般都会先显示默认信息,或者显示动画表示我们的程序还在努力工作,在操作完成之后显示获得的信息 其中就用到