設(shè)計(jì)模式的好處
? ? 復(fù)用据德、易讀证芭、拓展
五大原則
? ? 開閉煤傍、接口隔離朦肘、里氏替換饭弓、依賴倒置、單一職責(zé)
開閉原則(hoc)
? ? 簡寫:?ocp
? ? 要求:對拓展開發(fā)媒抠,對修改關(guān)閉
? ? 為了迎接元旦弟断,產(chǎn)品想搞點(diǎn)新花樣,把a(bǔ)pp里的a模塊高亮趴生,對b模塊做打折處理
? ? 則代碼如下
? ? 后來公司做年終總結(jié)阀趴,發(fā)現(xiàn)c模塊一直在虧錢昏翰,故打算將其停用掉:置灰且顯示停止發(fā)售
? ? 也很easy,如下即可
? ? 那要為了迎接春節(jié)又要將d特殊處理呢刘急?元宵處理c呢......棚菊,你要說接著if...else,那我敬你是英雄叔汁,并奉上666
? ? 思考......
? ? 開閉原則要求關(guān)閉修改统求,這意味著我們不能直接去動原有的邏輯,那么是否可以把這些共有操作做一下歸類呢攻柠?不管是置灰或者高亮或者默認(rèn)顏色球订,都是對顏色的控制,所以可以提取一個(gè)setColor方法專門來做這件事瑰钮;對于打折或停止銷售或顯示的金額都是一個(gè)div的文本顯示冒滩,所以可以使用setSalary來做這件事
? ? 如此,對于新的mode來說浪谴,其天生就具有這兩個(gè)方法开睡,且可以在自身覆蓋或增加自身的其他新的行為
單一職責(zé)(function)
? ??簡寫:?srp
? ? 要求:模塊之間相互隔離,函數(shù)之間互不影響
? ? 比如我們做一個(gè)時(shí)間相關(guān)的下拉框苟耻,下拉框和時(shí)間就可以單獨(dú)分開篇恒,使用moment來處理時(shí)間的轉(zhuǎn)化
? ? 又比如對于開閉中列舉的例子而言,假設(shè)有模塊d不僅要高亮凶杖,而且要打折的話胁艰,則setColor和setSalary就是符合單一職責(zé)的。又或者是這樣的
依賴倒置(vue.use)
? ??簡寫:?dip
? ? 要求:上層不應(yīng)該依賴下層實(shí)現(xiàn)
? ? 假設(shè)我們要實(shí)現(xiàn)一個(gè)分享功能智蝠,我們可以這么寫
? ? 這沒毛病腾么,將Share功能單獨(dú)分開這很"單一職責(zé)",通過在Mode內(nèi)重寫shareToWx也實(shí)現(xiàn)了"開閉"
? ? 后來杈湾,產(chǎn)品突然發(fā)現(xiàn)解虱,在當(dāng)下網(wǎng)購盛行,網(wǎng)民習(xí)慣性看評價(jià)下菜漆撞,光分享出去好像沒什么卵用殴泰,那...加個(gè)評價(jià)?
? ? 好嘛浮驳,評價(jià)不是我寫的悍汛,我就調(diào)一下,那一秒我就給他寫完了
? ? 可是至会,這時(shí)候我有點(diǎn)頭疼离咐,倒不是bug多,而是我發(fā)現(xiàn)還可以優(yōu)化:新用戶注冊直接給個(gè)折扣會不會更好奋献?健霹,如果產(chǎn)品也這樣想旺上,那我豈不是還要再改,WTMD...
? ? 我貌似糖埋,對下層產(chǎn)生了依賴...
? ? 如果能像vue一樣提供一個(gè)插件機(jī)制就好了宣吱,不管傳遞給vue的插件如何改變,有多少個(gè)瞳别,都能夠接收征候,并在適當(dāng)?shù)臅r(shí)候提供給頁面調(diào)用,而不是在vue內(nèi)部去保留一份實(shí)現(xiàn)
接口隔離
? ??簡寫:?isp
????像elementUI祟敛、antd這些組件庫疤坝,都提供了按需加載能力,這個(gè)其實(shí)從某種意義上來說就是接口隔離馆铁,因?yàn)閷τ?b>不需要的功能我們不必要都跑一遍
里氏替換
? ??簡寫: lsp
? ? 要求:子類可以繼承并拓展父類跑揉,但不能破壞父類的執(zhí)行流程,子類能出現(xiàn)的地方父類也可以
? ? 父類就像是在擬大綱一樣埠巨,它實(shí)現(xiàn)了一個(gè)api的實(shí)現(xiàn)流程历谍。子類可以直接使用也可以進(jìn)行重寫,但是不能破壞整體流程辣垒,如下望侈,只有Fp是符合的