【关于封装的那些事,Javaweb基础知识总结

没有将实现变化封装在抽象和层次结构中时,将导致这种坏味。

表现形式通常如下:

  • 客户程序与其需要的服务变种紧密耦合,每当需要支持新变种或修改既有变种时,都将影响客户程序。

  • 每当需要在层次结构中支持新变种时,都添加了大量不必要的类,这增加了设计的复杂度。

为什么不能缺失封装?


开闭原则(OCP)指出,类型应对扩展开放,对修改关闭。也就是说应该通过扩展(而不是修改)来改变类型的行为。没有在类型或层次结构中封装实现变化时,便违反了OCP。

缺失封装潜在的原因


未意识到关注点会不断变化

没有预测到关注点可能发生变化,进而没有在设计中正确封装这些关注点。

混合关注点

将彼此独立的各个关注点聚合在一个层次结构中,而不是分开时,如果关注点发生变化,可能导致类的数量呈爆炸式增长。

幼稚的设计决策

采用过于简单的方法,如为每种变化组合创建一个类时,可能导致设计无谓的复杂。

示例分析一


假设有一个Entryption类,它需要使用加密算法对数据进行加密。可供选择的加密算法有很多,包括DES(数据加密标准)、AES(高级加密标准)、TDES(三重数据加密标准)等。Entryption类使用DES算法对数据进行加密。


public class Encryption

{

    /// 

    /// 使用DES算法进行加密

    /// 

    public void Encrypt() {

        // 使用DES算法进行加密

    }

}

假设出现了新需求,要求使用AES算法对数据进行加密。

最差的方案出现了:


public class Encryption

{

    /// 

    /// 使用DES算法进行加密

    /// 

    public void EncryptUsingDES() {

        // 使用DES算法进行加密

    }



     /// 

    /// 使用AES算法进行加密

    /// 

    public void EncryptUsingAES() {

        // 使用AES算法进行加密

    }

}

这种方案有很多不尽如人意的地方:

  • Encryption类变得更大、更难以维护,因为它实现了多种加密算法,但是每次只使用一种。

  • 难以添加新算法以及修改既有算法,因为加密算法是Encryption类不可分割的部分。

  • 加密算法向Encryption类提供服务,但是与Encryption类紧紧耦合在一起,无法在其它地方重用。

不满意就重构,首先使用继承进行重构,会有2种方案可以选择:

选择1:

让Encryption类根据需求继承AESEncryptionAlgorithm或DESEncryptionAlgorithm类,并提供方法Encrypt()。这种方案带来的问题是Encryption类在编译阶段就将关联到特定的加密算法,更严重的是类之间的关系并不是is-a关系。


/// 

/// AES算法加密类

/// 

public class AESEncryptionAlgorithm

{

    /// 

    /// 使用AES算法进行加密

    /// 

    public void EncryptUsingAES() {

        // 使用AES算法进行加密

    }

}



/// 

/// DES算法加密类

/// 

public class DESEncryptionAlgorithm

{

    /// 

    /// 使用DES算法进行加密

    /// 

    public void EncryptUsingDES() {

        // 使用DES算法进行加密

    }

}



public class Encryption: AESEncryptionAlgorithm

{

    /// 

    /// 使用算法进行加密

    /// 

    public void Encrypt() {

        EncryptUsingAES();

    }

}

选择2:

创建子类AESEncryption和DESEncryption,它们都扩展了Encryption类,并分别包含加密算法AES和DES的实现。客户程序可创建Encryption的引用,这些引用指向特定子类的对象。通过添加新的子类,很容易支持新的加密算法。但是这种方案的问题是AESEncryption和DESEncryption将继承Encryption类的其它方法,降低了加密算法的可重用性。


public abstract class Encryption

{

    /// 

    /// 使用算法进行加密

    /// 

    public abstract void Encrypt();

}



/// 

/// AES算法加密类

/// 

public class AESEncryption : Encryption

{

    /// 

    /// 使用 AES算法进行加密

