设为首页 加入收藏

TOP

装饰者模式 Decoration(一)
2017-10-13 10:40:47 】 浏览:5964
Tags:装饰 模式 Decoration

1.什么是装饰者模式

      动态给对象增加功能,从一个对象的外部来给对象添加功能,相当于改变了对象的外观,比用继承的方式更加的灵活。当使用装饰后,从外部系统的角度看,就不再是原来的那个对象了,而是使用一系列的装饰器装饰过后的对象。

2.结构

                                                                            

    角色:
    Component:组件对象的抽象接口,可以给这些对象动态的增加职责/功能。
    ConcreteComponent:具体的组件的对象,实现组件对象的接口,是被装饰器装饰的原始对象,即可以给这个对象动态的添加职责。
    Decorator:所有装饰器的抽象父类,实现了组件对象的接口,并且持有一个组件对象(被装饰的对象)。
    ConcreteDecorator:具体的装饰器,具体实现向装饰对象添加功能。

3.示例

   下面我们用装饰者模式实现如下的功能:
    要求用户输入一段文字,比如 Hello Me,然后屏幕输出几个选项
    1 :加密
    2 :反转字符串
    3:转成大写

    4:转成小写
    5:扩展或者剪裁到10个字符,不足部分用!补充
    6:用户输入 任意组合,比如 1,3 表示先执行1的逻辑,再执行3的逻辑
    根据用户输入的选择,进行处理后,输出结果

 

//组件对象的接口
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
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇文档对象模型DOM通俗讲解 下一篇PHP设计模式(五)建造者模式(Bu..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目