【原創·教程·連載】《Android之大話設計模式》–設計原則 第二章:單一職責原則 喬峰VS慕容複

來源:互聯網
上載者:User
<大話設計模式>本教程說明及著作權聲明

l 該文檔參考和使用了網路上的免費開放的圖片和內容,並以免費開放的方式發布,希望為移動互連網和智能手機時代貢獻綿薄之力!可以隨意轉載,但不得使用該文檔謀利。

l 如果對該文檔有任何疑問或者建議,請進入官方部落格

   http://www.cnblogs.com/guoshiandroid/留言或者直接與國士工作室聯絡(後附連絡方式),我們會謹慎參考您的建議並根據需要對本文檔進行修改,以造福更多開發人員!

l 《大話設計模式》的最新及完整內容會在國士工作室官方部落格定期更新,請訪問國士工作室部落格

http://www.cnblogs.com/guoshiandroid/擷取更多更新內容。

國士工作室是一支專註於Android平台企業級應用開發的技術團隊,致力於做中國最棒的Android應用程式開發機構,提供最棒的Android企業級應用開發培訓服務。

企業培訓和開發合作官方連絡方式:

     電話:18610086859

     Email:hiheartfirst@gmail.com

     QQ:1740415547

     QQ群:148325348

國士工作室 有你更美好!


 

  查看其他部分:本教程整體說明及章節索引

本文PDF下載連結

單一職責原則 喬峰VS慕容複

應用情境舉例


       

       江湖盛傳:北喬峰,南慕容。

       少室山下,天下群雄雲集。

“你們一起來吧,我蕭峰何懼!”,一聲豪情和怒吼,喬峰捲入了和慕容複、遊坦之、丁春秋一決生死之戰。喬峰果然不愧是天下第一豪俠,以一敵三,你來我往,打得不可開交。喬峰使出了降龍十八掌中的“亢龍有悔”,此時慕容複忙往後退,情急之下,使出了自己的絕技“遊龍引鳳”來化解喬峰如此強烈的進攻,此時慕容複雙腿選在了亭子的柱子上,王語嫣心想:“表哥使用遊龍引鳳自然是不會敗的了,可是面對天下眾英雄的面,竟然和遊坦之、丁春秋等這樣的人聯手對付大英雄喬峰,這也有些太不公平了,表哥,你在想些什麼啊?”。此時被喬峰手下保護的段譽心急如焚,心想,這個不行,唯恐大哥有什麼意外,畢竟總是喬峰神功蓋世,眼前面對也是江湖上一流的高手,這樣下去如何是好?突然,段譽掙脫眾人的包括沖了上來,對慕容複使用激將法說:“你們兩個打一個算什麼英雄好漢,慕容複,有本事來和我單打啊!”。慕容複本來就對段譽一直以來對王語嫣的愛慕之意深表不滿,又被他這麼一激怒,怒聲到:“找死!”,就像段譽撲來。此時段譽以從神仙姐姐那裡學來的“淩波微步”的奇功和慕容複糾纏。此時,虛竹正在和收拾丁春秋。而喬峰正在迎戰遊坦之,遊坦之雖然練成了很毒辣的武功,但也絕非是喬峰的對手,數招之內便被喬峰從塔頂扔了下來,結果弄到一個腿部骨折而慘敗的下場!段譽白在慕容複的劍下,寧死不屈。慕容複正欲一劍瞭解了段譽,段正淳喝道:“休傷我兒!”擋住了慕容複的劍。慕容複非常惱怒,數招之內就把慕容複打傷在地。眼看慕容複就要殺死自己父親,躺在地上的段譽“啊”的一聲使出了大理國的絕學“六脈神劍”,幾招之內,慕容複慘敗,正要進一步進攻時,此時他的夢中情人王語嫣柔聲叫到:“段公子手下留情啊”,這段譽,一聽到王語嫣的聲音,就神魂顛倒、不知所以了,慕容複乘此機會偷襲段譽,喬峰見狀,一邊喝道:“三弟小心”,一邊瞬間出手,粉碎了慕容複的武器,慕容複還沒反應過來,就已經被喬峰高高舉起在了半空中,喬峰喝道:“我蕭峰大好男兒,豈能與你這等小人齊名”,隨即把慕容複恨恨的拋了出去!慕容複在天下英雄面前慘敗,自覺顏面無常,欲拔劍自刎,被灰衣人阻攔…

定義: 

單一職責原則(Single Responsibility Principle ):就一個類而言,應該僅有一個引起它變化的原因。換句話說,一個類的功能要單一,只做與它相關的事情。

