// 使用AES算法进行加密
}
}
这种方案有很多不尽如人意的地方:
* Encryption类变得更大、更难以维护,因为它实现了多种加密算法,但是每次只使用一种。
* 难以添加新算法以及修改既有算法,因为加密算法是Encryption类不可分割的部分。
* 加密算法向Encryption类提供服务,但是与Encryption类紧紧耦合在一起,无法在其它地方重用。
不满意就重构,首先使用继承进行重构,会有2种方案可以选择:
选择1:
让Encryption类根据需求继承AESEncryptionAlgorithm或DESEncryptionAlgorithm类,并提供方法Encrypt()。这种方案带来的问题是Encryption类在编译阶段就将关联到特定的加密算法,更严重的是类之间的关系并不是is-a关系。
///
/// AES算法加密类
///
public class AESEncryptionAlgorithm
{
/// <summary>
/// 使用AES算法进行加密
/// </summary>
public void EncryptUsingAES() {
// 使用AES算法进行加密
}
}
///
/// DES算法加密类
///
public class DESEncryptionAlgorithm
{
/// <summary>
/// 使用DES算法进行加密
/// </summary>
public void EncryptUsingDES() {
// 使用DES算法进行加密
}
}
public class Encryption: AESEncryptionAlgorithm
{
/// <summary>
/// 使用算法进行加密
/// </summary>
public void Encrypt() {
EncryptUsingAES();
}
}
选择2:
创建子类AESEncryption和DESEncryption,它们都扩展了Encryption类,并分别包含加密算法AES和DES的实现。客户程序可创建Encryption的引用,这些引用指向特定子类的对象。通过添加新的子类,很容易支持新的加密算法。但是这种方案的问题是AESEncryption和DESEncryption将继承Encryption类的其它方法,降低了加密算法的可重用性。
public abstract class Encryption
{
/// <summary>
/// 使用算法进行加密
/// </summary>
public abstract void Encrypt();
}
///
/// AES算法加密类
///
public class AESEncryption : Encryption
{
/// <summary>
/// 使用 AES算法进行加密
/// </summary>
public override void Encrypt() {
// 使用 AES算法进行加密
}
}
///
/// DES算法加密类
///
public class DESEncryption : Encryption
{
/// <summary>
/// 使用 DES算法进行加密
/// </summary>
public override void Encrypt() {
// 使用 DES算法进行加密
}
}
**最佳的选择是使用策略模式:**
* 可在运行阶段给Encryption对象配置特定的加密算法
* 可在其它地方重用层次结构EncryptionAlgorithm中定义的算法
* 很容易根据需要支持新的算法
///
/// 算法加密接口
///
public interface EncryptionAlgorithm
{
void Encrypt();
}
///
/// DES算法加密类
///
public class DESEncryptionAlgorithm : EncryptionAlgorithm
{
public void Encrypt() {
//使用 DES算法进行加密
}
}
///
/// AES算法加密类
///
public class AESEncryptionAlgorithm : EncryptionAlgorithm
{
public void Encrypt() {
//使用 AES算法进行加密
}
}
public class Encryption
{
EncryptionAlgorithm algo;
/// <summary>
/// 使用算法进行加密
/// </summary>
public void Encrypt() {
algo.Encrypt();
}
}
示例分析二[](https://gitee.com/vip204888/java-p7)
------------------------------------------------------------------
支持使用不同算法(DES和AES)对各种内容(Image和Text)进行加密的设计。
最简单最直观的的设计:
![mark](https://img-blog.csdnimg.cn/img_convert/363f21424aab9da06445ef349574e68b.png)
在这个设计中,有两个变化点:支持的内容类型和加密算法类型。对于这两个变化点的每种可能组合,都使用了一个类来表示。这样会有一个严重的问题:假设现在要求支持新加密算法TDES和新内容类型Data,类的数量呈爆炸性增长。因为变化点混在了一起,没有分别进行封装。
![mark](https://img-blog.csdnimg.cn/img_convert/d30d7a2e5fdda82b1284577f8eb42646.png)
**使用桥接模式进行封装:**
![mark](https://img-blog.csdnimg.cn/img_convert/879951f1b925ded840cc9a0a9300bca6.png)
使用桥接模式,分别封装这两个关注点的变化。现在要引入新内容类型Data和新加密算法TDES,只需要添加两个新类。既解决了类数量呈爆炸增长的问题,又增加了根为接口EncryptionAlgorithm层次结构中的加密算法的可重用性。
总结[](https://gitee.com/vip204888/java-p7)
---------------------------------------------------------------
1. 不相关的关注点混在一起,抽象将变得难以重用。
# 写在最后
作为一名即将求职的程序员,面对一个可能跟近些年非常不同的 2019 年,你的就业机会和风口会出现在哪里?在这种新环境下,工作应该选择大厂还是小公司?已有几年工作经验的老兵,又应该如何保持和提升自身竞争力,转被动为主动?
**就目前大环境来看,跳槽成功的难度比往年高很多。一个明显的感受:今年的面试,无论一面还是二面,都很考验Java程序员的技术功底。**
最近我整理了一份复习用的面试题及面试高频的考点题及技术点梳理成一份“**Java经典面试问题(含答案解析).pdf**和一份网上搜集的“**Java程序员面试笔试真题库.pdf**”(实际上比预期多花了不少精力),**包含分布式架构、高可扩展、高性能、高并发、Jvm性能调优、Spring,MyBatis,Nginx源码分析,Redis,ActiveMQ、Mycat、Netty、Kafka、Mysql、Zookeeper、Tomcat、Docker、Dubbo、Nginx等多个知识点高级进阶干货!**
**由于篇幅有限,为了方便大家观看,这里以图片的形式给大家展示部分的目录和答案截图![有需要的朋友可以戳这里免费获取](https://gitee.com/vip204888/java-p7)**
![](https://img-blog.csdnimg.cn/img_convert/1022fe3cc07585e7a561ff1ac5232f55.png)
### Java经典面试问题(含答案解析)
![](https://img-blog.csdnimg.cn/img_convert/ed302d5e93bf86015f79e85c358e9dd4.png)
### 阿里巴巴技术笔试心得
![](https://img-blog.csdnimg.cn/img_convert/937fe549eda9d86355c7494a4788152f.png)
cat、Netty、Kafka、Mysql、Zookeeper、Tomcat、Docker、Dubbo、Nginx等多个知识点高级进阶干货!**
**由于篇幅有限,为了方便大家观看,这里以图片的形式给大家展示部分的目录和答案截图![有需要的朋友可以戳这里免费获取](https://gitee.com/vip204888/java-p7)**
[外链图片转存中...(img-wZ6PtDRH-1628148485777)]
### Java经典面试问题(含答案解析)
[外链图片转存中...(img-C2j1Wz1O-1628148485779)]
### 阿里巴巴技术笔试心得
[外链图片转存中...(img-eVECxIXK-1628148485780)]
#####