《对象适配器模式(6页).doc》由会员分享,可在线阅读,更多相关《对象适配器模式(6页).doc(6页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、-对象适配器模式-第 6 页实验项目名称: 对象适配器模式 (所属课程: 软件设计模式 )学 院:计算机科学与信息工程学院 专业班级:软件工程13-1 姓 名:王会芳 学 号: 实验日期:2016年4月3 实验地点:A06 404 合作者: 指导教师:高原 本实验项目成绩: 教师签字: 日期: 一、 实验目的与要求1.练习使用对象适配器模式。设计相关的模拟场景并进行实施,验证模式特性,掌握其优缺点。2.实验结束后,对相关内容进行总结。二、实验内容某系统需要提供一个加密模块,将用户信息(如密码等机密信息)机密之后再存储在数据库中,系统已经定义好了数据库操作类。为了提高开发效率,现需要重用已有的加
2、密算法,这些算法封装在一些由第三方提供的类中,有些甚至没有源代码。使用适配器模式设计该加密模块,实现在不修改现有类的基础上重用第三方加密方法。通过分析,可使用对象适配器模式实现该系统设计,该实例类图如图1所示。DataOperationabstract- password : String+ setPassword(String password) : void+ getPassword() : String+ doEncrypt(int key, String ps) : StringCipherAdapter- cipher : Caesar+ CipherAdapter()+ doEnc
3、rypt(int key, String ps) : StringNewCipherAdapter- cipher : NewCipher+ NewCipherAdapter()+ doEncrypt(int key, String ps) : StringCaesar+ doEncrypt(int key, String ps) : StringNewCipher+ doEncrypt(int key, String ps) : Stringciphercipher图1 加密适配器类图(1)目标抽象类DataOperation(数据操作类)public abstract class Data
4、Operation private String password;public void setPassword(String password)this.password=password;public String getPassword()return this.password;public abstract String doEncrypt(int key, String ps);DataOperation类中包含了抽象方法doEncrypt(),客户端针对抽象类DataOperation进行编程,在客户端代码中调用DataOperation的doEncrypt()实现数据加密。(
5、2)适配者类Caesar(数据加密)public class Caesar public String doEncrypt(int key, String ps)String es=;for(int i=0;i=a&cz) c-=26;if(c=A&cZ) c-=26;if(cZ) c+=26;es+=c;return es;Caesar类是一个由第三方提供的数据加密类,该类定义为final类,无法继承。因此本实例不能通过类适配器来实现,只能使用对象适配器实现。客户端在使用时无须关心Caesar类的源代码,甚至无法获得该类的源代码,只有编译后的class文件。(3)适配器类CipherAdap
6、ter(加密适配器类)public class CipherAdapter extends DataOperation private Caesar cipher;public CipherAdapter()cipher=new Caesar();public String doEncrypt(int key, String ps)return cipher.doEncrypt(key, ps);CipherAdapter类充当适配器角色,由于Caesar类无法继承,本实例采用对象适配器模型,在CipherAdapter类中定义一个Caesar类型的成员对象,在CipherAdapter类的构
7、造函数实例化Caesar对象,CipherAdapter与Caesar类之间是组合关联关系。(4)XML操作工具类XMLUtilimport javax.xml.parsers.*;import org.w3c.dom.*;import org.xml.sax.SAXException;import java.io.*;public class XMLUtil/该方法用于从XML配置文件中提取具体类类名,并返回一个实例对象public static Object getBean()try/创建文档对象DocumentBuilderFactory dFactory = DocumentBuild
8、erFactory.newInstance();DocumentBuilder builder = dFactory.newDocumentBuilder();Document doc;doc = builder.parse(new File(config.xml); /获取包含类名的文本节点NodeList nl = doc.getElementsByTagName(className); Node classNode=nl.item(0).getFirstChild(); String cName=classNode.getNodeValue(); /通过类名生成实例对象并将其返回 Cla
9、ss c=Class.forName(cName); Object obj=c.newInstance(); return obj; catch(Exception e) e.printStackTrace(); return null;(5) CipherAdapter(6)客户端测试类Clientpublic class Clientpublic static void main(String args)DataOperation dao=(DataOperation)XMLUtil.getBean();dao.setPassword(wangHuiFang);String ps=dao.
10、getPassword();String es=dao.doEncrypt(6,ps);System.out.println(明文为: + ps);System.out.println(密文为: + es);在客户端测试类Client中,我们需要多“wangHuiFang“进行加密,在实现时调用目标抽象类DataOperation的doEncrypt()方法,而将具体类的类名保存在config.xml配置文件中,程序运行时,将读取存取在配置文件中的类名,再通过Java反射机制生成对象,该对象在运行时将动态替换父类的doEncrypt()方法,实现真正加密。在配置文件中将节点中的内容设置为:Ci
11、pherAdapter,则输出结果如下:如果需要更换一种更为安全的加密算法,如使用求模运算来进行加密,代码如下所示:public final class NewCipherpublic String doEncrypt(int key,String ps)String es=;for(int i=0;ips.length();i+)String c=String.valueOf(ps.charAt(i)%key);es+=c;return es;在系统中使用如上所述的新加密算法,可以对应增加一个新的适配器类,代码如下:public class NewCipherAdapter extends DataOperationprivate NewCipher cipher;public NewCipherAdapter()cipher=new NewCipher();public String doEncrypt(int key,String ps)return cipher.doEncrypt(key,ps);在配置文件中将节点中的内容设置为:NewCipherAdapter,则输出结果如下:三、实验总结1. 通过本次实验对对象适配器模式有了深刻的认识。2. 通过本次实验知道了对象配器模式的结构和实现方式。3. 通过本次实验理解了类适配器和对象适配器的差异。
限制150内