开闭原则
软件实体(类、模块、函数等等)应该是可以扩展的,但是不可以修改。
开闭原则为我们描绘出了一个美好的代码世界。在这里,我们无需去修改原有的代码。只需要不断的新增模块就能完成功能的增加和修改。(想想还有些小激动呢!!)
那么该如何去做呢?
开闭原则的做法与搭积木相似。将功能划分成若干个不会再分割的小模块,通过对这些小模块的排列组合,我们就可以拼装出无限的可能。
所以,首先要去做的就是对功能进行划分。具体做法可以参见我的上一篇文章设计模式初探(1)。
然后就是如何让这些模块可以自由组合拼装。
举一个生活中的例子。我们都在使用各种不同的电器。在切换电器的时候,只需做一个简单的插拔操作,不需要自己去更改电路。对于整个供电系统,根据变化的原因可以划分成2个部分:电源相关部分、用电器相关部分。
它们之间的拼接是通过定义一个接口,插座。电源和用电器各自实现自己的接口,这样任何一处电源和任何一个用电器都可以无缝对接。
回到程序上来~
电路
class Circuit {
contructor (_power, _applicant) {
_applicant.use(_power.generate());
}
}
电源
class Power {
//发电
generate () {
}
}
用电器
class Applicant {
//用电
use () {
}
}
用电器连接电路
var _power = new XxxPower();//XxxPower为Power的某个子类,实现generate方法
var _applicant = new XxxApplicant();//XxxApplicant为Applicant某个子类,实现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 {
//获取列表数据
getList () {
}
//获取按钮文案
getBtnText () {
}
}
class Position {
//卡片的位置
getCardPosition () {
}
//三角的位置
getTrianglePosition () {
}
}
//历史记录数据
var _data = new HistoryData();
//居左的位置
var _position = new LeftPosition();
//一直新的卡片对象
var _card = new Card(_position, _data);
大概就是这个意思啦,以上。