设计模式第二次作业
GitHub地址:https://github.com/zlxzlxzlx/DesignPattern2
要求:如果需要开发一个跨平台视频播放器,可以在不同操作系统平台(如Windows、Linux、UNIX等)上播放多种格式的视频文件,常见的视频格式包括MPEG、RMVB、AVI、WMV等。使用Bridge模式来设计。
类图:
关键类java源码及注释:
public abstract class abstructVideoPlayer {
protected VideoFile vf;
public void setVideoFile( VideoFile vf)
{
this.vf=vf;
}
public abstract void play(String file);
}
public interface VideoFile {
public void decode(String file);
}
public class windows extends abstructVideoPlayer{
public void play(String file) {
this.vf.decode(file);
}
}
public class AVI implements VideoFile{
@Override
public void decode( String file) {
// TODO Auto-generated method stub
System.out.println(file);
}
}
public class client {
public static void main(String[] args) {
// TODO Auto-generated method stub
VideoFile vf;
abstructVideoPlayer avp = new windows();
vf = new AVI();
avp.setVideoFile(vf);
avp.play("AVI");
}
}
输出结果
AVI
要求:杀毒软件(AntiVirus)既能对系统中不同类型的文件 TextFile、ImageFile、VideoFile杀毒,也能对文件夹的杀毒,对文件夹杀毒就是对其中所包含文件的杀毒。使用Composite模式来设计。
类图:
关键类java源码及注释:
public abstract class AntiVirus {
public abstract void KillVirus();
}
import java.util.ArrayList;
public class FolderFile extends AntiVirus{
private ArrayList list=new ArrayList<>();
public void add(AntiVirus av)
{
list.add(av);
}
public void remove(AntiVirus av)
{
list.remove(av);
}
@Override
public void KillVirus() {
// TODO Auto-generated method stub
for(Object obj : list)
{
((AntiVirus)obj).KillVirus();
}
}
}
public class TextFile extends AntiVirus{
@Override
public void KillVirus() {
// TODO Auto-generated method stub
System.out.println("杀死TextFile类型文件");
}
}
public class VideoFile extends AntiVirus{
@Override
public void KillVirus() {
// TODO Auto-generated method stub
System.out.println("杀死VideoFile类型文件");
}
}
public class client {
private static final String AntiVirus = null;
public static void main(String[] args) {
// TODO Auto-generated method stub
AntiVirus text=new TextFile();
text.KillVirus();
AntiVirus video=new VideoFile();
video.KillVirus();
AntiVirus folder=new FolderFile();
((FolderFile) folder).add(new TextFile());
((FolderFile) folder).add(new VideoFile());
folder.KillVirus();
}
}
输出结果
杀死TextFile类型文件
杀死VideoFile类型文件
杀死TextFile类型文件
杀死VideoFile类型文件
要求:某系统提供一个数据加密功能,可以对字符串进行加密。最简单的加密算法通过对字母进行移位来实现,同时还提供稍复杂的逆向输出加密,还提供更为高级的求模加密。用户首先使用最简单的加密算法对字符串进行加密,如果觉得还不够可以对加密后的结果使用其他的加密算法进行二次加密,当然也可以进行第三次加密。使用Decrator模式来设计。
类图:
关键类java源码及注释:
import Bridge.abstructVideoPlayer;
public abstract class Encrypt {
public abstract String encryptStr(String encrypt);
}
public class EncryptDecrator extends Encrypt{
private Encrypt encrypt;
public EncryptDecrator(Encrypt encrypt){
this.encrypt = encrypt;
}
@Override
public String encryptStr(String str) {
// TODO Auto-generated method stub
return encrypt.encryptStr(str);
}
}
import java.util.Scanner;
public class sinpleEncrypt extends Encrypt{
@Override
public String encryptStr(String str) {
// TODO Auto-generated method stub
String encrypt=str+str;
return encrypt;
}
}
public class ReverseEncryptDecrator extends EncryptDecrator{
public ReverseEncryptDecrator(Encrypt encrypt) {
super(encrypt);
}
@Override
public String encryptStr(String str) {
return this.reverseStr(str);
}
private String reverseStr(String str) {
StringBuffer sb=new StringBuffer(str);
sb=sb.reverse();//字符串的翻转
return sb.toString();
}
}
import java.awt.Dialog.ModalExclusionType;
public class AdvanceEncryptDecrator extends EncryptDecrator{
public AdvanceEncryptDecrator(Encrypt encrypt) {
super(encrypt);
}
@Override
public String encryptStr(String str) {
return this.advanceStr(str);
}
private String advanceStr(String str) {
String string=str+"我是高级加密";
return string;
}
}
public class client {
public static void main(String[] args) {
String str = "abcdefg";
Encrypt strEncrypt = new sinpleEncrypt();
Encrypt reverse = new ReverseEncryptDecrator(strEncrypt);
Encrypt advance = new AdvanceEncryptDecrator(reverse);
System.out.println(advance.encryptStr(reverse.encryptStr(strEncrypt.encryptStr(str))));
}
}
输出结果
gfedcbagfedcba我是高级加密
要求:某系统需要提供一个文件加密模块,加密流程包括:读源文件、加密、保存加密文件。读取文件和保存文件使用流来实现,三个业务相对独立,封装在不同的类中;现在需要提供一个统一的加密外观类,用户可以直接使用该加密外观类完成文件的读取、加密和保存三个操作。使用Facade模式来设计。
类图:
关键类java源码及注释:
public class EncryptFacade {
private FileReader reader;
private FileEncrypt encrypt;
private FileWriter writer;
public EncryptFacade(){
reader=new FileReader();
writer=new FileWriter();
encrypt=new FileEncrypt();
}
public void fileEncrypt(){
reader.read();
writer.write();
encrypt.encrypt();
}
}
public class FileEncrypt {
public void encrypt(){
System.out.println("encrypt the file");
}
}
public class FileReader {
public void read(){
System.out.println("read the file");
}
}
public class FileWriter {
public void write(){
System.out.println("write the file");
}
}
public class client {
public static void main(String[] args) {
EncryptFacade ec=new EncryptFacade();
ec.fileEncrypt();
}
}
输出结果
read the file
write the file
encrypt the file
要求:某论坛已注册用户和游客的权限不同,已注册用户拥有发帖、修改自己的注册信息等功能;游客只能看别人的帖子,没有其他权限。使用Proxy模式来设计。
类图:
关键类java源码及注释:
public interface AbstructUser {
public void modifyUserInfo();
public void pulishNote();
public void viewNote();
}
public class AgentUser implements AbstructUser{
private OrdinaryUser ordinaryUser;
public AgentUser(OrdinaryUser ordinaryUser){
this.ordinaryUser=ordinaryUser;
}
@Override
public void modifyUserInfo() {
if (0 == ordinaryUser.getLevel()) {
System.out.println("对不起,你没有权限");
}
else if (1 == ordinaryUser.getLevel()) {
ordinaryUser.modifyUserInfo();
}
}
@Override
public void pulishNote() {
if (0 == ordinaryUser.getLevel()) {
System.out.println("对不起,你没有权限");
}
else if (1 == ordinaryUser.getLevel()) {
ordinaryUser.pulishNote();
}
}
@Override
public void viewNote() {
System.out.println("viewNote");
}
}
public class OrdinaryUser implements AbstructUser{
private int level;
public OrdinaryUser(int level){
this.level=level;
}
@Override
public void modifyUserInfo() {
System.out.println("modifyUserInfo");
}
@Override
public void pulishNote() {
System.out.println("pulishNote");
}
@Override
public void viewNote() {
System.out.println("viewNote");
}
public int getLevel(){
return this.level;
}
}
public class client {
public static void main(String[] args) {
OrdinaryUser ou1=new OrdinaryUser(0);
OrdinaryUser ou2=new OrdinaryUser(1);
AbstructUser au1=new AgentUser(ou1);
AbstructUser au2=new AgentUser(ou2);
au1.modifyUserInfo();
au1.pulishNote();
au1.viewNote();
au2.modifyUserInfo();
au2.pulishNote();
au2.viewNote();
}
}
输出结果
modifyUserInfo
pulishNote
viewNote
对不起,你没有权限
对不起,你没有权限
viewNote