設(shè)計(jì)模式在很早之前有明確的定義,使用意圖,場(chǎng)景;
但是在現(xiàn)代的很多編程語(yǔ)言中,就內(nèi)置的設(shè)計(jì)模式,比如C#的事件、委托特性,就是觀(guān)察者模式的體現(xiàn);
現(xiàn)在的前端框架Vue,整個(gè)Model就是依靠Object對(duì)象,攔截方法set,然后通知視圖更新;React生態(tài)里有個(gè)狀態(tài)管理框架Mobx,都是用觀(guān)察者模式實(shí)現(xiàn)的,每個(gè)class的屬性加上Observable,就可以讓屬性可觀(guān)察,View里加上Observer裝飾器,這樣,當(dāng)observable的屬性改變后,View就會(huì)自動(dòng)分析該不該更新視圖,這都是觀(guān)察者模式的體現(xiàn);
又比如JavaScript/Typescript中的裝飾器Decorator,層層包裹function,還有Python的Decorator,這是裝飾器的體現(xiàn);
又如Java的動(dòng)態(tài)代理,這其實(shí)就是代理模式,Spring框架的AOP面向切面編程,攔截方法的調(diào)用,然后擴(kuò)展邏輯,再?zèng)Q定是否要調(diào)用原來(lái)的邏輯;更有底層的CGLib,直接動(dòng)態(tài)生成字節(jié)碼類(lèi);很方便擴(kuò)展邏輯;但對(duì)于使用者是無(wú)感知的;
最后,其實(shí)我一直都覺(jué)得設(shè)計(jì)模式?jīng)]有固定的使用方式,只要能達(dá)到設(shè)計(jì)者的目的,可以靈活組合使用;而且不一定要像GoF定義的那樣,必須得要有這個(gè)接口,那個(gè)接口,這個(gè)抽象那個(gè)抽象,沒(méi)有必要的;只要達(dá)到目的,寫(xiě)出高內(nèi)聚低耦合、可擴(kuò)展、可維護(hù)的代碼就可以了;
我覺(jué)得,可維護(hù)的代碼才是牛逼的。