開閉原則通過新增代碼,避免通過修改原有代碼實現(xiàn)產(chǎn)品迭代
開閉原則要貫穿在軟件開發(fā)的各個層級中,要利用在每一個方法中,由方法組成的類中,由功能密切的類組成的模塊中,由相互依存的模塊組成的項目中。
解決倆個問題:
- 新增業(yè)務需要修改原有代碼
- 隨著業(yè)務增加,判斷語句的暴增問題
- 保持軟件產(chǎn)品的穩(wěn)定性
- 不影響原有測試代碼的運行
先寫個工廠接口,預知未來可能的變化,需要生產(chǎn)線方法,如下:
public interface IFactory {
String prodLine();
}
滿足客戶1的工廠FactoryA實現(xiàn)IFactory,生產(chǎn)產(chǎn)品A,如下:
public class FactoryA implements IFactory{
@Override
public String prodLine() {
return "產(chǎn)品A";
}
}
對于客戶1中的代碼:
public class Client1 {
public static void main(String args[]) {
System.out.println("我訂購并收到產(chǎn)品:"+order());
}
private static String order(){
IFactory factory = new FactoryA();
return factory.prodLine();
}
}
客戶1中持有工廠接口IFactory的引用,指向其實現(xiàn)類,
運行之后,可以滿足客戶1的需求:
我訂購并收到產(chǎn)品:產(chǎn)品A
現(xiàn)在公司需要拓展業(yè)務滿足客戶2的需求,只需添加一個工廠接口IFactory的實現(xiàn)類,生產(chǎn)B產(chǎn)品,如下:
public class FactoryB implements IFactory {
@Override
public String prodLine() {
return "產(chǎn)品B";
}
}
客戶B中的代碼
public class Client2 {
public static void main(String args[]) {
System.out.println("我訂購并收到產(chǎn)品:"+order());
}
private static String order(){
IFactory factory = new FactoryB();
return factory.prodLine();
}
}
運行后,可以滿足客戶B的需求
我訂購并收到產(chǎn)品:產(chǎn)品B
這樣相當于公司為每一位客戶,私人訂制了一個工廠,專門生產(chǎn)其所需要的產(chǎn)品,絲毫不受生產(chǎn)其他產(chǎn)品的影響,而且是保密生產(chǎn),客戶2所需的產(chǎn)品B,對于客戶1是不可見的,絕對的客戶利益至上。