设计模式之外观模式

原博主地址:(https://blog.csdn.net/LoveLion/article/details/17517213)
外观者模式,就是把简单任务拆分,各司其职,所以就没有写例子。

外观模式:为子系统中的一组接口提供一个统一的入口。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
不过通过这事,我把我之前写的加密进行整改,不是真的外观者模式。
加密类

package test2019.mon01.外观者模式;

import java.io.File;
import java.io.IOException;

/** 
 * Filename:  Mi.java 
 * Description: 
 * @author: guzhangyan
 * @date: 2019年1月28日 下午2:13:06 
 */
public class Mi {

	public void JiaMi(String url1, String url2) throws IOException {
		File file1 = new File(url1);
		File file2 = new File(url2);
		file2.mkdirs();
		MiMi mimi = new MiMi();
		for (File file : file1.listFiles()) {
			if (file.isFile()) {
				new MiCopy().copyFile(file, url2+ File.separator , mimi,"jia");
			}
			if (file.isDirectory()) {
				// 复制目录
				String sourceDir = url1 + File.separator + file.getName();
				new MiCopy().copyDirectiory(sourceDir, url2 + File.separator,file.getName(),mimi,"jia");
			}
		}
	}

	public void JieMi(String url1, String url2) throws IOException {
		File file1 = new File(url1);
		File file2 = new File(url2);
		file2.mkdirs();
		MiMi mimi = new MiMi();
		for (File file : file1.listFiles()) {
			if (file.isFile()) {
				new MiCopy().copyFile(file, url2+ File.separator , mimi,"jie");
			}
			if (file.isDirectory()) {
				// 复制目录
				String sourceDir = url1 + File.separator + file.getName();
				new MiCopy().copyDirectiory(sourceDir, url2 + File.separator,file.getName(),mimi,"jie");
			}
		}
	}

}

文件复制类

package test2019.mon01.外观者模式;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 
 * @author: guzhangyan
 * @date: 2019年1月28日 下午2:30:30
 */
public class MiCopy {

	public void copyFile(File file, String url, MiMi mimi,String key) throws IOException {
		String fileName = file.getName();
		if("jia".equals(key)) {
			fileName = mimi.jiaMi(fileName);
		}else if("jie".equals(key)) {
			fileName = mimi.jieMi(fileName);
		}
		File targetFile = new File(url + fileName);
		BufferedInputStream inBuff = null;
		BufferedOutputStream outBuff = null;
		try {
			// 新建文件输入流并对它进行缓冲
			inBuff = new BufferedInputStream(new FileInputStream(file));
			// 新建文件输出流并对它进行缓冲
			outBuff = new BufferedOutputStream(new FileOutputStream(targetFile));
			// 缓冲数组
			byte[] b = new byte[1024 * 5];
			int len;
			while ((len = inBuff.read(b)) != -1) {
				if("jia".equals(key)) {
					b = mimi.jiaMi(b);
				}else if("jie".equals(key)) {
					b = mimi.jieMi(b);
				}
				outBuff.write(b, 0, len);
			}
			// 刷新此缓冲的输出流
			outBuff.flush();
		} finally {
			// 关闭流
			if (inBuff != null)
				inBuff.close();
			if (outBuff != null)
				outBuff.close();
		}
	}

	public void copyDirectiory(String sourceDir, String targetDir, String fileName, MiMi mimi,String key) throws IOException {
		if("jia".equals(key)) {
			fileName = mimi.jiaMi(fileName);
		}else if("jie".equals(key)) {
			fileName = mimi.jieMi(fileName);
		}
		targetDir = targetDir + fileName;
		// 新建目标目录
		(new File(targetDir)).mkdirs();
		// 获取源文件夹当前下的文件或目录
		File[] file = (new File(sourceDir)).listFiles();
		for (int i = 0; i < file.length; i++) {
			if (file[i].isFile()) {
				// 源文件
				File sourceFile = file[i];
				// 目标文件
				this.copyFile(sourceFile, new File(targetDir).getAbsolutePath() + File.separator, mimi,key);
			}
			if (file[i].isDirectory()) {
				// 准备复制的源文件夹
				String dir1 = sourceDir + "/" + file[i].getName();
				copyDirectiory(dir1, targetDir + "/", file[i].getName(), mimi,key);
			}
		}
	}

}

加密实现类

package test2019.mon01.外观者模式;

/**
 * 
 * @author: guzhangyan
 * @date: 2018年11月20日 下午1:53:17
 */
public class MiMi {

	private int mimi = 0;

	private int key = 7;

	private int id = 0;

	public String jiaMi(String fileName) {
		id++;
		char[] names = fileName.toCharArray();
		String name = "";
		//mimi = id;
		System.out.println("jia: "+mimi);
		mimi = getMimi(mimi, key);
		for (char c : names) {
			char c2 = getCharJia(c, mimi);
			name += c2;
			mimi = getMimi(mimi, c);
			System.out.print(mimi+" ");
		}
		System.out.println();
		return toSix(id) + name;
	}

	private String toSix(int id2) {
		String str = id2 + "";
		while (str.length() < 6) {
			str = "0" + str;
		}
		return str;
	}

	public String jieMi(String fileName) {
		//mimi = Integer.parseInt(fileName.substring(0,6));
		fileName = fileName.substring(6);
		char[] names = fileName.toCharArray();
		String name = "";
		System.out.println("jie: "+mimi);
		mimi = getMimi(mimi, key);
		for (char c : names) {
			char c2 = getCharJie(c, mimi);
			name += c2;
			mimi = getMimi(mimi, c2);
			System.out.print(mimi+" ");
		}
		System.out.println();
		return name;
	}

	private char getCharJia(char c, int mimi2) {
		if (64 < c && c < 91) {
			return (char) (((c + mimi2) % 65 % 26) + 65);
		}
		if (96 < c && c < 123) {
			return (char) (((c + mimi2) % 97 % 26) + 97);
		}
		return c;
	}

	private char getCharJie(char c, int mimi2) {
		int mimi22 = 26 - mimi2;
		if (64 < c && c < 91) {
			return (char) (((c + mimi22) % 65 % 26) + 65);
		}
		if (96 < c && c < 123) {
			return (char) (((c + mimi22) % 97 % 26) + 97);
		}
		return c;
	}

	private int getMimi(int mimi2, int key2) {
		return (mimi2 + key2) % 26;
	}

	/**
	 * @param b
	 * @return
	 * @author: guzhangyan
	 * @version:2018年11月20日 下午3:39:14 方法说明
	 */
	public byte[] jiaMi(byte[] b) {
		byte[] b2 = new byte[b.length];
		mimi = getByteMimi(mimi, key);
		for (int i = 0; i < b.length; i++) {
			b2[i] = jiaMiByte(mimi, b[i]);
			mimi = getByteMimi(mimi, b[i]);
		}
		return b2;
	}

	public byte[] jieMi(byte[] b) {
		byte[] b2 = new byte[b.length];
		mimi = getByteMimi(mimi, key);
		for (int i = 0; i < b.length; i++) {
			b2[i] = jieMiByte(mimi, b[i]);
			mimi = getByteMimi(mimi, b2[i]);
		}
		return b2;
	}

	private byte jiaMiByte(int mimi2, byte b) {
		return (byte) ((mimi2 + b + 128) % 256 - 128);
	}

	private byte jieMiByte(int mimi2, byte b) {
		int mimi22 = 256 - mimi2;
		return (byte) ((mimi22 + b + 128) % 256 - 128);
	}

	private int getByteMimi(int mimi2, int key2) {
		return (mimi2 + key2) % 256;
	}

}

测试类

package test2019.mon01.外观者模式;

import java.io.IOException;

/**
 * 
 * @author: guzhangyan
 * @date: 2019年1月28日 下午2:10:33
 */
public class Test {

	public static void main(String[] args) throws IOException {
		// 源文件夹
		String url1 = "E:\\downloads\\zhixin\\hxc";
		// 目标文件夹
		String url2 = "E:\\downloads\\zhixin\\hxc-copy";
		
		new Mi().JiaMi(url1,url2);
		
		String url3 = "E:\\downloads\\zhixin\\hxc-copy2";
		
		new Mi().JieMi(url2,url3);
	}
}

现在该方法有个问题,就是解密后的文件名首字母会错,思考不出来,如有大神发现问题所在,欢迎评论。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值