装饰者模式与IO流的应用

本文详细介绍了装饰者模式的概念、工作原理及其与Java IO流的关系。通过加密工具类的需求,展示了如何使用装饰者模式避免类爆炸问题,实现更灵活的功能扩展。同时,通过实际代码示例解释了装饰者模式在IO流中的应用,帮助读者更好地理解和运用装饰者模式。
摘要由CSDN通过智能技术生成

装饰者模式

定义

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

通俗解释

上面的定义在网上是随处可见的描述,怎么解释呢。比如:我前几天和女朋友去买戒指,珠宝店的销售给我推荐了一种自由搭配的原创戒指。他跟我介绍戒指的元素需要选择材质(黄金,铂金,彩金)、表面工艺(拉丝,磨砂,光滑,铸造)、镶钻(内嵌,外嵌)、指环大小等等,然后组成一个戒指。这种就是装饰者模式的应用,原型是一个戒指,不断地给对象添加额外的职责,然后得到最终想要的产品。这样就可以通过不同的搭配产生很多不同类型的戒指。

后面那句装饰者模式比生成子类更为灵活怎么理解。如果用子类去描述的话,要把每一种搭配的结果都变成一个子类,也就是要穷举,就会产生很多子类,也就是造成类爆炸。所以就会说装饰者模式更加灵活。

来个例子

现在有一个需求,要求做一个加密的工具类,对传入的字符串加密。加密的算法有很多,有MD5、AES、DES等等,一般加密都不是单独使用一种加密算法,而是多种混合一起使用,这样可以提高安全性。

现在有三种算法:MD5、AES、DES。做一个工具类,给系统提供加密的服务,要求可以自由搭配使用。

使用继承的方式实现

我们就创建一个抽象类EncryptionBase,每一种组合方式就创建一个子类继承EncryptionBase,现在有三种加密方式,很容易我们可以穷举完,总共有6种组合。请看以下代码:

首先创建一个抽象类EncryptionBase

public abstract class EncryptionBase {
   
    public abstract String encrypt(String string,String password);
}

接着创建子类继承抽象类,并且实现其方法。以其中一个为例,其他实现类都类似:

public class AESandDESandMD5Encryption extends EncryptionBase {
   
    @Override
    public String encrypt(String string, String password) {
   
        //网上可以找具体加密的代码,我这里篇幅受限就不展示了
        //AES加密
        byte[] encryptByAES = AESUtil.encrypt(string, password);
        //DES加密
        byte[] encryptByDES = DESUtil.encrypt(encryptByAES, password);
        //MD5加密
        return MD5Util.encryptByMD5(new String(encryptByDES) + password);
    }
}

我们就可以实现以下效果,有6个实现类分别实现了3种加密算法的不同顺序。

public static void main(String[] args) {
   
        String string = "需要加密的字符串";
    	//秘钥
        String password = "12345678";

        //第一种加密顺序:AES->DES->MD5
        EncryptionBase AESandDESandMD5 = new AESandDESandMD5Encryption();
        //第二种加密顺序:AES->MD5->DES
        EncryptionBase AESandMD5andDES = new AESandMD5andDESEncryption();
        //第三种加密顺序:DES->AES->MD5
        EncryptionBase DESandAESandMD5 = new DESandAESandMD5Encryption();
        //第四种加密顺序:DES->MD5->AES
        EncryptionBase DESandMD5andAES = new DESandMD5andAESEncryption();
        //第五种加密顺序:MD5->DES->AES
        EncryptionBase MD5andDESandAES = new MD5andDESandAESEncryption();
        //第六种加密顺序:MD5->AES->DES
        EncryptionBase MD5andAESandDES = new MD5andAESandDESEncryption();
    }

以上就是使用继承的方式来完成这个需求。看起来没什么问题,但是仔细思考你会发现几个问题。

  1. 会创建很多子类。为什么3种算法是6个类呢?这是根据数学的排列组合3*2*1=6,假设再多两种算法呢?那就是5*4*3*2*1=120,那就是120个类了!这就是“类爆炸”
  2. **不符合开闭原则。**假设增加了新的算法,那就要修改原来的类,不利于代码的维护。
  3. 假如其中一种加密算法要用两次,比如双重MD5加密,那也是很难扩展的。

如果你不会装饰者模式,那估计要加班加点去写代码,创建很多类。如果你会装饰者模式,那问题就很简单了,那怎么做呢?请继续看下去。

使用装饰者模式实现

首先创建三种算法的基础类,继承EncryptionBase,实现三种加密算法。

MD5加密

public class 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值