代理模式
# 代理模式(Proxy Pattern)
# 定义
代理模式 为另一个对象提供一个替身或占位符以控制对这个对象的访问。
# 提出问题
书接上回,我们实现的糖果机已经可以正常工作了。现在我们想使糖果机获得更好的监控,创建一份能打印出来的报告。
# 测试 RMI
/** 步骤一、制作远程接口
* 1. 继承 Remote
* 2. 所有方法都会抛出 RemoteException 异常
* 3. 变量和返回值是元语(primitive)或者序列化(Serializable)的,因为需要进行网络 IO
*/
public interface MyRemote extends Remote {
public String sayHello() throws RemoteException;
}
/**
* 步骤二、制作远程实现
* 1. 实现远程接口 xxxRemote
* 2. 继承 UnicastRemoteObject(使对象继承超类的远程功能)
* 3. 创建无参构造器,并抛出异常
* 4. 用 RMI Registry 注册此服务
*
*
* 步骤三、产生 Stub 和 Skeleton(`rmic 包名.MyRemoteImpl`)
* 步骤四、执行 remiregistry(保证启动目录可以访问类,最简单做法 classes 下启动)(`rmiregistry`)
* 步骤五、启动服务(`java 包名.MyRemoteImpl`)
*/
public class MyRemoteImpl extends UnicastRemoteObject implements MyRemote {
protected MyRemoteImpl() throws RemoteException {}
@Override
public String sayHello() throws RemoteException {
return "Hello World!!!!!!!!!!!!!!";
}
public static void main(String[] args) {
try {
MyRemoteImpl service = new MyRemoteImpl();
// 先保证 RMI Registry 正在运行,然后注册服务(stub)
Naming.bind("RemoteHello", service);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class MyRemoteClient {
public void go() {
try {
MyRemote serivce = (MyRemote) Naming.lookup("rmi://127.0.0.1/RemoteHello");
String s = serivce.sayHello();
System.out.println(s);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new MyRemoteClient().go();
}
}
// Make sure to add code blocks to your code group
# GumballMachine 远程代理
编辑 (opens new window)
上次更新: 2022/09/27, 16:57:46