设计模式第二次作业

本文介绍五种常见软件设计模式的实际应用案例,包括Bridge模式用于跨平台视频播放器、Composite模式用于杀毒软件、Decorator模式用于数据加密功能、Facade模式用于文件加密模块以及Proxy模式用于论坛用户权限管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.如果需要开发一个跨平台视频播放器,可以在不同操作系统平台(如Windows、Linux、UNIX等)上播放多种格式的视频文件,常见的视频格式包括MPEG、RMVB、AVI、WMV等。使用Bridge模式来设计。

1249115-20171112145431184-1741932404.png
视频类

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模式来设计。

1249115-20171112152908513-55171190.png
文件与文件夹类

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模式来设计。

1249115-20171112155546278-2025745149.png
基本加密

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模式来设计。

1249115-20171112163452684-1565492882.png

读取文件

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模式来设计。

1249115-20171112165914044-1143868593.png
参与者类

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();
    }
}

转载于:https://www.cnblogs.com/xiezhe1204/p/7821744.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值