角色:
下面我们用装饰者模式实现如下的功能:更多:设计模式聚合
要求用户输入一段文字,比如 Hello Me,然后屏幕输出几个选项
//组件对象的接口
public interface ICompoment {
String display(String str);
}
//具体的组件对象
public class DetailCompoment implements ICompoment {
@Override
public String display(String str) {
System.out.println("原来内容:"+str);
return str;
}
}
//所有装饰器的父类,实现了组件接口
public abstract class Decorator implements ICompoment{
//持有了一个组件对象
protected ICompoment compoment;
public Decorator(ICompoment compoment) {
this.compoment = compoment;
}
@Override
public String display(String str) {
return compoment.display(str);
}
//对组件对象进行装饰的抽象方法
public abstract String transform(String str);
}
//加密、解密工具类
public class EnDecodeUtil {
private static final char password='a';
public static String encodeDecode(String str){
char[] chars = str.toCharArray();
for (int i = 0; i < chars.length; i++) {
chars[i] = (char) (chars[i] ^ password);
}
return new String(chars);
}
}
//加密装饰器
public class EncodeDecorator extends Decorator {
public EncodeDecorator(ICompoment compoment) {
super(compoment);
}
@Override
public String display(String str) {
String display = super.display(str);
return transform(display);
}
@Override
public String transform(String str) {
System.out.println("invoke EncodeDecorator....");
return EnDecodeUtil.encodeDecode(str);
}
}
//解密装饰器
public class DecodeDecorator extends Decorator {
public DecodeDecorator(ICompoment compoment) {
super(compoment);
}
@Override
public String display(String str) {
String display = super.display(str);
return transform(display);
}
@Override
public String transform(String str) {
System.out.println("invoke DecodeDecorator...");
return EnDecodeUtil.encodeDecode(str);
}
}
//反转 装饰器
public class ReverseDecorator extends Decorator {
public ReverseDecorator(ICompoment compoment) {
super(compoment);
}
@Override
public String display(String str) {
String display = super.display(str);
String transform = transform(display);
return transform;
}
@Override
public String transform(String str) {
System.out.println("invoke ReverseDecorator....");
StringBuilder sb = new StringBuilder(str);
return sb.reverse().toString();
}
}
//转为大写的装饰器
public class UpperDecorator extends Decorator {
public UpperDecorator(ICompoment compoment) {
super(compoment);
}
@Override
public String display(String str) {
String display = super.display(str);
String transform = transform(display);
return transform;
}
@Override
public String transform(String str) {
System.out.println("invoke UpperDecorator....");
return str.toUpperCase();
}
}
//转为大写的装饰器
public class UpperDecorator extends Decorator {
public UpperDecorator(ICompoment compoment) {
super(compoment);
}
@Override
public String display(String str) {
String display = super.display(str);
String transform = transform(display);
return transform;
}
@Override
public String transform(String str) {
System.out.println("invoke UpperDecorator....");
return str.toUpperCase();
}
}
//转为小写的装饰器
public class LowerDecorator extends Decorator{
public LowerDecorator(ICompoment compoment) {
super(compoment);
}
@Override
public String display(String str) {
String display = super.display(str);
String transform = transform(display);
return transform;
}
@Override
public String transform(String str) {
System.out.println("invoke lowerDecorator....");
return str.toLowerCase();
}
}
//裁剪、扩充装饰器
public class ExtendOrSplitDecorator extends Decorator {
public ExtendOrSplitDecorator(ICompoment compoment) {
super(compoment);
}
@Override
public String display(String str) {
String display = super.display(str);
String transform = transform(display);
return transform;
}
@Override
public String transform(String str) {
System.out.println("invoke ExtendOrSplitDecorator....");
if (str != null) {
if (str.length() > 10) {
return str.substring(0,10);
}else{
int repeatCount = 10 -str.length();
StringBuilder sb = new StringBuilder(str);
for (int i = 0; i < repeatCount; i++) {
sb.append("!");
}
return sb.toString();
}
}
return null;
}
}
//裁剪、扩充装饰器
public class ExtendOrSplitDecorator extends Decorator {
public ExtendOrSplitDecorator(ICompoment compoment) {
super(compoment);
}
@Override
public String display(String str) {
String display = super.display(str);
String transform = transform(display);
return transform;
}
@Override
public String transform(String str) {
System.out.println("invoke ExtendOrSplitDecorator....");
if (str != null) {
if (str.length() > 10) {
return str.substring(0,10);
}else{
int repeatCount = 10 -str.length();
StringBuilder sb = new StringBuilder(str);
for (int i = 0; i < repeatCount; i++) {
sb.append("!");
}
return sb.toString();
}
}
return null;
}
}
//测试代码
public static void main(String[] args) {
//将输入内容转为大写,再反转
ReverseDecorator reverseDecorator = new ReverseDecorator(new UpperDecorator(new DetailCompoment()));
String display = reverseDecorator.display("wo shi zhongguo ren.");
System.out.println(display);
//将输入内容转为小写,在裁剪或者扩展
ExtendOrSplitDecorator decorator = new ExtendOrSplitDecorator(new LowerDecorator(new DetailCompoment()));
String display1 = decorator.display("I Love");
System.out.println(display1);
//将输入内容转为小写,再反转,然后加密
EncodeDecorator decorator1 = new EncodeDecorator(new ReverseDecorator(new LowerDecorator(new DetailCompoment())));
String display2 = decorator1.display("顶级机密:1941年12月 日本偷袭珍珠港! 银行密码是:1234ADC");
System.out.println(display2);
System.out.println("++++++++++");
//将输入内容先反转、再转为小写,然后加密
EncodeDecorator decorator2 = new EncodeDecorator(new LowerDecorator(new ReverseDecorator(new DetailCompoment())));
String display3 = decorator2.display("顶级机密:1941年12月 日本偷袭珍珠港! 银行密码是:1234ADC");
System.out.println(display3);
System.out.println("============");
//对上面的加密内容,进行解密
DecodeDecorator decodeDecorator = new DecodeDecorator(decorator1);
String display4 = decodeDecorator.display("顶级机密:1941年12月 日本偷袭珍珠港! 银行密码是:1234ADC");
System.out.println(display4);
}
控制台输出:
原来内容:wo shi zhongguo ren.
invoke UpperDecorator....
invoke ReverseDecorator....
.NER OUGGNOHZ IHS OW
原来内容:I Love
invoke lowerDecorator....
invoke ExtendOrSplitDecorator....
i love!!!!
原来内容:顶级机密:1941年12月 日本偷袭珍珠港! 银行密码是:1234ADC
invoke lowerDecorator....
invoke ReverseDecorator....
invoke EncodeDecorator....
URSP[晎硠宧蠭钗A⦆湎玁玬裌倖杍斄A杩SP帕PUXPサ宧杛细頗
++++++++++
原来内容:顶级机密:1941年12月 日本偷袭珍珠港! 银行密码是:1234ADC
invoke ReverseDecorator....
invoke lowerDecorator....
invoke EncodeDecorator....
URSP[晎硠宧蠭钗A⦆湎玁玬裌倖杍斄A杩SP帕PUXPサ宧杛细頗
============
原来内容:顶级机密:1941年12月 日本偷袭珍珠港! 银行密码是:1234ADC
invoke lowerDecorator....
invoke ReverseDecorator....
invoke EncodeDecorator....
invoke DecodeDecorator...
cda4321:是码密行银 !港珠珍袭偷本日 月21年1491:密机级顶
//这里FileInputStream 相当于组件对象,BufferedInputStream这个装饰器装饰了FileInputStream对象
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File("fileName")));
byte[] buff = new byte[1024];
bis.read(buff);
System.out.println(new String(buff));
1.比继承更灵活
2.复用功能更容易
3.简化高层定义
缺点:会产生较多的细粒度的对象
本质:动态组合
注意:装饰者模式只是改变组件对象的外观Facde,并没有改变其内核
使用场合:
琐碎时间想看一些技术文章,可以去公众号菜单栏翻一翻我分类好的内容,应该对部分童鞋有帮助。同时看的过程中发现问题欢迎留言指出,不胜感谢~。另外,有想多了解哪些方面内容的可以留言(什么时候,哪篇文章下留言都行),附菜单栏截图(PS:很多人不知道公众号菜单栏是什么)
如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!
加入交流群
请使用微信扫一扫!