1.什么是装饰者模式
动态给对象增加功能,从一个对象的外部来给对象添加功能,相当于改变了对象的外观,比用继承的方式更加的灵活。
当使用装饰后,从外部系统的角度看,就不再是原来的那个对象了,而是使用一系列的装饰器装饰过后的对象。
2.结构
角色:
3.示例
下面我们用装饰者模式实现如下的功能:更多:设计模式聚合
要求用户输入一段文字,比如 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 transformtransform = 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 transformtransform = 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 transformtransform = 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 transformtransform = 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 transformtransform = 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 transformtransform = 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:密机级顶
4.装饰者模式在jdk中的应用I/O
- //这里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));
5.优点、缺点,使用场合
优点:
1.比继承更灵活
2.复用功能更容易
3.简化高层定义
缺点:会产生较多的细粒度的对象
本质:动态组合
注意:装饰者模式只是改变组件对象的外观Facde,并没有改变其内核
使用场合:
网站题目:这是我见过最通俗易懂的装饰者模式讲解了!
文章分享:http://www.shufengxianlan.com/qtweb/news20/367820.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联