Open Close Principle - 开闭原则

开闭原则 —— OCP

Software entities should be open for extension,but closed for modification(模块应对扩展开放,而对修改关闭!)

Bertrand MeyerWide Awake

模块应尽量在不修改原(是“原”,指原来的代码)代码的情况下进行扩展。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
//工厂(Factory) 有一条生产线(prodLine),生产"产品A".
public class Factory {
public String prodLine(){
return "产品A";
}
}

//客户 订购该工厂的该产品(产品A)
public class Client1 {
public static void main(String args[]) {
System.out.println("我订购并收到产品:"+order());
}

private static String order(){
Factory factory = new Factory();
return factory.prodLine();
}
}

//执行效果
我订购并收到产品:产品A

/*现因为市场需求改变增加,需要新加一条生产"产品B"的生产线, 但是资金有限。
只能再原有的生产线上增加功能(既可以生产A,又可以生产B)*/
public class Factory {
public String prodLine(int type) {
if(type == 0){
return "产品A";
}else{
return "产品B";
}
}
}
/*当我们修改之后 会发现客户方有问题(订购不了产品) 因为什么!
因为我们需要知道客户到底要什么产品(type),客户没说,我们也不能做啊,不然做出来退货怎么办(出BUG)
*/
public class Client1 {
public static void main(String args[]) {
System.out.println("我订购并收到产品:"+order());
}

private static String order(){
Factory factory = new Factory();
//客户申明要什么产品
return factory.prodLine(0);
}
}
我订购并收到产品:产品A

以上只是最基本的

开闭原则
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

//我们建厂之前需要提前写一个设计稿(接口)为未来做准备 比如 生产N种产品
public interface IFactory {
String prodLine(int type);
}

//现在市场上 出现了需要产品的客户 我们直接按照接口 建造工厂
public class FactoryA implements IFactory{
@Override
public String prodLine(int type) {
if(type == 0){
return "产品A";
}else{
return "产品B";
}
}
}

//客户方 没有变化 申明产品的类型
public class Client1 {
public static void main(String args[]) {
System.out.println("我订购并收到产品:"+order());
}

private static String order(){
Factory factory = new Factory();
//客户申明要什么产品
return factory.prodLine(0);
}
}

我订购并收到产品:产品A/B

分享到