常用设计模式
Posted lswater
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常用设计模式相关的知识,希望对你有一定的参考价值。
一、标题
常用设计模式
二、描述
本篇将介绍常用的设计模式,包括抽象工厂模式,装饰器模式,远程代理模式
三、设计模式
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; }
参考2:
package org.hhq.demo.rmi; /** * 抽象工厂 * 创建服务调用类型 */ public interface RemoteServiceFactory { /** * 第一种服务调用方式 * @return 服务调用 */ RemoteService createFirstRemoteService(); /** * 第二种服务调用方式 * @return 服务调用 */ RemoteService createSecondRemoteService(); /** * 第三种服务调用方式 * @return 服务调用 */ RemoteService createthirdRemoteService(); }
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; } }
3、远程代理模式:通过代理远程连接生成本地代理,使用时通过调用远程对象的本地代理,调用远程对象,具体调用过程隐藏内部实现
参考1:
/** * 远程代理模式 * 1、要求接口必须继承remote接口 * 2、所有远程方法均需要抛出远程调用异常 * 创建远程调用接口 */ public interface DepartmentServiceRemote extends Remote { /** *查询部门信息 * @return 返回部门信息,要求Department序列化 * @throws RemoteException */ List<Department> queryDepartments() throws RemoteException; }
四、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
以上是关于常用设计模式的主要内容,如果未能解决你的问题,请参考以下文章