個(gè)人理解 间螟,隨手寫(xiě)下的筆記。不足之處损肛,請(qǐng)諒解。
定義
(1)對(duì)于擴(kuò)展是開(kāi)放的(Open for extension)荣瑟。這意味著模塊的行為是可以擴(kuò)展的治拿。當(dāng)應(yīng)用的需求改變時(shí),我們可以對(duì)模塊進(jìn)行擴(kuò)展笆焰,使其具有滿(mǎn)足那些改變的新行為劫谅。也就是說(shuō),我們可以改變模塊的功能嚷掠。
(2)對(duì)于修改是關(guān)閉的(Closed for modification)捏检。對(duì)模塊行為進(jìn)行擴(kuò)展時(shí),不必改動(dòng)模塊的源代碼或者二進(jìn)制代碼不皆。模塊的二進(jìn)制可執(zhí)行版本贯城,無(wú)論是可鏈接的庫(kù)、DLL或者.EXE文件霹娄,都無(wú)需改動(dòng)能犯。
問(wèn)題
任何軟件都需要面臨一個(gè)很重要的問(wèn)題,即它們的需求會(huì)隨時(shí)間的推移而發(fā)生變化犬耻。當(dāng)軟件系統(tǒng)需要面對(duì)新的需求時(shí)踩晶,我們應(yīng)該盡量保證系統(tǒng)的設(shè)計(jì)框架是穩(wěn)定的。如果一個(gè)軟件設(shè)計(jì)符合開(kāi)閉原則枕磁,那么可以非常方便地對(duì)系統(tǒng)進(jìn)行擴(kuò)展渡蜻,而且在擴(kuò)展時(shí)無(wú)須修改現(xiàn)有代碼,使得軟件系統(tǒng)在擁有適應(yīng)性和靈活性的同時(shí)具備較好的穩(wěn)定性和延續(xù)性。隨著軟件規(guī)模越來(lái)越大茸苇,軟件壽命越來(lái)越長(zhǎng)排苍,軟件維護(hù)成本越來(lái)越高,設(shè)計(jì)滿(mǎn)足開(kāi)閉原則的軟件系統(tǒng)也變得越來(lái)越重要税弃。
解決方式
為系統(tǒng)定義一個(gè)相對(duì)穩(wěn)定的抽象層纪岁,而將不同的實(shí)現(xiàn)行為移至具體的實(shí)現(xiàn)層中完成。在很多面向?qū)ο缶幊陶Z(yǔ)言中都提供了接口则果、抽象類(lèi)等機(jī)制幔翰,可以通過(guò)它們定義系統(tǒng)的抽象層,再通過(guò)具體類(lèi)來(lái)進(jìn)行擴(kuò)展西壮。如果需要修改系統(tǒng)的行為遗增,無(wú)須對(duì)抽象層進(jìn)行任何改動(dòng),只需要增加新的具體類(lèi)來(lái)實(shí)現(xiàn)新的業(yè)務(wù)功能即可款青,實(shí)現(xiàn)在不修改已有代碼的基礎(chǔ)上擴(kuò)展系統(tǒng)的功能做修,達(dá)到開(kāi)閉原則的要求。
Java例子
/**
* 抽象類(lèi)圖標(biāo)
*/
public abstract class AbsChat {
public void display() {
System.out.println("AbsChat");
}
}
/**
* 柱狀圖
*/
public class BarChat extends AbsChat {
@Override
public void display() {
System.out.println("BarChat");
}
}
/**
* 餅圖
*/
public class PieChat extends AbsChat {
@Override
public void display() {
System.out.println("PieChat");
}
}
/**
* 系統(tǒng)調(diào)用圖型顯示
*/
public class ChatDisplay {
private AbsChat chat = null;
public ChatDisplay(AbsChat chat) {
this.chat = chat;
}
public void setChat(AbsChat chat) {
this.chat = chat;
}
public void display() {
chat.display();
}
}
/**
* 系統(tǒng)調(diào)用相應(yīng)的圖型顯示
*/
public class TestDemo {
public static void main(String[] args) {
//修改系統(tǒng)代碼的時(shí)候替換BarChat就好了抡草,如果使用Spring框架替換Bean配置就好了饰及,不用修改代碼,直接添加代碼就好了
AbsChat chat = new BarChat();
// AbsChat chat = new PieChat();
ChatDisplay chatDisplay = new ChatDisplay(chat);
chatDisplay.display();
}
}
參考
百度百科:開(kāi)閉原則
面向?qū)ο笤O(shè)計(jì)原則之開(kāi)閉原則
設(shè)計(jì)模式六大原則(6):開(kāi)閉原則