55
66# 补充说明
77
8- 一个软件实体应该通过扩展来实现变化 ,而不是通过修改已有的代码来实现变化
8+ 系统应该通过扩展来实现变化 ,而不是通过修改已有的代码来实现变化
99
1010
11- <!-- # 做项目的时候哪些地方违反了开闭原则? -->
11+ <!-- # 项目中哪些地方违反了开闭原则? -->
12+ 在项目中,如果我们为了增加第三方库的功能而直接修改第三方库的代码,那么这就违反了开闭原则,因为这是通过修改了已有代码来实现变化
1213
13- 具体来说,如果我们为了增加第三方库的功能而直接修改第三方库的代码,那么这就违反了开闭原则
1414
15- ** 为什么违反**
16- 这是通过修改了已有代码来实现变化
15+ <!-- **造成什么问题** -->
16+ 这会造成下面的问题:
17+ 升级第三方库的版本时,会导致原有的修改失效,从而不得不再修改一遍
1718
18- ** 造成什么问题**
19- 升级第三方库的版本时,会导致原有的修改失效,从而不得不再次修改一遍
2019
21-
22- ** 如何改进**
23-
24- 有很多改进的方法,其中一个方法就是使用设计模式中的“中间者模式”,增加一个模块A来封装第三方库,让用户改为调用模块A而不是直接调用第三方库。
25- 这样在需要增加第三方库的功能时,则只增加一个模块B,使其继承模块A,然后在模块B中加入增加的功能代码,让用户改为调用模块B
20+ <!-- **如何改进** -->
21+ 有很多改进的方法,其中一个方法就是使用设计模式中的“中间者模式”,增加一个模块A来封装第三方库,让用户改为调用模块A而不是直接调用第三方库
22+ 这样在需要增加第三方库的功能时,只需增加一个模块B,使其继承模块A,然后在模块B中加入增加的功能代码,并让用户改为调用模块B
2623
2724这样做的话就通过扩展而不是修改来实现了变化,从而符合开闭原则
2825
26+ 值得注意的是:因为开闭原则允许修改用户的代码,所以这里允许用户改为调用模块B
27+
2928
3029# 案例1
3130
@@ -46,21 +45,20 @@ TODO tu
4645
4746上面三种实现思路都违反了开闭原则,因为它们都是通过修改Cloth的相关代码来实现变化
4847
49- 我们可以增加一个继承TShirt的子模块:OffTShirt,在其中增加getOffPrice函数
48+ 我们可以增加一个继承TShirt的子模块:OffTShirt,在其中覆写getPrice函数,实现打折处理
5049领域模型如下:
5150TODO tu
5251
53- 这样就只需要修改用户模块ClothStore,使其从调用TShirt的getPrice函数改为调用OffTShirt的getOffPrice函数 ,而不需要修改Cloth的相关代码
52+ 这样就只需要修改用户模块ClothStore,使其从调用TShirt改为调用OffTShirt ,而不需要修改Cloth的相关代码
5453
5554这样就通过扩展来实现了变化,符合开闭原则
5655
57- 值得注意的是:开闭原则允许修改用户模块
58-
5956
6057# 案例2
6158
6259
63- 我们来看下另一个例子,我们要实现一个人员管理系统,领域模型如下:
60+ 我们来看另一个例子
61+ 我们要实现一个人员管理系统,领域模型如下:
6462TODO tu
6563
6664人员固定有三个数据:姓名、卡号、部门
@@ -72,7 +70,7 @@ TODO tu
7270我们修改领域模型,修改后如下:
7371TODO tu
7472
75- 这里将人员和它的数据改为了组合关系
73+ 这里将人员和它的数据改为组合关系
7674比如对于原来的三个数据,现在它们的关系如下:
7775``` ts
7876人员 = 人员数据项1 + 人员数据项2 + 人员数据项3
@@ -83,8 +81,9 @@ TODO tu
8381人员数据项3 = 名称(部门) + 值 + 类型(string )
8482```
8583
86- 可以通过增加一个人员数据项,从而实现增加一个人员的数据;
87- 可以通过增加一个修改后的人员数据项,并使人员从组合修改前的数据项改为组合修改后的数据项,从而实现修改人员的数据;
88- 可以通过使人员不再组合某个数据项,从而实现删除人员的数据
84+ 现在可以通过这样来实现用户的需求:
85+ 通过增加一个人员数据项,从而实现增加人员的一个数据;
86+ 通过增加一个修改后的人员数据项,并使人员组合修改后的数据项,从而实现修改人员的一个数据;
87+ 通过使人员不再组合某个数据项,从而实现删除人员的某个数据
8988
90- 这些都是通过扩展而非修改来实现变化 ,所以符合开闭原则
89+ 因为这些都是通过扩展而非修改来实现变化 ,所以符合开闭原则
0 commit comments