远程代理模式-Remote Proxy

服务端通过rmi将对象注册到远程服务, 客户端使用时, 只需要通过rmi协议获取即可, 只要接口统一, 即可不需要知道内部具体实现, 直接调用使用.

CompareHelper接口

这里就是客户端和服务端统一的接口, 只需要服务端根据这个接口实现相应的功能, 然后注册上去, 客户端就可以根据这个接口来使用相应的功能.

import java.rmi.RemoteException;
import java.rmi.*; /**
* 定义一个远程接口,必须继承Remote接口,其中需要远程调用的方法须抛出RemoteException异常
*/
public interface CompareHelper<T> extends Remote { /**
* 比较 object1 和 object2 的大小,
* 如果object1大, 那么返回true
* 如果object2大, 那么返回false
*/
boolean compare(T object1, T object2) throws RemoteException; /**
* 将object2的值连接到object1的后面
*/
T append(T object1, T object2) throws RemoteException;
}

IntegerCompareHelper类

CompareHellper接口的其中一种实现. 用于处理Integer类型.

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject; public class IntegerCompareHelper extends UnicastRemoteObject implements CompareHelper<Integer> {
protected IntegerCompareHelper() throws RemoteException {
} @Override
public boolean compare(Integer object1, Integer object2) throws RemoteException {
return object1 - object2 > 0;
} @Override
public Integer append(Integer object1, Integer object2) throws RemoteException {
return Integer.valueOf(object1.toString() + object2.toString());
}
}

StringCompareHelper类

CompareHellper接口的其中一种实现. 用于处理String类型.

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject; public class StringCompareHelper extends UnicastRemoteObject implements CompareHelper<String> { protected StringCompareHelper() throws RemoteException {
} @Override
public boolean compare(String object1, String object2) throws RemoteException {
return object1.compareTo(object2) > 0;
} @Override
public String append(String object1, String object2) throws RemoteException {
return object1 + object2;
}
}

Server类

用于注册服务到远程服务上.

import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry; /**
* 创建RMI注册表,启动RMI服务,并将远程对象注册到RMI注册表中。
*/
public class Server {
private static final String HOST = "localhost";
private static final int PORT = 9090; public static void main(String args[]) { try {
//创建2个对象, 准备将这个两个对象作为远程对象注册
CompareHelper stringCompareHelper = new StringCompareHelper();
CompareHelper integerCompareHelper = new IntegerCompareHelper(); LocateRegistry.createRegistry(PORT); //绑定的URL标准格式为:rmi://host:port/name(其中协议名可以省略,下面两种写法都是正确的)
// 本例子中就是 "rmi://localhost:9090/XXXXXXCompareHelper"
Naming.bind("rmi://" + HOST + ":" + PORT + "/StringCompareHelper", stringCompareHelper);
Naming.bind("//" + HOST + ":" + PORT + "/IntegerCompareHelper", integerCompareHelper); System.out.println("---->远程对象绑定成功!");
} catch (RemoteException e) {
System.out.println("创建远程对象发生异常!");
e.printStackTrace();
} catch (AlreadyBoundException e) {
System.out.println("发生重复绑定对象异常!");
e.printStackTrace();
} catch (MalformedURLException e) {
System.out.println("发生URL畸形异常!");
e.printStackTrace();
}
}
}

Client类

用于调用远程服务.

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException; /**
* 客户端测试,在客户端调用远程对象上的远程方法,并返回结果。
*/
@SuppressWarnings("unchecked")
public class Client {
public static void main(String args[]) {
try {
CompareHelper compareHelper; compareHelper = (CompareHelper) Naming.lookup("rmi://localhost:9090/StringCompareHelper");
System.out.println(compareHelper.append("你好", "哈哈哈"));
System.out.println(compareHelper.compare("abc", "ioi")); compareHelper = (CompareHelper) Naming.lookup("rmi://localhost:9090/IntegerCompareHelper");
System.out.println(compareHelper.append(6379, 8080));
System.out.println(compareHelper.compare(435, 666));
} catch (NotBoundException | MalformedURLException | RemoteException e) {
e.printStackTrace();
}
}
}

如何运行呢?

先运行Server.java里的main方法来注册服务, 再运行Client.java里的main方法来进行相应服务的获取和调用.

