您的位置:首页 > 其它

控制对象访问--代理模式

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();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息