如果一個完成額外的不太相關的功能或者完成其它類的功能,這就會使得一個引起一個類變化的因素太多,如果類的一處需要修改,其它和它相關連的代碼都會受到影響,這就直接導致一旦系統出現了問題就難以調試困境,同時這樣也非常不利於維護。

遵循單一職責原則也會給測試帶來極大的方便。

違背單一職責原則會降低類的內聚性、增強類的耦合性。        

違背單一職責原則會導致錯誤呈現幾何級數的增長,因為類之間的關聯性太強,每一個類都會對其他類有影響,一個類出現錯誤極可能會導致其他相關聯的類出現錯誤,而且關聯類別聯合起來還有可能產生新的錯誤。

在軟體開發中,人們越來越意識到單一職責原則的重要性,美工只需要負責美工介面,業務層的人員只需寫好業務代碼,而資料層的人員只需關注資料層的工作即可。這樣每個人都以自己專程協同工作,工作效率就得到了大大的提高了。

現在軟體開發的傳統模式MVC模式,也非常好的體現了單一職責原則。MVC(Model-View-Control)就是模型、視圖、控制器三層架構模式,其中M是指資料模型、V是指使用者介面、C則是控制器。採用MVC模式使得資料和表現相分離,同一個資料層可以有不同的顯示層。資料層和顯示層的改變互不影響。這就非常有利於提高軟體的可維護性和可複用性,同時也方便了軟體的管理工作和提高軟體開發效率。

如所示:

故事分析: 

       有王語嫣這個武學博士相助,同時集天下幾乎所有武學與一身“以彼之道,還施彼身”的慕容複卻輸了,輸給了懂得六脈神劍的段譽,

也輸給了用降龍十八掌打遍天下的喬峰。拋開其它的原因不談,慕容複之所以會輸,是因為他雖然懂得很多武功,甚至懂得天下幾乎百分之八十以上的武功,但是因為複國心切,確很少做到能夠精通;從另外一個角度講,也是修鍊這麼多武功害了慕容複。你想啊,一個年紀輕輕的人修鍊這麼多武功,怎麼可能有時間去把每種武功都精通呢,而且還會累的要死。其實,慕容複就像一匹狼一樣,面對著一大群樣,想把每一個都吃掉!結果是可能基本咬死了每一隻羊,卻無暇去好好品嘗和消化。而段譽和喬峰就不一樣了。段譽會六脈神劍。這裡我們主要分析一下喬峰。喬峰自幼被少林寺收養,刻苦勤奮,潛心修鍊降龍十八掌,直至到達無招勝有招的地步。當然喬峰這樣的真英雄、大豪傑自然是實戰經驗豐富的。就這樣,當“以彼之道,還施彼身”的慕容複遇到了用降龍十八掌打遍天下無敵手的喬峰是,慕容複輸了。

       從設計原則的角度考慮,慕容複輸是因為他違背了單一職責原則,他把太多的精力分散於各種武學之中,他迷失在了武學之中。當然,不可否認,慕容複確實是年輕有為的武學天才。但是臨陣實戰的時候講究的是你真正的實力,而不是以懂得的武功的多少決定勝負的。修鍊太多的武功種類必然讓人太累,而且非常容易走火入魔。這就像吃飯一樣,吃了太多未必是什麼好事,而且幾乎肯定不是好事。這是因為,一方面吃了太多,對自己的消化系統和身體都不好,容易發胖等;另外一方面講,吃的多不一定消化的多,而且很多時候反而削弱消化能力,因為吃的太多帶來了太多的負擔,影響了消化系統的功能。而喬峰就不一樣了,他在打好基礎的情況,專註於降龍十八掌,直到能夠隨心所欲、運用自如。當然喬峰這樣的蓋世豪俠對武功本質的和武功精髓的理解也是高於慕容複的。而且,喬峰還有一個特定,就是遇強則強、越戰越勇。

       單一職責原則告訴我們,一個類應該只有一個引起該類變化的原因。這樣有利提高類的可維護性和可複用性。如果把喬峰和慕容複比作兩個類的話,引起喬峰變化的就是降龍十八掌,而且喬峰把降龍十八掌做到了極致,無論是敵是友,喬峰都可以用降龍十八掌化解。而慕容複呢,引起他變化的原因就太多了,雖然“以彼之道,還施彼身”幾乎令所有江湖人士都敬畏三分,但是因為多而不精,遇到像喬峰這樣的高手後,恐怕就無法“以彼之道,還施彼身”了。

       這裡,我們把喬峰的降龍十八掌看做是喬峰的方法,而慕容複懂的武功也看作慕容複擁有的方法,建模的圖形如下:

