編輯:Android開發實例
單一職責原則 喬峰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基本的處理流程如下:用戶與視圖交互,視圖接受並反饋用戶的動作;視圖把用戶的請求傳給相應的控制器,有控制器決定調用哪個模型,然後由模型調用相應的業務邏輯對用戶的請求進行加工處理,如果需要返回數據,模型會把相應的數據返回給控制,由控制器調用相應的視圖,最終由視圖格式化和渲染返回的數據,以一種對用戶盡可能友好的方式展現給用戶。
溫馨提示:
專注於一件事情,專注於一切事情。
如果這個世界每個人都專注於做一件事情,並把這件事情做到極致,世界會是怎樣的一種和諧美好呢?
遵循單一職責原則的喬峰使少林寺的掃地僧也不禁發出感歎:“降龍十八掌果然天下第一!”
樹立一個高遠的目標,然後拼盡一切力量的去實現這個目標。
願單一職責原則保佑您!
注意:該文檔參考和使用了網絡上的免費開放的圖片和內容,並以免費開放的方式發布,希望為移動互聯網和智能手機時代貢獻綿薄之力!可以隨意轉載,但不得使用該文檔謀利。
轉自:http://www.cnblogs.com/guoshiandroid/archive/2010/06/08/1754261.html
學習目的: 1、掌握在Android中如何建立CheckBox 2、掌握CheckBox的常用屬性 3、掌握CheckBox選中狀態變換的事件(監聽器) Chec
可以顯示在的Android任務,通過加載進度條的進展。進度條有兩種形狀。加載欄和加載微調(spinner)。在本章中,我們將討論微調(spinner)。Spinner 用
本文實例展示了Android中實現為TextView添加多個可點擊的文本的方法。該功能在Android社交軟件的制作中非常具有實用價值。分享給大家供大家參考。具體
最近事情很忙,一個新項目趕著出來,但是很多功能都要重新做,一直在編寫代碼、Debug。今天因為一個新程序要使用Fragment來做,雖然以前也使用過Fragmen