設計模式學習:開閉原則

來源:互聯網
上載者:User

上面講完序,就開始講開閉原則,有點不太優雅,不過,正如我說的,在學之前,周圍的人和老師,網路上的人都覺得這個不錯,你不太清楚,那麼就學學吧,學完之後,再仔細去整合,思考,去除雜質,保留精華。在學的過程中總是不斷自己停下來仔細思考的方式,我並不推薦學技術的人幹(當然立志科研的人一定要有這種鑽研精神),因為太耗時間。而且有時候你會發現,你疑問的就是後面提到的。嘮叨完畢,開始講講開閉原則。

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部落格 鐘桓

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.