Java代碼實現: 

喬峰的類:

package com.diermeng.designPattern.SRP;

/*

 * 喬峰

 */

public class Qiaofeng {

    /*

     * 姓名

     */

    String name;

 

    /*

     * 無參構造方法

     */

    public Qiaofeng() {}

    /*

     * 帶參數的構造方法

     */

    public Qiaofeng(String name) {

        this.name = name;

    }

 

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

 

    /*

     * 喬峰的功夫絕技展現

     */

    public void gongfu()

    {

        if(this.getName()!=null){

            System.out.println("我是"+this.getName()+" 使用降龍十八掌,無論是敵是友我都可以應對自如,這都要感謝我遵循了單一職責原則!");

        }

        else{

            System.out.println("使用降龍十八掌,無論是敵是友我都可以應對自如,這都要感謝我遵循了單一職責原則!");

        }

    }

}

 

 

慕容複的類圖:

package com.diermeng.designPattern.SRP;

/*

 * 慕容複

 */

public class MuRongfu {

    /*

     * 姓名

     */

    String name;

 

    /*

     * 無參構造方法

     */

    public MuRongfu() {}

    /*

     * 帶參數的構造方法

     */

    public MuRongfu(String name) {

        this.name = name;

    }

 

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

 

    /*

     * 慕容複的功夫展現

     */

    public void gongfu()

    {

        if(this.getName()!=null){

            System.out.println("我是"+this.getName()+" 我會很多武功,對絕大多數人來說我都可以做到以彼之道還施彼身,但是如果遇到喬峰這樣的高手,我就Over了,這都是沒有遵循單一職責原則惹的禍!");

        }

        else{

            System.out.println(" 我會很多武功,對絕大多數人來說我都可以做到以彼之道還施彼身,但是如果遇到喬峰這樣的高手,我就Over了,這都是沒有遵循單一職責原則惹的禍!");

        }

    }

}

建立一個測試類別,代碼如下:

package com.diermeng.designPattern.SRP.client;

 

import com.diermeng.designPattern.SRP.MuRongfu;

import com.diermeng.designPattern.SRP.Qiaofeng;

 

public class GongfuTest {

 

    /**

     * @param args

     */

    public static void main(String[] args) {

 

        Qiaofeng qiaofeng = new Qiaofeng("喬峰");

        MuRongfu muRongfu = new MuRongfu("慕容複");

 

        qiaofeng.gongfu();

        muRongfu.gongfu();

    }

 

}

程式運行結果如下:

我是喬峰 使用降龍十八掌,無論是敵是友我都可以應對自如,這都要感謝我遵循了單一職責原則!

我是慕容複 我會很多武功,對絕大多數人來說我都可以做到以彼之道還施彼身,但是如果遇到喬峰這樣的高手,我就Over了,這都是沒有遵循單一職責原則惹的禍!

 

已有應用簡介: 

       我們這裡已經以MVC模式為例來分析單一職責原則的應用。

      模型車、視圖層、控制層各司其責、相互獨立,一個模型可以有多個視圖,一個視圖可以有多個控制器,同樣的一個控制器也可以由多個模型。MVC基本的處理流程如下: 使用者與視圖互動,視圖接受並反饋使用者的動作;視圖把使用者的請求傳給相應的控制器,有控制器決定調用哪個模型,然後由模型調用相應的商務邏輯對使用者的請求進行加工處理,如果需要返回資料,模型會把相應的資料返回給控制,由控制器調用相應的視圖,最終由視圖格式化和渲染返回的資料,以一種對使用者儘可能友好的方式展現給使用者。

溫馨提示: 

       專註於一件事情,專註於一切事情。

       如果這個世界每個人都專註於做一件事情,並把這件事情做到極致,世界會是怎樣的一種和諧美好呢?

       遵循單一職責原則的喬峰使少林寺的掃地僧也不禁發出感歎:“降龍十八掌果然天下第一!”

       樹立一個高遠的目標,然後拼盡一切力量的去實現這個目標。

       願單一職責原則保佑您!

注意:該文檔參考和使用了網路上的免費開放的圖片和內容,並以免費開放的方式發布,希望為移動互連網和智能手機時代貢獻綿薄之力!可以隨意轉載,但不得使用該文檔謀利。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.