    /// 

    public override void Encrypt() {

        // 使用 AES算法进行加密


# 给大家分享下我的复习的面试资料

> 这些面试全部出自大厂面试真题和面试合集当中,小编已经为大家整理完毕(PDF版)
>
> **[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】](https://codechina.csdn.net/m0_60958482/java-p7)**

 *   **第一部分:Java基础-中级-高级**

![image](https://img-blog.csdnimg.cn/img_convert/f480047e16f3fd5009b6db41afe6efd5.png)

*   **第二部分:开源框架(SSM:Spring+SpringMVC+MyBatis)**

![image](https://img-blog.csdnimg.cn/img_convert/ee283a4d56ecfddf795362f83574935f.png)

*   **第三部分:性能调优(JVM+MySQL+Tomcat)**

![image](https://img-blog.csdnimg.cn/img_convert/ddf257d174486e99a9eb93f209c5bf79.png)

*   **第四部分:分布式(限流:ZK+Nginx;缓存:Redis+MongoDB+Memcached;通讯:MQ+kafka)**

![image](https://img-blog.csdnimg.cn/img_convert/60799be036fc0623c9cc6118edbe7cd9.png)

*   **第五部分:微服务(SpringBoot+SpringCloud+Dubbo)**

![image](https://img-blog.csdnimg.cn/img_convert/28775749f575fb0032394b17da13e4c5.png)

*   **第六部分:其他:并发编程+设计模式+数据结构与算法+网络**

![image](https://img-blog.csdnimg.cn/img_convert/7f6e31fbe6ae97dbcf59c632a535b67b.png)

# 进阶学习笔记pdf

>*   **Java架构进阶之架构筑基篇(**Java基础+并发编程+JVM+MySQL+Tomcat+网络+数据结构与算法**)**

![image](https://img-blog.csdnimg.cn/img_convert/79b43efd387779151b75aba2423a15bc.png)

*   **Java架构进阶之开源框架篇(**设计模式+Spring+SpringMVC+MyBatis**)**

![image](https://img-blog.csdnimg.cn/img_convert/c34aa46cb295490e0327bef1e0f868b4.png)

![image](https://img-blog.csdnimg.cn/img_convert/5fbb08c30759767f0436952154faccf7.png)

![image](https://img-blog.csdnimg.cn/img_convert/49442f1f7085fba5111ddc732632c5a4.png)

*   **Java架构进阶之分布式架构篇 (**限流(ZK/Nginx)+缓存(Redis/MongoDB/Memcached)+通讯(MQ/kafka)**)**

![image](https://img-blog.csdnimg.cn/img_convert/d7fdef448dec45e03b9c43ded7be2b92.png)

![image](https://img-blog.csdnimg.cn/img_convert/6590177aa6ba4f93366ee7d598ea6bdb.png)

![image](https://img-blog.csdnimg.cn/img_convert/6c4f219123547e0ecd3eaa01fa14728c.png)

*   **Java架构进阶之微服务架构篇(RPC+SpringBoot+SpringCloud+Dubbo+K8s)**

![image](https://img-blog.csdnimg.cn/img_convert/a71ebabf8472822a2c7fbbf766cadd91.png)

![image](https://img-blog.csdnimg.cn/img_convert/1e357ac9c6e9ee565994d583e3e71dc3.png)

(ZK/Nginx)+缓存(Redis/MongoDB/Memcached)+通讯(MQ/kafka)**)**

[外链图片转存中...(img-esHd9sIq-1630855700243)]

[外链图片转存中...(img-8BL9EX8H-1630855700244)]

[外链图片转存中...(img-o5VGpoLo-1630855700245)]

*   **Java架构进阶之微服务架构篇(RPC+SpringBoot+SpringCloud+Dubbo+K8s)**

[外链图片转存中...(img-PCvvz0r4-1630855700246)]

[外链图片转存中...(img-xxpA7ayC-1630855700247)]

你可能感兴趣的:(程序员,算法,后端)