设计模式 - 装饰模式

一、概念

装饰模式(Decorator Pattern):动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活。装饰模式是一种对象结构型模式。

 

二、代码实例

题目(该题目引用刘伟的博客,对此表示感谢!):

  Sunny软件公司欲开发了一个数据加密模块,可以对字符串进行加密。最简单的加密算法通过对字母进行移位来实现,同时还提供了稍复杂的逆向输出加密,还提供了更为高 级的求模加密。用户先使用最简单的加密算法对字符串进行加密,如果觉得还不够可以对加密之后的结果使用其他加密算法进行二次加密,当然也可以进行第三次加 密。试使用装饰模式设计该多重加密系统。

 

使用装饰模式简单代码实现:

类图:

2.1 抽象构件类

/**
 * 抽象构件类<br>
 * 加密字符串抽象类
 *
 */
public abstract class StrEncrypt {
    
    /**
     * 加密字符串
     * 
     * @param str 需要加密的字符串
     * @return String 加密后的字符串
     */
    public abstract String encryptStr(String str);

}

2.2 具体构件类

/**
 * 具体构件类<br>
 * 加密字符串实现类
 *
 */
public class StrEncryptOperate extends StrEncrypt {

    @Override
    public String encryptStr(String str) {
        String encrypt = "**" + str + "**";
        return encrypt;
    }

}

2.3 抽象装饰类

/**
 * 抽象装饰类<br>
 * 加密字符串抽象装饰类
 *
 */
public class StrEncryptDecorator extends StrEncrypt {
    
    private StrEncrypt strEncrypt;
    
    public StrEncryptDecorator(StrEncrypt strEncrypt){
        this.strEncrypt = strEncrypt;
    }

    @Override
    public String encryptStr(String str) {
        return strEncrypt.encryptStr(str);
    }

}

2.4 具体装饰类 - 逆向加密字符串

/**
 * 具体装饰类<br>
 * 逆向加密字符串实现类
 *
 */
public class ReverseEncryptDecorator extends StrEncryptDecorator {

    public ReverseEncryptDecorator(StrEncrypt strEncrypt) {
        super(strEncrypt);
    }
    
    @Override
    public String encryptStr(String str) {    
        return this.reverseStr(super.encryptStr(str));
    }
    
    /**
     * 逆向加密字符串
     * 
     * @param str 需要加密的字符串
     * @return String 加密后的字符串
     */
    public String reverseStr(String str){
        String encrypt = "$$" + str + "$$";
        return encrypt;
    }

}

2.5 具体装饰类 - 高级加密字符串

/**
 * 具体装饰类<br>
 * 高级加密字符串实现类
 *
 */
public class AdvanceEncryptDecorator extends StrEncryptDecorator {

    public AdvanceEncryptDecorator(StrEncrypt strEncrypt) {
        super(strEncrypt);
    }
    
    @Override
    public String encryptStr(String str) {    
        return this.advanceStr(super.encryptStr(str));
    }
    
    /**
     * 高级加密字符串
     * 
     * @param str 需要加密的字符串
     * @return String 加密后的字符串
     */
    public String advanceStr(String str){
        String encrypt = "&&" + str + "&&";
        return encrypt;
    }

}

2.6 测试

public class Test {
    
    public static void main(String[] args) {
        
        String str = "aa";
        
        //加密字符串
        StrEncrypt strEncrypt = new StrEncryptOperate();
        
        //逆向加密
        StrEncrypt reverse = new ReverseEncryptDecorator(strEncrypt);
        //高级加密
        StrEncrypt advance = new AdvanceEncryptDecorator(reverse);
        
        System.out.println(advance.encryptStr(str));
        
    }

}

执行结果:&&$$**aa**$$&&

 

三、注意

本文引用如下网站内容,在此表示感谢!

URL: http://blog.csdn.net/lovelion/article/details/7425873

   

posted @ 2016-05-27 17:20  wuq126  阅读(1662)  评论(0编辑  收藏  举报