设计模式第二次作业
1、要求:如果需要开发一个跨平台视频播放器,可以在不同操作系统平台(如Windows、Linux、UNIX等)上播放多种格式的视频文件,常见的视频格式包括MPEG、RMVB、AVI、WMV等。使用Bridge模式来设计。
类图如下图所示。
关键代码如下
public interface VideoFile
{
//视频文件接口
public void decode(String osType, String fileName);
}
public class RMVBFile implements VideoFile
{
//RMVB格式文件
public void decode(String osType, String fileName);
}
public class MPEGFile implements VideoFile
{
//MPEG格式文件
public void decode(String osType, String fileName);
}
public class WMFFile implements VideoFile
{
//WMF格式文件
public void decode(String osType, String fileName);
}
public class AVIFile implements VideoFile
{
//AVI格式文件
public void decode(String osType, String fileName);
}
public abstract class OS
{ //操作系统抽象类
protected VideoFile vf;
public void setVideo(VideoFile vf)
{
this.vf = vf;
}
public abstract void play(String fileName);
}
public class Linux extends OS
{ //Linux操作系统
public void play(String fileName)
{
String osType = "Linux播放";
this.vf.decode(osType,fileName);
}
}
public class Unix extends OS
{ //Unix操作系统
public void play(String fileName)
{
String osType = "Unix播放";
this.vf.decode(osType,fileName);
}
}
public class Windows extends OS
{ //Windows操作系统
public void play(String fileName)
{
String osType = "Windows播放";
this.vf.decode(osType,fileName);
}
}
2、要求:杀毒软件(AntiVirus)既能对系统中不同类型的文件 TextFile、ImageFile、VideoFile杀毒,也能对文件夹的杀毒,对文件夹杀毒就是对其中所包含文件的杀毒。使用Composite模式来设计。
类图如下图所示。
关键代码如下
abstract class AbstractFile
{ //文件抽象类
//文件杀毒
public abstract void killVirus();
}
class ImageFile extends AbstractFile
{
//图像文件
private String name;
public void killVirus();
}
class TextFile extends AbstractFile
{
//文本文件
private String name;
public void killVirus();
}
class VideoFile extends AbstractFile
{
//视频文件
private String name;
public void killVirus();
}
class Folder extends AbstractFile
{ //文件夹
//定义链表fileList,用于存储AbstractFile类型的成员
private ArrayList<AbstractFile> fileList=new ArrayList<AbstractFile>();
private String name;
public Folder(String name)
{
this.name = name;
}
public void add(AbstractFile file)
{
fileList.add(file);
}
public void remove(AbstractFile file)
{
fileList.remove(file);
}
public AbstractFile getChild(int i)
{
return (AbstractFile)fileList.get(i);
}
public void killVirus()
{
//递归调用成员构件的killVirus()方法
for(Object obj : fileList)
{
((AbstractFile)obj).killVirus();
}
}
}
3、要求:某系统提供一个数据加密功能,可以对字符串进行加密。最简单的加密算法通过对字母进行移位来实现,同时还提供稍复杂的逆向输出加密,还提供更为高级的求模加密。用户首先使用最简单的加密算法对字符串进行加密,如果觉得还不够可以对加密后的结果使用其他的加密算法进行二次加密,当然也可以进行第三次加密。使用Decrator模式来设计。
类图如下图所示。
关键代码如下
public abstract class Cipher
{
//加密字符串抽象类
public abstract String encryptStr(String str);
}
public class SimpleCipher extends Cipher
{
//简单加密操作
public String encryptStr(String text)
{
//移位加密操作
return string;
}
}
public class CipherDecorator extends Cipher
{
//抽象装饰类
private Cipher cipher;
public encryptStr(Cipher cipher)
{
this.cipher = cipher;
}
public String encrypt(String text)
{
return cipher.encrypt(text);
}
}
public class ComplexCipher extends CipherDecorator
{
//逆向加密字符串实现类
//加密前嵌套的加密方法
public ComplexCipher(Cipher cipher)
{
super(cipher);
}
public String encryptStr(String text)
{
return this.reverse(super.encrypt(text));
}
public String reverse(String text)
{
//逆向加密操作
}
}
public class AdvancedCipher extends CipherDecorator
{
//求模加密字符串实现类
//加密前嵌套的加密方法
public AdvancedCipher(Cipher cipher)
{
super(cipher);
}
public String encryptStr(String text)
{
return this.mod(super.encrypt(text));
}
public String mod(String text)
{
//求模加密操作
}
}
public class Client
{
//测试类
Cipher sc,cc,ac;
//简单加密
sc=new SimpleCipher();
//二次加密
cc=new ComplexCipher(sc);
//三次加密
ac=new AdvancedCipher(cc);
}
4、要求:某系统需要提供一个文件加密模块,加密流程包括:读源文件、加密、保存加密文件。读取文件和保存文件使用流来实现,三个业务相对独立,封装在不同的类中;现在需要提供一个统一的加密外观类,用户可以直接使用该加密外观类完成文件的读取、加密和保存三个操作。使用Facade模式来设计。
类图如下图所示。
关键代码如下
public class CipherMachine
{ //加密类
public String encrypt(String plainText)
{
return plainText;
}
}
public class FileReader
{
//读文件类
public String read(String fileSrc)
{
return fileSrc;
}
}
public class FileWriter
{ //写文件类
public void write(String encryptText,String fileNameDes)
{
System.out.println(encryptFile);
System.out.println(fileDes);
}
}
public class EncryptFacade
{ //加密外观类
private FileReader reader;
private CipherMachine cipher;
private FileWriter writer;
public EncryptFacade()
{
reader=new FileReader();
cipher=new CipherMachine();
writer=new FileWriter();
}
public void fileEncrypt(String fileSrc,String fileDes)
{
String text=reader.read(fileSrc);
String encrypt=cipher.encrypt(plainText);
writer.write(encrypt, fileDes);
}
}
5、要求:某论坛已注册用户和游客的权限不同,已注册用户拥有发帖、修改自己的注册信息等功能;游客只能看别人的帖子,没有其他权限。使用Proxy模式来设计。
类图如下图所示。
关键代码如下
public interface Permission
{
//权限借口
public void modifyUserInfo();
public void viewNote();
public void publishNote();
public void setLevel(int level);
}
public class PermissionProxy implements Permission
{
//权限代理类
private RealPermission permission=new RealPermission();
private int level=0;
public void modifyUserInfo()
{
if(0==level)
{
System.out.println("对不起,你没有该权限!");
}
else if(1==level)
{
permission.modifyUserInfo();
}
}
public void viewNote()
{
System.out.println("查看帖子!");
}
public void publishNote()
{
if(0==level)
{
System.out.println("对不起,你没有该权限!");
}
else if(1==level)
{
permission.publishNote();
}
}
public void setLevel(int level)
{
this.level=level;
}
}
public class RealPermission implements AbstractPermission
{
//具体权限类
public void modifyUserInfo()
{
System.out.println("修改用户信息!");
}
public void viewNote()
{ }
public void publishNote()
{
System.out.println("发布新帖!");
}
public void setLevel(int level)
{ }
}
public class Client
{
//客户端测试类
public static void main(String args[])
{
Permission permission;
permission=(Permission)XMLUtil.getBean();
permission.modifyUserInfo();
permission.viewNote();
permission.publishNote();
permission.modifyNote();
System.out.println("----------------------------");
permission.setLevel(1);
permission.modifyUserInfo();
permission.viewNote();
permission.publishNote();
}
}