zoukankan      html  css  js  c++  java
  • 设计模式第二次作业

    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();
        }
    }
    
    
  • 相关阅读:
    spring cloud 入门系列三:使用Eureka 搭建高可用服务注册中心
    spring cloud 入门系列二:使用Eureka 进行服务治理
    spring cloud 入门系列一:初识spring cloud
    Java网络编程基础(Netty预备知识)
    spring boot 系列之五:spring boot 通过devtools进行热部署
    spring boot 系列之四:spring boot 整合JPA
    spring boot 系列之三:spring boot 整合JdbcTemplate
    spring boot 系列之二:spring boot 如何修改默认端口号和contextpath
    关于window.location.href 传中文参数 乱码问题
    Ajax前台返回JSON数据后再Controller中直接转换成类型使用,后台接收json转成实体的方法
  • 原文地址:https://www.cnblogs.com/linlkg/p/7828023.html
Copyright © 2011-2022 走看看