装饰模式
概述
装饰模式可以在不改变一个对象本身的基础上给对象增加额外的新行为,如一张照片,可以不改变照片本身,给它增加一个相框,使得它具有防潮功能,用户可以根据需要增加不同类型的相框
在开发中,可以通过继承使子类为父类方法添加功能,但这种方式是静态的,用户不能控制增加行为的方式和时机。
装饰模式将一个对象嵌入另一个新对象,由新对象决定是否调用嵌入对象的行为并扩展,我们称这个新对象为装饰类(Dectorator),其别名也可以称为包装器(Wrapper)
模式实例
某系统提供一个数据加密功能,可以对字符串进行加密,分别提供移位加密算法、逆向输出加密和更高级的求模加密
Cipher(抽象加密类)
public interface Cipher {
//方法为待加密字符串,返回值为加密后密文
public String encrypt(String plantTetx);
}
SimpleCipher(简单加密类)
public class SimpleCipher implements Cipher {
/*
* 以凯撒加密的方式实现加密方法
*/
@Override
public String encrypt(String plantTetx) {
String str = "";
for (int i = 0; i < plantTetx.length(); i++) {
char c = plantTetx.charAt(i);
if (c >= 'a' && c <= 'z') {
c += 6;
if (c > 'z') c -= 26;
if (c < 'a') c += 26;
}
if (c >= 'A' && c <= 'Z') {
c += 6;
if(c > 'Z') c -= 26;
if(c < 'A') c += 26;
}
str += c;
}
return str;
}
}
CipherDecorator(加密装饰类)
public class CipherDecorator implements Cipher {
private Cipher cipher;
public CipherDecorator(Cipher cipher) {
this.cipher = cipher;
}
@Override
public String encrypt(String plantTetx) {
// 调用 cipher 对象的 encrypt() 方法
return cipher.encrypt(plantTetx);
}
}
ComplexCipher(复杂加密类)
public class ComplexCipher extends CipherDecorator {
public ComplexCipher(Cipher cipher) {
super(cipher);
}
// 调用了父类的 encrypt() 方法
// 并通过新增的 reserve() 方法对加密后字符串做进一步处理
public String encrypt(String plainText) {
String result = super.encrypt(plainText);
result = reverse(result);
return result;
}
public String reverse(String text) {
String str = "";
for (int i = text.length(); i > 0; i--) {
str += text.substring(i - 1, i);
}
return str;
}
}
AdvancedCipher(高级加密类)
public class AdvancedCipher extends CipherDecorator {
public AdvancedCipher(Cipher cipher) {
super(cipher);
}
// 调用了父类的 encrypt() 方法
// 并通过新增的 mod() 方法对加密后字符串做进一步处理
@Override
public String encrypt(String plantTetx) {
String result = super.encrypt(plantTetx);
result = mod(result);
return result;
}
public String mod(String text) {
String str = "";
for (int i = 0; i < text.length(); i++) {
String c = String.valueOf(text.charAt(i) % 6);
str += c;
}
return str;
}
}
测试代码
public class Client {
public static void main(String[] args) {
String password = "sunnyLiu"; //明文
String cpassword; //密文
Cipher sc = new SimpleCipher();
cpassword = sc.encrypt(password);
System.out.println(cpassword);
System.out.println("---------------------");
Cipher cc = new ComplexCipher(sc);
cpassword = cc.encrypt(password);
System.out.println(cpassword);
System.out.println("---------------------");
//可以对装饰之后的 cc 对象继续进行装饰
//从而进一步对字符串进行处理,获得更复杂的加密结果
Cipher ac = new AdvancedCipher(cc);
cpassword = ac.encrypt(password);
System.out.println(cpassword);
System.out.println("---------------------");
}
}