1. 程式人生 > 實用技巧 >面向物件設計原則——開閉原則

面向物件設計原則——開閉原則

什麼是開閉原則

開閉原則(Open Closed Principle,OCP),軟體實體應當對擴充套件開放,對修改關閉(Software entities should be open for extension,but closed for modification),這就是開閉原則的經典定義。

軟體實體包括:模組,類與介面,方法。

更加清晰的定義:

當應用的需求改變時,在不修改軟體實體的原始碼或者二進位制程式碼的前提下,可以擴充套件模組的功能,使其滿足新的需求。

實現方法

通過“抽象約束、封裝變化”來實現開閉原則,即通過介面或者抽象類為軟體實體定義一個相對穩定的抽象層,

而將相同的可變因素封裝在相同的具體實現類中。

當軟體需要發生變化時,只需要根據需求重新派生一個實現類來擴充套件就可以了。

例子:

/**
 * 電腦抽象介面
 */
public interface Computer {
}

/**
 * 電腦具體實現1
 */
public class Macbook implements Computer{
}

/**
 * 電腦實現具體2
 */
public class Surface implements Computer {
}

/**
 * 生產電腦的類
 */
public class ComputerFactory {

    /**
* 根據字串得到不同型別的電腦 * @param type * @return * * 注意:如果我們添加了新的電腦型別,那我們就需要修改這個方法。 * 違背了開閉原則 */ public Computer produceComputor(String type){ Computer computer = null; if (type.toUpperCase().equals("MACBOOK")){ computer = new Macbook(); }
else if (type.toLowerCase().equals("surface")){ computer = new Surface(); } return computer; } }

如果我需要增加一個電腦型別,那就需要修改方法:違背了開閉原則

改進方法,講ComputerFactory抽象為介面,利用不同的工廠實現不同電腦的建立。

實際就是工廠方法模式的設計模式

public interface CFactory {
    public Computer produceComputor();
}

/**
 * 繼承抽象工廠類,實現建立macbook
 */
public class MacFactory implements CFactory {
    public Computer produceComputor() {
        return new Macbook();
    }
}

/**
 * 繼承抽象工廠類,實現Surface建立
 */
public class MSFactory implements CFactory {
    public Computer produceComputor() {
        return new Surface();
    }
}

這樣子,如果我們新增加了不同的電腦型別,只需要實現兩個介面就行了,就不需要修改原有的程式碼