设计模式第二次作业
1.如果需要开发一个跨平台视频播放器,可以在不同操作系统平台(如Windows、Linux、UNIX等)上播放多种格式的视频文件,常见的视频格式包括MPEG、RMVB、AVI、WMV等。使用Bridge模式来设计。
视频类
public abstract class VideoType {
private String name;
public String getName() {
return name;
}
}
抽象操作系统类
public class AbstractOS{
private VideoType videoType;
public void setVideo(VideoType videoType) {
this.videoType=videoType;
}
public VideoType getVideo() {
return this.videoType;
}
public void playVideo() {};
}
Windows类
public class Windows extends AbstractOS{
public void playVideo() {
System.out.println(getVideo().getName()+"play in Windows");
}
}
Linux类
public class Linux extends AbstractOS{
public void playVideo() {
System.out.println(getVideo().getName()+"play in Linux");
}
}
WMV类
public class WMV{
public String name="WMV";
}
AVI类
public class AVI{
public String name="AVI";
}
2.杀毒软件(AntiVirus)既能对系统中不同类型的文件 TextFile、ImageFile、VideoFile杀毒,也能对文件夹的杀毒,对文件夹杀毒就是对其中所包含文件的杀毒。使用Composite模式来设计。
文件与文件夹类
public abstract class FileAndFolder {
public void doCleanVirus() {};
}
文本文件类
public class TextFile extends FileAndFolder{
public void doCleanVirus() {
System.out.println("Clean Text!");
}
}
图片文件类
public class ImageFile extends FileAndFolder{
public void doCleanVirus() {
System.out.println("Clean Image!");
}
}
视频文件类
public class VideoFile extends FileAndFolder{
public void doCleanVirus() {
System.out.println("Clean Video!");
}
}
文件夹类
public class Folder extends FileAndFolder{
private List<FileAndFolder> fileList = new ArrayList<>();
public void doCleanVirus() {
System.out.println("Clean Folder!");
for(int i;i<fileList.size();i++) {
fileList.get(i).doCleanVirus();
}
}
public void addFile(FileAndFolder faf) {
fileList.add(faf);
}
public void remove(FileAndFolder faf) {
fileList.remove(faf);
}
public FileAndFolder getFile(int i) {
return fileList.get(i);
}
}
3.某系统提供一个数据加密功能,可以对字符串进行加密。最简单的加密算法通过对字母进行移位来实现,同时还提供稍复杂的逆向输出加密,还提供更为高级的求模加密。用户首先使用最简单的加密算法对字符串进行加密,如果觉得还不够可以对加密后的结果使用其他的加密算法进行二次加密,当然也可以进行第三次加密。使用Decrator模式来设计。
基本加密
public interface BasicEncryption {
public void encrypt();
}
移位加密
public class MoveEncryption implements BasicEncryption{
public void encrypt() {
System.out.println("MoveEncryption");
}
}
加密装饰类
public class EncryptionDecorator implements BasicEncryption{
private BasicEncryption basic;
public EncryptionDecorator(BasicEncryption basic) {
this.basic=basic;
}
public void encrypt() {
basic.encrypt();
}
}
模加密
public class ModEncryption extends EncryptionDecorator{
public BasicEncryption basic=null;
public ModEncryption(BasicEncryption basic) {
this.basic=basic;
}
public void encrypt() {
basic.encrypt();
System.out.println("ModEncryption");
}
}
逆向输出加密
public classReverseEncryption extends EncryptionDecorator{
public BasicEncryption basic=null;
public ReverseEncryption(BasicEncryption basic) {
this.basic=basic;
}
public void encrypt() {
basic.encrypt();
System.out.println("ReverseEncryption");
}
}
4.某系统需要提供一个文件加密模块,加密流程包括:读源文件、加密、保存加密文件。读取文件和保存文件使用流来实现,三个业务相对独立,封装在不同的类中;现在需要提供一个统一的加密外观类,用户可以直接使用该加密外观类完成文件的读取、加密和保存三个操作。使用Facade模式来设计。
读取文件
public class ReadFile {
public void readFile() {
System.out.println("reading a file");
}
}
加密文件
public class EncryptFile{
public void encryptFile() {
System.out.println("encrypting a file");
}
}
存储文件
public class SaveEncryptedFile{
public void saveFile() {
System.out.println("saving a file");
}
}
外观类
public class FileEncryptMod {
private ReadFile rf;
private EncryptFile ef;
private SaveEncryptedFile sf;
public FileEncryptMod() {
rf=new ReadFile();
ef=new EncryptFile();
sf=new SaveEncryptedFile();
}
public void read() {
rf.readFile();
}
public void encrypt() {
ef.encryptFile();
}
public void save() {
sf.saveFile();
}
}
用户类
public class User{
public static void main() {
FileEncryptMod mod=new FileEncryptMod();
mod.read();//读文件
mod.encrypt();//加密文件
mod.save();//保存文件
}
}
5.某论坛已注册用户和游客的权限不同,已注册用户拥有发帖、修改自己的注册信息等功能;游客只能看别人的帖子,没有其他权限。使用Proxy模式来设计。
参与者类
public interface Anticipate {
public void publication();
public void modifyInformation();
public void read();
}
普通用户类
public class NormalClient implements Anticipate {
public void publication() {
System.out.println("public");
}
public void modifyInformation() {
System.out.println("modifyInfromation");
}
public void read() {
System.out.println("read");
}
}
用户代理类
public class ClientAgent implements Anticipate{
private NormalClient normalClient;
private int authority;
public ClientAgent(NormalClient normalClient,int authority) {
this.normalClient=normalClient;
this.authority=authority;
}
public void publication() {
if(authority==1)
System.out.println("public");
else if(authority==0)
System.out.println("no authority");
}
public void modifyInformation() {
if(authority==1)
System.out.println("modifyInformation");
else if(authority==0)
System.out.println("no authority");
}
public void read() {
System.out.println("read");
}
}
测试类
public class test{
NormalClient nc=new NormalClient();
Anticipate at1=new ClientAgent(nc,1);
Anticipate at2=new ClientAgent(nc,0);
public void tx() {
at1.publication();
at1.modifyInformation();
at1.read();
at2.publication();
at2.modifyInformation();
at2.read();
}
}