上面講完序,就開始講開閉原則,有點不太優雅,不過,正如我說的,在學之前,周圍的人和老師,網路上的人都覺得這個不錯,你不太清楚,那麼就學學吧,學完之後,再仔細去整合,思考,去除雜質,保留精華。在學的過程中總是不斷自己停下來仔細思考的方式,我並不推薦學技術的人幹(當然立志科研的人一定要有這種鑽研精神),因為太耗時間。而且有時候你會發現,你疑問的就是後面提到的。嘮叨完畢,開始講講開閉原則。
1988年,勃蘭特·梅耶(Bertrand Meyer)在他的著作《物件導向軟體構造(Object Oriented Software Construction)》中提出了開閉原則,它的原文是這樣:“Softwareentities should be open for extension, but closed for modification”。翻譯過來就是:“軟體實體應當對擴充開放,對修改關閉”。
定義有點虛,可能你也會覺得矛盾,其實就是,你要改程式的,增加新的功能,那麼不準修改原來的程式碼,只能增加新的代碼。為什麼要這樣呢?疑問在心頭,解決疑問的方式,讓我們用舉例來回答吧。
讓我們來用NBA的籃球明星來舉例好不好(體諒下作者是籃球迷吧!)。不懂籃球的同學也沒關係,不會要求有專業知識。我們都明白,每個人的習慣是不一樣的,籃球明星是人,所以籃球明星們的一些習慣是不一樣的(這句話是為了回憶那些證明題╮(╯▽╰)╭)。有些籃球明星,比如科比,身體比較平均。詹姆斯,身體比較粗壯。艾弗森,身體比較瘦小。既然他們的身體不一樣,那麼他們的得分技巧必然不同,我們就寫一個能夠表示NBA球星的吧!
import java.util.*; //將技巧抽象為一個方法,單獨拿出來 interface Skill{ public void skill(); }; //詹姆斯的技巧 class JamesSkill implements Skill{ public void skill() { System.out.println("詹姆斯的技巧:戰斧式扣籃"); } }; //科比的技巧 class KobeSkill implements Skill{ public void skill() { System.out.println("科比的技巧: 後仰跳投"); } }; //艾弗森的技巧 class AISkill implements Skill{ public void skill() { System.out.println("艾弗森的技巧: 變相"); } }; /* URL地址:http://www.bianceng.cn/Programming/project/201602/49625.htm 抽象的方法拿出來後,有不同的類來實現抽象方法這個介面,讓不同的選手持有不同的行為類,這個設計方案叫做封裝可變形。 同時,在後面的設計模式中我們也會講到,這個叫做策略模式 */class NBAPlayer { //姓名 private String name; private Skill skill; public NBAPlayer(String name,Skill skill){ this.name=name; this.skill=skill; } public void setSkill(Skill skill){ this.skill=skill; } public Skill getSkill(){ return skill; } public String getName(){ return name; } public void action(){ skill.skill(); } }; public class Main{ public static void main(String args[]) { //不同的技巧 Skill jamesSkill=new JamesSkill(); Skill kobeSkill=new KobeSkill(); Skill aiSkill=new AISkill(); //不同的球員 NBAPlayer james=new NBAPlayer("James",jamesSkill); NBAPlayer kobe=new NBAPlayer("kobe",kobeSkill); NBAPlayer ai=new NBAPlayer("AI",aiSkill); //會有不同的表現 james.action(); kobe.action(); ai.action(); } }
代碼可以這裡下載https://github.com/ZHONGHuanGit/DesignPattern
從代碼中我們看到,不同的NBAPlayer的行為被抽象為一個介面,具體的實現放在具體的類中。之所以這樣設計,是為了符合開閉原則。現在我們可以想想,當我們有新的球員來了,它的技巧是不一樣的,這個時候我們就可以建立一個類,實現Skill介面,然後作為對象屬性存在球員對象中。這樣的優點,就是做的優點就是,新的球員增加不會更改原有的代碼,只需要增加新的代碼即可。是不是很不錯啊,在設計中,我們盡量把代碼中,將來可能會發生變化的地方封裝起來,拿出去,用抽象的類封裝,具體的實現放在後面的具體類中。因為我們更改起代碼會特別方便。
Author:csdn部落格 鐘桓