设计模式初探(2)开闭原则

开闭原则

软件实体(类、模块、函数等等)应该是可以扩展的,但是不可以修改。

开闭原则为我们描绘出了一个美好的代码世界。在这里,我们无需去修改原有的代码。只需要不断的新增模块就能完成功能的增加和修改。(想想还有些小激动呢!!)

那么该如何去做呢?

开闭原则的做法与搭积木相似。将功能划分成若干个不会再分割的小模块,通过对这些小模块的排列组合,我们就可以拼装出无限的可能。

所以,首先要去做的就是对功能进行划分。具体做法可以参见我的上一篇文章设计模式初探(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);

大概就是这个意思啦,以上。

你可能感兴趣的:(设计模式初探(2)开闭原则)