控制对象访问--代理模式
2014-11-25 11:02
609 查看
</pre> 代理模式创建代表,让代表对象控制某对象的访问,被代理的对象控制某对象的访问,被代理的对象可以是远程的对象,创建开销大的对象或者需要安全控制的对象。<p></p><p> 下面将以远程代理讲述。代称代理的UML类图如下:</p><p> <img src="https://img-blog.csdn.net/20141125110424500?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd200NzI2Ng==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /></p><p><span style="white-space:pre"></span>这里将用到RMI(<span style="font-family:SimSun"><span style="color:rgb(84,84,84); font-size:12px; line-height:14.5600004196167px">Remote Method Invocation</span>),RMI提供了客户负责对象和服务辅助对象,为客户辅助对象创建和服务对象相同的方法。RMI的好处在与你不必亲自写任何网络或I/O代码,客户程序调用远程的方法(真正的服务子类)</span></p><p><span style="font-family:SimSun">1远程服务接口</span></p><p><span style="font-family:SimSun"></span></p><pre name="code" class="html"><pre style="background-color:#2b2b2b;color:#a9b7c6;font-family:'Consolas';font-size:14pt;"><span style="color:#808080;">//~--- JDK imports ------------------------------------------------------------ </span><span style="color:#808080;"> </span><span style="color:#cc7832;">import </span>java.rmi.Remote<span style="color:#cc7832;">; </span><span style="color:#cc7832;">import </span>java.rmi.RemoteException<span style="color:#cc7832;">; </span><span style="color:#cc7832;"> </span><span style="color:#629755;">/** </span><span style="color:#629755;"> * Created by wangming3 on 2014/11/25 9:59. </span><span style="color:#629755;"> */ </span><span style="color:#cc7832;">public interface </span>MyRomete <span style="color:#cc7832;">extends </span>Remote { <span style="color:#629755;">/** </span><span style="color:#629755;"> * Method description </span><span style="color:#629755;"> * </span><span style="color:#629755;"> * </span><span style="color:#629755;"> * @throws RemoteException </span><span style="color:#629755;"> */ </span><span style="color:#629755;"> </span><span style="color:#cc7832;">public </span>String <span style="color:#ffc66d;">sayHello</span>() <span style="color:#cc7832;">throws </span>RemoteException<span style="color:#cc7832;">; </span>}
2.实现此接口
<pre style="background-color:#2b2b2b;color:#a9b7c6;font-family:'Consolas';font-size:14pt;"><span style="color:#cc7832;background-color:#344134;">import</span><span style="color:#cc7832;"> </span>java.net.MalformedURLException<span style="color:#cc7832;">; </span><span style="color:#cc7832;">import </span>java.rmi.Naming<span style="color:#cc7832;">; </span><span style="color:#cc7832;">import </span>java.rmi.RemoteException<span style="color:#cc7832;">; </span><span style="color:#cc7832;">import </span>java.rmi.server.UnicastRemoteObject<span style="color:#cc7832;">; </span><span style="color:#cc7832;"> </span><span style="color:#629755;">/** </span><span style="color:#629755;"> * Created by wangming3 on 2014/11/25 10:02. </span><span style="color:#629755;"> */ </span><span style="color:#cc7832;">public class </span>MyRometeImpl <span style="color:#cc7832;">extends </span>UnicastRemoteObject <span style="color:#cc7832;">implements </span>MyRomete { <span style="color:#cc7832;">protected </span>MyRometeImpl() <span style="color:#cc7832;">throws </span>RemoteException { } <span style="color:#bbb529;">@Override </span><span style="color:#bbb529;"> </span><span style="color:#cc7832;">public </span>String <span style="color:#ffc66d;">sayHello</span>() <span style="color:#cc7832;">throws </span>RemoteException { <span style="color:#cc7832;">return </span><span style="color:#6a8759;">"server say hello"</span><span style="color:#cc7832;">; </span><span style="color:#cc7832;"> </span>} <span style="color:#cc7832;">public static void </span><span style="color:#ffc66d;">main</span>(String[] args) { <span style="color:#cc7832;">try </span>{ MyRomete servce = <span style="color:#cc7832;">new </span>MyRometeImpl()<span style="color:#cc7832;">; </span><span style="color:#cc7832;"> </span>Naming.<span style="font-style:italic;">rebind</span>(<span style="color:#6a8759;">"remoteService"</span><span style="color:#cc7832;">, </span>servce)<span style="color:#cc7832;">; </span><span style="color:#cc7832;"> </span>} <span style="color:#cc7832;">catch </span>(RemoteException e) { e.printStackTrace()<span style="color:#cc7832;">; </span><span style="color:#cc7832;"> </span>} <span style="color:#cc7832;">catch </span>(<span style="background-color:#344134;">MalformedURLException</span> e) { e.printStackTrace()<span style="color:#cc7832;">; </span><span style="color:#cc7832;"> </span>} } }
3.利用rmic产生stub和skeleton,其中stub和skeleton是术语。
rmic编译器根据编译后的Java类(含有远程对象实现)名,为远程对象生成stub和skeleton(远程对象是指实现 java.rmi .Remote接口的对象)。在 rmic 命令中所给的类必须是经javac 命令成功编译且是完全包限定的类 。例如,按如下所示 对类文件名HelloImpl 运行
rmic : rmic MyRometeImpl这将创建
<span style="font-size: 14.3999996185303px; line-height: 25.2000007629395px; background-color: rgb(255, 255, 255);"></span><pre name="code" class="html" style="font-size: 14.3999996185303px; line-height: 25.2000007629395px; font-family: SimSun;">MyRometeImpl<span style="font-size: 14.3999996185303px; line-height: 25.2000007629395px; background-color: rgb(255, 255, 255);">_Skel.class 和 </span><span style="font-size: 14.3999996185303px; line-height: 25.2000007629395px;">MyRometeImpl_</span><span style="font-size: 14.3999996185303px; line-height: 25.2000007629395px; background-color: rgb(255, 255, 255);">Stub.class文件。</span>
4.启动RMI regist
命令如下:
rmiregistry
5.开始远程服务
客户端代码:
import java.net.MalformedURLException; import java.rmi.Naming; import java.rmi.NotBoundException; import java.rmi.RemoteException; /** * Created by wangming3 on 2014/11/25 12:30. */ public class MyRometeClient { public static void main(String[] args) { new MyRometeClient().test(); } public void test(){ try { MyRomete service = (MyRomete) Naming.lookup("rmi//127.0.0.1/remoteService"); String s = service.sayHello(); System.out.println(s); } catch (NotBoundException e) { e.printStackTrace(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (RemoteException e) { e.printStackTrace(); } } }
相关文章推荐
- 为其他对象提供一种代理以控制对这个对象的访问-代理模式
- 设计模式(2)_代理模式 ————— 控制对象访问
- 代理模式:控制对对象的访问
- 控制对对象的访问——代理模式详解(静态代理和动态代理的区别以及联系)
- 结构型模式01-代理模式(为其他对象提供一种代理以控制这个对象的访问)
- 代理模式 -- 通过代理对象间接访问对象
- 设计模式:性能与对象访问(享元,代理) :对象状态(备忘录)
- 代理模式:给某一对象提供代理对象,并由代理对象控制具体对象的引用.
- 深入浅出设计模式-013:代理模式(Proxy Pattern控制和管理访问)
- Squid缓存服务器(缓存机制、代理模式、ACL访问控制、squid用户认证功能等)
- 设计技巧27:代理 Proxy 为另外一个对象提供替身或者站位符以控制对对象的访问
- 代理模式 -- 通过代理对象间接访问对象
- 访问控制:protected 之 单元素模式设计
- C++中单例模式对象的释放控制(转)
- Proxy 代理对象结构模式
- VC使用ADO对象控制ACCESS数据库的访问-举例
- 面向对象设计模式---之代理模式
- C++中单例模式对象的释放控制
- 从编译角度看对象访问控制
- 面向对象程序设计:继承成员访问控制机制