远程代理模式-Remote Proxy(Java实现)的更多相关文章

  1. 代理模式-JDK Proxy(Java实现)

    代理模式-JDK Proxy 使用JDK支持的代理模式, 动态代理 场景如下: 本文例子代理了ArrayList, 在ArrayList每次操作时, 在操作之前和之后都进行一些额外的操作. Array ...

  2. 虚拟代理模式-Virtual Proxy(Java实现)

    虚拟代理模式-Virtual Proxy 虚拟代理模式(Virtual PRoxy)会推迟真正所需对象实例化时间. 在需要真正的对象工作之前, 如果代理对象能够处理, 那么暂时不需要真正对象来出手. ...

  3. 保护代理模式-Access Proxy(Java实现)

    保护代理模式-Access Proxy 保护代理模式(Access Proxy), 也叫Protect Proxy. 这种代理用于对真实对象的功能做一些访问限制, 在代理层做身份验证. 通过了验证, ...

  4. JAVA设计模式(09):结构型-代理模式(Proxy)

    代理模式是经常使用的结构型设计模式之中的一个,当无法直接訪问某个对象或訪问某个对象存在困难时能够通过一个代理对象来间接訪问,为了保证client使用的透明性,所訪问的真实对象与代理对象须要实现同样的接 ...

  5. JAVA设计模式(09):结构化-代理模式(Proxy)

    一,定义:  代理模式(Proxy):为其它对象提供一种代理以控制对这个对象的訪问. 二.其类图: 三,分类一:静态代理 1,介绍:也就是须要我们为目标对象编写一个代理对象,在编译期就生成了这个代理对 ...

  6. java设计模式(10):代理模式(Proxy)

    一,定义:  代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问. 二,其类图: 三,分类一:静态代理 1,介绍:也就是需要我们为目标对象编写一个代理对象,在编译期就生成了这个代理对 ...

  7. Java设计模式(10)代理模式(Proxy模式)

    理解并使用设计模式,能够培养我们良好的面向对象编程习惯,同时在实际应用中,可以如鱼得水,享受游刃有余的乐趣. Proxy是比较有用途的一种模式,而且变种较多,应用场合覆盖从小结构到整个系统的大结构,P ...

  8. 【java项目实战】代理模式(Proxy Pattern),静态代理 VS 动态代理

    这篇博文,我们主要以类图和代码的形式来对照学习一下静态代理和动态代理.重点解析各自的优缺点. 定义 代理模式(Proxy Pattern)是对象的结构型模式,代理模式给某一个对象提供了一个代理对象,并 ...

  9. NET设计模式 第二部分 结构性模式(13):代理模式(Proxy Pattern)

    代理模式(Proxy Pattern) ——.NET设计模式系列之十四 Terrylee,2006年5月 摘要:在软件系统中,有些对象有时候由于跨越网络或者其他的障碍,而不能够或者不想直接访问另一个对 ...

随机推荐

  1. @Resource 与 @Service注解的区别

    pring中什么时候用@Resource,什么时候用@service当你需要定义某个类为一个bean,则在这个类的类名前一行使用@Service("XXX"),就相当于讲这个类定义 ...

  2. PIC单片机基础1

    1.PIC单片机总线结构——哈佛结构:即指令和数据空间是完全分开的,所以与常见的微控制器不同的一点是,程序和数据总线可以采用不同的宽度.以PIC16F684单片机为例,数据总线是8位的,但指令总线位数 ...

  3. react this的作用域问题,麻烦大佬们帮我解决一下

    element里面有个Table组件,我想在编辑和删除那里加上点击事件,但是发现点击方法没有效果 这里面的this看起来好像只针对这个作用域里面的,这里没有办法设置状态,也不能调用方法 设置状态会出现 ...

  4. pyhton从开始到光棍的day11

    纪念我这个开始学python的光棍天,光棍天依旧是函数,这次的函数有个小高级,比昨天的low函数稍微高级点,就是在使用函数中是可以赋值的,比如索引一个值什么的.函数还可以当做参数进行传递,把这个函数名 ...

  5. JS去除掉字符串前后空格

    1. 推荐使用jquery已封装好的方法,非常简单 $.trim(str) jquery的内部实现如下, function trim(str){ return str.replace(/^(\s|\u ...

  6. cordova插件汇总

    1.获取当前应用的版本号 cordova plugin add cordova-plugin-app-version 2.获取网络连接信息 cordova plugin add cordova-plu ...

  7. VS2019 离线安装方法详解

    本文详细介绍了 VS2019 离线安装的相关步骤,以桌面开发为主下载 C++桌面开发..NET 桌面开发相关的工作负载.MFC 可选组件及帮助查看器. 工作负载(Workload) 离线安装需要先根据 ...

  8. python3.4中自定义数组类(即重写数组类)

    '''自定义数组类,实现数组中数字之间的四则运算,内积运算,大小比较,数组元素访问修改及成员测试等功能''' class MyArray: '''保证输入值为数字元素(整型,浮点型,复数)''' de ...

  9. 前后端分离与 restful api

    为什么要前后端分离(优点): PC,APP,PAD 多端适应 单页面应用(Single Page Application)SPA开发模式开始流行 前后端开发职责不清 开发效率问题,前后端互相等待 前端 ...

  10. P1119 灾后重建(floyd进阶)

    思路:这道题看n的范围很小(n<=200),显然就用floyd可以解决的问题,但又并不是简单的floyd算法,还是需要一些小小的变化.一开始我的思路是先跑一次弗洛伊德最短路,这样子显然复杂度很高 ...