设计模式之禅(读后感悟随笔)-单一职责原则
一直以來,自己讀過的技術(shù)類書籍也不少了,但是都犯了一個(gè)毛病就是沒有很好的記錄下來,有些東西可能并不是平日開發(fā)中時(shí)時(shí)刻刻用到的,隨著時(shí)間的延長,學(xué)過的東西慢慢也就淡忘了,剛好最近有些時(shí)間,也正打算把<<設(shè)計(jì)模式之禪>>這本書好好的通讀一遍,順便把所想所得詳細(xì)的記錄一下,也方便以后查閱和回顧。
好,以上都是“廢話”,接下來切入正題。
提起這個(gè)設(shè)計(jì)模式啊,額...,還是打算再廢兩句話,沒辦法我這人就是啰嗦,當(dāng)然你也可以說我是湊字?jǐn)?shù)。
我這個(gè)人呢,比起看A片,平日我更喜歡看小說,而且還是玄幻爽文類的,沒辦法,我就是這么有個(gè)性。這類小說呢,都有一個(gè)共同的特性就是男豬腳都會(huì)修煉很吊炸天的功法,然后在修真界各種裝逼各種秀,一般這種功法有時(shí)候初期的時(shí)候還都很平平無奇,甚至是人盡皆知,但就是沒幾個(gè)人練成,你說氣人不。。。但偏偏男豬腳卻。。。好了好了,哈哈,該打住了(任性也得有個(gè)限度不是?)咱們這里剛才提到了功法,對(duì),設(shè)計(jì)模式給我的第一印象就像是一部逆天功法,看似平平無奇人盡皆知,可是能夠大成者卻少有,更別說臻至化境了,但江湖上一直有個(gè)傳說便是能夠?qū)⒋斯Ψň氈粱车谋憧梢源蚱七@世界的禁錮成為天下至尊。
說了那么多,和今天的單一職責(zé)原則有什么關(guān)系呢?
要想修煉一部功法,最基本的就是要明白功法運(yùn)行的軌跡、運(yùn)氣方法啊等等最基本的修煉方式或者說是約束規(guī)則,而設(shè)計(jì)模式之中就有那么六大基本的原則,也就是咱們修煉這部功法的基本規(guī)則,分別是單一職責(zé)原則、里氏替換原則、依賴倒置原則、接口隔離原則、迪米特法則、開閉原則(當(dāng)然有人也會(huì)將組合/聚合復(fù)用原則總結(jié)進(jìn)去,稱為設(shè)計(jì)模式的七大原則)。
而我們今天要聊的就是最簡單、最基礎(chǔ)、也最讓人糊涂的-----單一職責(zé)原則。
其實(shí)從字面的意思我們也很容易理解單一職責(zé)原則,說白了就是確保你寫的東西(類、接口、方法)有著單一的職責(zé),很多時(shí)候我們都拿人(person)來舉例子,我們也拿這個(gè)person來舉例子,但咱們這個(gè)例子和他們的不太一樣,畢竟咱們談?wù)摰氖切逕?#xff0c;這個(gè)人的身體結(jié)構(gòu)還是要了解清楚的,不專業(yè)的講,人有雙手、雙腳、一個(gè)頭、五臟、六腑、、、等等對(duì)吧?這里我們的劃分其實(shí)就是單一職責(zé)原則的一種表現(xiàn),我們的頭就是用來思考和觀察的,我們的手就是來拿東西的,腳就是用來走路的,這個(gè)時(shí)候有人就說了,“老弟啊你還是太年輕,誰說手就只能來拿東西啊,老哥我練的蛤蟆功用手走路也不是問題的啊”,對(duì),沒毛病,練鐵頭功的那哥們用頭走路都可以。這也就是我們平時(shí)開發(fā)中經(jīng)常會(huì)遇到的或者經(jīng)常困惑的地方,就是如何劃分這個(gè)“職責(zé)”的問題,準(zhǔn)確的說這個(gè)職責(zé)的劃分,確實(shí)沒有特定的界限,這要根據(jù)你自己的業(yè)務(wù)(也就是你所習(xí)功法的效果)來決定,您老修煉飛檐走壁,老拿頭來走路也不是那么回事吧。
說到了這里,您可能大致的了解了這個(gè)所謂的單一職責(zé)原則,但是我們?cè)诖a中怎么寫呢?或者說我們修煉的時(shí)候怎么處理呢?咱們接下來就仔細(xì)的看看吧。
修煉的階段一般都有那么幾種,比如聚氣、淬體、拓脈、元嬰、紫府。。。。,我們拿結(jié)元嬰來舉個(gè)例子,就像咱們上面提到的person,咱們也造個(gè)小人吧。
由于咱們目前功力低微,咱們?cè)獘肽切∪司筒灰珡?fù)雜了,一個(gè)頭倆胳膊倆腿就夠了,咱這個(gè)小人能干嘛呢?也就只能盤腿打坐、掐口訣聚氣、冥想了
說到這里,咱們就要開始思考了,我練就這個(gè)小人是干嘛的(也就是我們要處理什么業(yè)務(wù)的)目的很簡單,讓這小人可以在我們的氣海內(nèi)自行修煉運(yùn)轉(zhuǎn)功法,以便提升我們的修煉速度,當(dāng)我們遇到致命危險(xiǎn)的時(shí)候,可以駕馭元嬰隱匿逃脫(這也就是我們要實(shí)現(xiàn)的功能)。
咱們這里整理出來兩個(gè)主要的功能一、提升修煉速度 ,二、隱匿逃脫,來看圖
?
根據(jù)上面這個(gè)圖,咱們先理一理,我們修煉元嬰的目的有兩個(gè)分別是提升修煉速度和隱匿逃脫,用元嬰來提升修煉速度我們需要三種方法一是掐手決、二是打坐、三是冥想,而這三種方法分別需要我們的手、腳、頭去完成,同樣使用元嬰隱匿逃脫也有三種方法同樣也需要手、腳、頭去完成。
我們得出一個(gè)結(jié)論,我們無論實(shí)現(xiàn)什么功能,都離不開手、腳、頭。
我們稍加修改再來看這個(gè)圖:
可能看到這里,很多同學(xué)已經(jīng)蒙了,“老弟啊,咱不是再說單一職責(zé)原則嗎?剛才還挺清楚,咋越說越蒙呢?說好的代碼呢?”
額,說實(shí)話,大哥其實(shí)我也蒙了,說來說起我都把握自己繞進(jìn)去了,先讓我緩會(huì)。。。。。。。。。。。。。。。。。。
好了,緩好了,咱們接著扯。。。
上面的兩個(gè)例子呢,其實(shí)牽扯到兩種方式,一是使用接口的單一職責(zé)原則,另一個(gè)是使用類的單一職責(zé)原則,
咱們先看第一個(gè)圖,第一張圖是以功能來劃分的,也就是我們要達(dá)到的效果,這種時(shí)候我們采用的應(yīng)該是接口執(zhí)行單一職責(zé)原則,也就是說,您不用管我怎么提高的修煉速度,或者不用管我怎么隱匿逃脫的,我的提升修煉速度的接口就是提升修煉速度的我不管你隱匿逃脫的事,你隱匿的接口就是負(fù)責(zé)隱匿逃脫別的你也別管,(巴啦啦一大堆,還是看代碼吧。。。)看代碼:
/**提升修煉*/ public interface TiShengXiuLian {/*** 掐手決* @param hand*/void qiaShouJue(Hand hand);/*** 打坐* @param foot*/void daZuo(Foot foot);/*** 冥想* @param head*/void mingXiang(Head head); }/**隱匿逃跑*/ public interface YinNiTaoPao {/*** 虛空隱匿* @param hand*/void xuKongYinNi(Hand hand);/*** 飛天之術(shù)* @param foot*/void feiTianZhiShu(Foot foot);/*** 遁地之術(shù)* @param head*/void dunDiZhiShu(Head head); }/**元嬰*/ public class Person implements TiShengXiuLian, YinNiTaoPao {private Head head = new Head();private Hand hand = new Hand();private Foot foot = new Foot();@Overridepublic void qiaShouJue(Hand hand) {//掐手決}@Overridepublic void daZuo(Foot foot) {//打坐}@Overridepublic void mingXiang(Head head) {//冥想}@Overridepublic void xuKongYinNi(Hand hand) {//虛空隱匿}@Overridepublic void feiTianZhiShu(Foot foot) {//飛天之術(shù)}@Overridepublic void dunDiZhiShu(Head head) {//遁地之術(shù)}private void xiuLian() {/*掐手決*/qiaShouJue(hand);/*打坐*/daZuo(foot);/*冥想*/mingXiang(head);}private void taoPao() {/*如果哪都有人*/xuKongYinNi(hand);/*如果天上沒人*/feiTianZhiShu(foot);/*如果地下沒人*/dunDiZhiShu(head);}}?
我們來分析一下上面的代碼,我們的關(guān)注點(diǎn)是功能(修煉用來干嘛的),我們不管用什么來實(shí)現(xiàn),我要的就是這種效果,我們抽取了兩個(gè)接口一個(gè)是提升修煉的,一個(gè)是隱匿逃跑的,這兩個(gè)接口都有著自己單一的職責(zé),假如有一天我又新增了一個(gè)逃跑的手段,我直接修改我的逃跑接口就好了,并不耽誤咱們修煉。
那好,咱們?cè)賮砜吹诙N情況,也就是類的單一職責(zé)的代碼:
/*** 頭部*/ public class Head {public void mingXiang(){System.out.println("冥想");}public void dunDi(){System.out.println("遁地");} }/*** 手*/ public class Hand {public void shouJue(){System.out.println("手決");}public void xuKong(){System.out.println("虛空");} }/*** 腳*/ public class Foot {public void daZuo(){System.out.println("打坐");}public void feiTian(){System.out.println("飛天");} }/*** 元嬰*/ public class Person {private Head head = new Head();private Hand hand = new Hand();private Foot foot = new Foot();/*** 修煉*/private void xiuLian() {/*頭部冥想*/head.mingXiang();/*掐手決*/hand.shouJue();/*打坐*/foot.daZuo();}/*** 逃跑*/private void taoPao() {/*遁地*/head.dunDi();/*虛空*/hand.xuKong();/*飛天*/foot.feiTian();}}?
這次我們是按照身體的部位來進(jìn)行的分化,我們手、腳、頭都有著自己的單一職責(zé)互不影響,假如有一天咱們遇到強(qiáng)敵,被斷去一臂,也是不會(huì)影響咱們?nèi)ナ┱癸w天之術(shù)來逃跑的,也不影響以后打坐來修行的。
好了,扯了那么多,其實(shí)單一職責(zé)原則,沒那么復(fù)雜,是我想著形象點(diǎn)去說明情況,才搞的繞來繞去,你只要記住一點(diǎn),類、接口、方法,咱們完成的功能就要單一,吃飯就是吃飯,別想著吃完還得拉,索性寫一個(gè)里面,那是不對(duì)的,那種代碼不光寫起來惡心,吃(讀)起來更惡心
總結(jié):
其實(shí)呢,單一原則是最簡單的一個(gè)原則,也是最不容易把握的一個(gè)原則,但無論你從哪個(gè)點(diǎn)出發(fā),都應(yīng)該記住,我就是我,是不一樣的煙火,吃就是吃,想拉你就進(jìn)廁所。好了,今天就扯到這里吧,來日方長,各位咱們江湖見,哈哈,對(duì)了各位有誰看見“方長”去了哪個(gè)方向???
(哈哈,小白一枚,若有不對(duì)之處,還望多多指教)
轉(zhuǎn)載于:https://www.cnblogs.com/HelloHai/p/10838749.html
總結(jié)
以上是生活随笔為你收集整理的设计模式之禅(读后感悟随笔)-单一职责原则的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AD铺铜技巧总结
- 下一篇: 华为hn–wx9x笔记本电脑_华为荣耀9