设计模式第二次作业
1、要求:如果需要开发一个跨平台视频播放器,可以在不同操作系统平台(如Windows、Linux、UNIX等)上播放多种格式的视频文件,常见的视频格式包括MPEG、RMVB、AVI、WMV等。使用Bridge模式来设计。
类图如下:
主要代码如下:
public abstract class Operationplatform{
public abstract void playvideo();
}
public class Windowsplatform extends Operationplatform{
public void playvideo(){};
}
public class Linuxplatform extends Operationplatform{
public void playvideo(){};
}
public class Unixplatform extends Operationplatform{
public void playvideo(){};
}
public abstract class VideoFile{
public Operationplatform opf;
public void play(){
opf.playvideo();
}
}
public class MPEG extends VideoFile {
public void play () {
opf.playvideo();
}
}
public class RMVB extends VideoFile {
public void play () {
opf.playvideo();
}
}
public class AVI extends VideoFile {
public void play () {
opf.playvideo();
}
}
public class WMV extends VideoFile {
public void play () {
opf.playvideo();
}
}
public class Client {
public static void main(String[] args) {
VideoFile VF = new MPEG();
VF.opf = new Windowsplatform;
VF.play();
}
}
2、要求:杀毒软件(AntiVirus)既能对系统中不同类型的文件 TextFile、ImageFile、VideoFile杀毒,也能对文件夹的杀毒,对文件夹杀毒就是对其中所包含文件的杀毒。使用Composite模式来设计。
类图如下:
代码如下:
public abstract class MyElement{
public abstract void killvirus();
}
public class TextFile extends MyElement{
public void killvirus(){
System.out.println("对text文件进行杀毒");
}
}
public class ImageFile extends MyElement{
public void killvirus(){
System.out.println("对image文件进行杀毒");
}
}
public class VideoFile extends MyElement{
public void killvirus(){
System.out.println("对video文件进行杀毒");
}
}
public class File extends MyElement{
private ArrayList list = new ArrayList();
public void add(MyElement element){
list.add(element);
}
public void remove(MyElement element){
list.remove(element);
}
public void killvirus(){
for(Object object:list){
((MyElement).object).killvirus();
}
}
}
3、要求:某系统提供一个数据加密功能,可以对字符串进行加密。最简单的加密算法通过对字母进行移位来实现,同时还提供稍复杂的逆向输出加密,还提供更为高级的求模加密。用户首先使用最简单的加密算法对字符串进行加密,如果觉得还不够可以对加密后的结果使用其他的加密算法进行二次加密,当然也可以进行第三次加密。使用Decrator模式来设计。
类图如下:
代码如下:
public abstract class EncryptComponent {
abstract String encrypt(String str);
}
public class OriginalEncrypt extends EncryptComponent {
@Override
String encrypt(String str) {
System.out.println("对字符串 \'"+str+"\' 使用原始加密 =====> 原始加密结果");
String encryptStr = "原始加密结果";
return encryptStr;
}
}
public class EncryptDecorator extends EncryptComponent {
EncryptComponent encryptComponent;
public EncryptDecorator(EncryptComponent encryptComponent) {
this.encryptComponent = encryptComponent;
}
@Override
String encrypt(String str) {
return encryptComponent.encrypt(str);
}
}
public class OtherAEncrypt extends EncryptDecorator {
public OtherAEncrypt(EncryptComponent encryptComponent) {
super(encryptComponent);
}
@Override
String encrypt(String str) {
return otherAEncrypt(super.encrypt(str));
}
public String otherAEncrypt(String str){
System.out.println("对字符串 \'"+str+"\' 使用OtherA加密 =====> OtherA加密结果");
return "OtherA 加密结果";
}
}
public class Client {
public static void main(String[] args) {
EncryptComponent originalEncrypt, otherAEncrypt, otherBEncrypt;
String result;
originalEncrypt = new OriginalEncrypt();
result = originalEncrypt.encrypt("初始数据");
System.out.println("-----------------------------------------------");
otherAEncrypt = new OtherAEncrypt(originalEncrypt);
result = otherAEncrypt.encrypt("初始数据");
System.out.println("-----------------------------------------------");
otherBEncrypt = new OtherBEncrypt(originalEncrypt);
result = otherBEncrypt.encrypt("初始数据");
System.out.println("-----------------------------------------------");
otherBEncrypt = new OtherBEncrypt(otherAEncrypt);
result = otherBEncrypt.encrypt("初始数据");
System.out.println("-----------------------------------------------");
}
}
4、要求:某系统需要提供一个文件加密模块,加密流程包括:读源文件、加密、保存加密文件。读取文件和保存文件使用流来实现,三个业务相对独立,封装在不同的类中;现在需要提供一个统一的加密外观类,用户可以直接使用该加密外观类完成文件的读取、加密和保存三个操作。使用Facade模式来设计。
类图如下:
代码如下:
public class readfile{
public void read(){}
}
public class codefile{
public void code(){}
}
public class savefile{
public void save(){}
}
public class codeFacade{
private readfile rf = readfile();
private codefile cf = codefile();
private savefile sf = savefile():
public void jiami(){
rf.read();
cf.code();
sf.save():
}
}
5、要求:某论坛已注册用户和游客的权限不同,已注册用户拥有发帖、修改自己的注册信息等功能;游客只能看别人的帖子,没有其他权限。使用Proxy模式来设计。
类图如下:
代码如下:
public interface AbstractPermission {
public void modifyUserInfo();
public void viewNote();
public void publishNote();
public void modifyNote();
public void setLevel(int level);
}
public class RealPermission implements AbstractPermission {
public void modifyUserInfo() {
System.out.println("修改用户信息");
}
public void viewNote() {
}
public void publishNote() {
System.out.println("发布新帖");
}
public void modifyNote() {
System.out.println("修改帖子");
}
public void setLevel(int level) {
}
}
public class PermissionProxy implements AbstractPermission {
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 modifyNote() {
if (0 == level) {
System.out.println("对不起,你没有权限");
}
else if (1 == level) {
permission.modifyNote();
}
}
public void setLevel(int level) {
this.level = level;
}
}