您的位置:首页 > 其它

设计模式第二次作业

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



代码:

public class client {
public static void main(String[] args) {
player myplayer = new player();
playerImpl play = new AVI();
myplayer.setplayerImpl(play);
myplayer.play("play the video");
}
}

//Abstraction 定义抽象类接口
public abstract class player {
protected playerImpl play;
public void setplayerImpl(playerImpl play)
{
this.play=play;
}
public  abstract void play(String fileName);
}

//implementor 抽象实现类接口
public interface playerImpl {
public void playImpl(String type, String fileName);
}

//RefineAbstraction 扩充由Abstraction定义的接口
public class windows extends player{
public void play(String fileName) {
String type = "Windows播放";
this.play.playImpl(type,fileName);
}
}

//Concretelmplementor具体实现类
public class AVI implements playerImpl{
@Override
public void playImpl(String type, String fileName) {
System.out.println("windows播放AVI");
}
}

2、要求:杀毒软件(AntiVirus)既能对系统中不同类型的文件 TextFile、ImageFile、VideoFile杀毒,也能对文件夹的杀毒,对文件夹杀毒就是对其中所包含文件的杀毒。使用Composite模式来设计。
类图:



代码:

//通过Component接口组合部件的对象
public class client {
public static void main(String[] args) {
AntiVirus text=new TextFile();
text.KillAntVirus();
AntiVirus folder=new Folder();
((FolderFile) folder).add(new TextFile());
((FolderFile) folder).add(new VideoFile());
((FolderFile) folder).add(new ImageFile());
folder.KillAntVirus();
}
}

//Component声明接口
public abstract class AntiVirus {
public abstract void KillAntVirus();
}

//Leaf叶节点对象
public class TextFile extends AntiVirus{
@Override
public void KillAntVirus() {
System.out.println("杀死TextFile类型文件");
}
}

//Composite有子部件的部件
public class Folder extends AntiVirus{
public void addFile(AntiVirus av)
{
list.add(av);
}

public void removeFile(AntiVirus av)
{
list.remove(av);
}

private ArrayList list=new ArrayList<>();
public void KillAntVirus() {
for(int i = 0 ; i < list.size() ; i++) {
((AntiVirus) list.get(i)).KillAntVirus();
}
}
}

3、要求:某系统提供一个数据加密功能,可以对字符串进行加密。最简单的加密算法通过对字母进行移位来实现,同时还提供稍复杂的逆向输出加密,还提供更为高级的求模加密。用户首先使用最简单的加密算法对字符串进行加密,如果觉得还不够可以对加密后的结果使用其他的加密算法进行二次加密,当然也可以进行第三次加密。使用Decrator模式来设计。
类图:



代码:

public class client {
public static void main(String[] args) {
String str = "今天八点开会";

Encryption simpleEncry = new shiftEncryption();

Encryption revEncry = new reverseEncryDecrator(simpleEncry);

Encryption modEncry = new moduloEncryDecrator(simpleEncry);

simpleEncry.encryString(str);

revEncry.encryString(str);//简单加密

revEncry.reverseString(str);//二次逆向输出加密
}
}

//数据加密接口
public abstract class Encryption{
public abstract String encryString(String str);
}

//简单移位加密
public class shiftEncryption extends Encryption{
@Override
public String encryptStr(String  str) {
char[] froms=str.toCharArray();
int length = froms.length;
for(int i=0;i<length/2;i++){
char temp = froms[i];
froms[i] = froms[length - 1 -i];
froms[length - 1 -i] = temp;
}
return String.valueOf(froms);
}
}

//稍复杂加密运算接口
public class EncryDecrator extends Encryption{
private Encryption encrypt;

public EncryDecrator(Encryption encrypt){
this.encrypt = encrypt;
}

@Override
public String encryptStr(String str) {
return encrypt.encryString(str);
}
}

//逆向输出加密
public class reverseEncryDecrator extends EncryDecrator{
public reverseEncryDecrator(Encryption encrypt) {
super(encrypt);
}
@Override
public String encryString(String str) {
return this.reverseString(super.encryString(str));
}
private String reverseString(String str) {
StringBuffer sbf=new StringBuffer(str);
sbf=sbf.reverse();//字符串的翻转
return sbf.toString();
}

}

4、要求:某系统需要提供一个文件加密模块,加密流程包括:读源文件、加密、保存加密文件。读取文件和保存文件使用流来实现,三个业务相对独立,封装在不同的类中;现在需要提供一个统一的加密外观类,用户可以直接使用该加密外观类完成文件的读取、加密和保存三个操作。使用Facade模式来设计。
类图:



代码:

public class client {
public static void main(String[] args) {
private FileEncrypt fileEncrypt;

fileEncrypt = new FileEncrypt();
fileEncrypt.encryFile();
}
}

//Facade 所有请求委派的接口
public abstract class FileEncrypt{
private ReadFile fileReader = new ReadFile();
private Encryption encryption = new Encryption();
private SaveFile fileSaver = new SaveFile();

public void encryFile(){
fileReader.readFile();
encryption.encryption();
fileSaver.saveFile();
}
}

//SubSystemA 读取文件操作
public class ReadFile extends FileEncrypt{
public void readFile(){
System.out.println("reading");
}
}

//SubSystemB 加密文件操作
public class Encryption extends FileEncrypt{
public void encryption(){
System.out.println("encryption");
}
}

//SubSystemC 保存文件操作
public class SaveFile extends FileEncrypt{
public void saveFile(){
System.out.println("saving");
}
}

5、要求:某论坛已注册用户和游客的权限不同,已注册用户拥有发帖、修改自己的注册信息等功能;游客只能看别人的帖子,没有其他权限。使用Proxy模式来设计。
类图:



代码:

public abstract class ForumUser {
public abstract void modifyUserinfo();
public abstract void modifyPost();
public abstract void Post();
public abstract void ReadPost();
}

//Proxy 代理类
public class Proxy extends ForumUser{
private User user;
private int userType;
public Proxy(User user){
this.user=user;
this.userType=user.getUserType();//1代表注册用户,0代表游客
}
public void modifyUserinfo(){
if(this.userType==1)
user.modifyUserinfo();
else if(this.userType==0)
System.out.println("没有权限");
}
public void modifyPost(){
if(this.userType==1)
user.modifyPost();
else if(this.userType==0)
System.out.println("没有权限");
}
public void Post(){
if(this.userType==1)
user.Post();
else if(this.userType==0)
System.out.println("没有权限");
}
public void ReadPost(){
user.ReadPost();
}
}

//RealSubject 真实实体类
public class User extends ForumUser{
private String userType;
public void setUserType(Interger type){
this.userType=type;
}
public void modifyUserinfo(){
System.out.println("修改用户个人信息");
}
public void modifyPost(){
System.out.println("修改个人贴子");
}
public void Post(){
System.out.println("发布贴子");
}
public void ReadPost(){
System.out.println("浏览贴子");
}
}

//用户调用
public class Tourist{
public static void main(String[] args) {
User userA=new User();
User userB=new User();
userA.setuserType(0);// 0代表游客
userB.setuserType(1);//1代表注册用户
Proxy proxyA=Proxy(userA);//游客代理
Proxy proxyB=Proxy(userB);//注册用户代理
proxyA.modifyUserinfo();
proxyB.modifyPost();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: