首页 > 其他 > 详细

常用设计模式

时间:2019-12-07 23:57:11      阅读:152      评论:0      收藏:0      [点我收藏+]

一、标题
  常用设计模式

二、描述
  本篇将介绍常用的设计模式,包括抽象工厂模式,装饰器模式,远程代理模式

三、设计模式
   1、抽象工厂模式:提供接口给子类,用于创建多个相类似的对象

    参考1:

技术分享图片
package org.hhq.demo.rmi;

import java.rmi.RemoteException;

/**
 * 抽象工厂
 * 创建部门服务实现
 */
public interface DepartmentServiceRemoteFactory {
    /**
     * 部门服务的第一种实现
     * @return 服务对象
     * @throws RemoteException
     */
    DepartmentServiceRemote createFirstDepartmentService() throws RemoteException;

    /**
     * 部门服务的第二种实现
     * @return 服务对象
     * @throws RemoteException
     */
    DepartmentServiceRemote createSecondDepartmentService() throws RemoteException;
    /**
     * 部门服务的第三种实现
     * @return 服务对象
     * @throws RemoteException
     */
    DepartmentServiceRemote createThirdDepartmentService() throws RemoteException;
}
View Code

    参考2:

技术分享图片
package org.hhq.demo.rmi;

/**
 * 抽象工厂
 * 创建服务调用类型
 */
public interface RemoteServiceFactory {
    /**
     * 第一种服务调用方式
     * @return 服务调用
     */
    RemoteService createFirstRemoteService();
    /**
     * 第二种服务调用方式
     * @return 服务调用
     */
    RemoteService createSecondRemoteService();
    /**
     * 第三种服务调用方式
     * @return 服务调用
     */
    RemoteService createthirdRemoteService();
}
View Code

   2、装饰器模式:通过对象组合,动态地在对象调用过程中植入额外功能

    参考1:

技术分享图片
package org.hhq.demo.rmi.imp;

import org.hhq.demo.rmi.RemoteService;

import java.io.IOException;
import java.net.MalformedURLException;
import java.rmi.NotBoundException;
import java.rmi.Remote;
import java.rmi.RemoteException;

/**
 * 装饰模式
 * 远程服务调用的装饰类
 */
public class RemoteServiceDecorate implements RemoteService {
    /**
     * 远程服务调用
     */
    private RemoteService remoteService;

    public RemoteServiceDecorate(RemoteService remoteService){
        this.remoteService = remoteService;
    }

    /**
     * 装饰rebind
     * @param port 端口
     * @param name 名称地址
     * @param remote 需要注册的远程对象
     * @throws IOException
     */
    public void rebind(int port, String name, Remote remote) throws IOException {
        System.out.println("start:RemoteServiceDecorate->"+remoteService.getClass()+"->rebind:port:"+port+";name:"+name+";remote:"+remote);
        remoteService.rebind(port,name,remote);
        System.out.println("end:RemoteServiceDecorate->"+remoteService.getClass());
    }

    /**
     * 装饰lookup
     * @param host 主机名称
     * @param port 端口
     * @param name 名称地址
     * @return
     * @throws RemoteException
     * @throws NotBoundException
     * @throws MalformedURLException
     */
    public Remote lookup(String host, int port, String name) throws RemoteException, NotBoundException, MalformedURLException {
        System.out.println("start:RemoteServiceDecorate->"+remoteService.getClass()+"->lookup:host:"+host+";port:"+port+";name:"+name);
        Remote remote = remoteService.lookup(host,port,name);
        System.out.println("end:RemoteServiceDecorate->"+remoteService.getClass()+"->lookup:remote:"+remote.getClass()+"");
        return remote;
    }
}
View Code

   3、远程代理模式:通过代理远程连接生成本地代理,使用时通过调用远程对象的本地代理,调用远程对象,具体调用过程隐藏内部实现

    参考1:

技术分享图片
/**
 * 远程代理模式
 * 1、要求接口必须继承remote接口
 * 2、所有远程方法均需要抛出远程调用异常
 * 创建远程调用接口
 */
public interface DepartmentServiceRemote  extends Remote {
    /**
     *查询部门信息
     * @return 返回部门信息,要求Department序列化
     * @throws RemoteException
     */
    List<Department> queryDepartments() throws RemoteException;
}
View Code

    

四、java远程代理

  方式一:
    1、远程服务类实现远程服务接口,并继承UnicastRemoteObject类
    2、使用cmd命令行,通过javac命令生成远程代理的.class文件,再通过rmi命令生成本地代理以及服务代理,再通过rmiregistry port命令注册远程服务
    3、注入:通过Naming.rebind(name,remote)将远程服务绑定到本地(远程)注册表;(name:protocol://ip:port/serviceName; remote:远程服务对象)
    4、调用:通过Naming.lookup(name)从远程服务的本地注册表查找服务
    5、转换成对应对象就可以使用了
  方式二:
    1、远程服务类实现远程服务接口,并继承UnicastRemoteObject类
    2、向本地(远程)注册服务端口LocateRegistry.createRegistry(port)
    3、注入:通过Naming.rebind(name,remote)将远程服务绑定到本地(远程)注册表;(name:protocol://ip:port/serviceName; remote:远程服务对象)
    4、调用:通过Naming.lookup(name)从远程服务的本地注册表查找服务
    5、转换成对应对象就可以使用了
  方式三:
    1、向本地(远程)注册服务端口LocateRegistry.createRegistry(port)
    2、将远程服务对象暴露到本地注册表UnicastRemoteObject.exportObject(remote,0),暴露该对象使该对象继承UnicastRemoteObject
    3、注入:通过registry.rebind(name,remote2)将远程服务绑定到本地(远程)注册表;(name:protocol://ip:port/serviceName; remote:远程服务对象)
    4、调用:LocateRegistry.getRegistry(host,port)获取本地(远程)注册表,再通过registry.lookup(name)从注册表查询服务
    5、转换成对应对象就可以使用了

   

  注意:之所以继承UnicastRemoteObject类,是因为该类内部提供了远程调用功能支持

五、demo地址:https://gitee.com/lswater/java-design-pattern-demo

常用设计模式

原文:https://www.cnblogs.com/lswater/p/12003526.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!