開閉原則
軟件實體(類、模塊、函數(shù)等等)應該是可以擴展的,但是不可以修改。
開閉原則為我們描繪出了一個美好的代碼世界。在這里,我們無需去修改原有的代碼。只需要不斷的新增模塊就能完成功能的增加和修改。(想想還有些小激動呢?。。?/p>
那么該如何去做呢?
開閉原則的做法與搭積木相似。將功能劃分成若干個不會再分割的小模塊,通過對這些小模塊的排列組合,我們就可以拼裝出無限的可能。
所以,首先要去做的就是對功能進行劃分。具體做法可以參見我的上一篇文章設計模式初探(1)。
然后就是如何讓這些模塊可以自由組合拼裝。
舉一個生活中的例子。我們都在使用各種不同的電器。在切換電器的時候,只需做一個簡單的插拔操作,不需要自己去更改電路。對于整個供電系統(tǒng),根據(jù)變化的原因可以劃分成2個部分:電源相關部分、用電器相關部分。
它們之間的拼接是通過定義一個接口,插座。電源和用電器各自實現(xiàn)自己的接口,這樣任何一處電源和任何一個用電器都可以無縫對接。
回到程序上來~
電路
class Circuit {
contructor (_power, _applicant) {
_applicant.use(_power.generate());
}
}
電源
class Power {
//發(fā)電
generate () {
}
}
用電器
class Applicant {
//用電
use () {
}
}
用電器連接電路
var _power = new XxxPower();//XxxPower為Power的某個子類,實現(xiàn)generate方法
var _applicant = new XxxApplicant();//XxxApplicant為Applicant某個子類,實現(xiàn)use方法。
var _circuit = new Circuit(_power, _applicant);//一個電路就這樣連好了
對于上一篇文章設計模式初探(1)中提到的例子,我在這里嘗試著拼裝一下。
class Card {
contructor (_position, _data) {
//生成列表
this._renderList(_data.getList());
//設置按鈕
this._setBtnText(_data.getBtnText());
//定位模塊
this._setCardPosition(_position.getCardPosition());
//定位三角
this._setTrianglePosition(_position.getTrianglePosition());
}
}
class Data {
//獲取列表數(shù)據(jù)
getList () {
}
//獲取按鈕文案
getBtnText () {
}
}
class Position {
//卡片的位置
getCardPosition () {
}
//三角的位置
getTrianglePosition () {
}
}
//歷史記錄數(shù)據(jù)
var _data = new HistoryData();
//居左的位置
var _position = new LeftPosition();
//一直新的卡片對象
var _card = new Card(_position, _data);
大概就是這個意思啦,以上。