摘要:開放封閉原則是面向?qū)ο笤O(shè)計(jì)的核心所在,遵循這個(gè)原則可以避免許多不可避免的麻煩。而且能極大的增加軟件的可擴(kuò)展性可維護(hù)性和可復(fù)用性。依賴倒轉(zhuǎn)原則定義高層模塊不應(yīng)該依賴低層模塊。
1.最重要的原則:開放-封閉原則
定義:原件實(shí)體(類、模塊、函數(shù)等等)應(yīng)該可以擴(kuò)展,但是不可修改
public class Calculate { public void operate(int a, int b, String symbol) throws Exception { if (symbol.equals("+")) { System.out.println("結(jié)果為" + (a + b)); } else if (symbol.equals("-")) { System.out.println("結(jié)果為" + (a - b)); } else if (symbol.equals("*")) { System.out.println("結(jié)果為" + a * b); } else if (symbol.equals("/")) { System.out.println("結(jié)果為" + a / b); } else { throw new Exception("非法操作符!"); } } } public class Test { public static void main(String[] args) throws Exception { Calculate c = new Calculate(); c.operate(10, 5, "+");// 結(jié)果為15 c.operate(10, 5, "-");// 結(jié)果為5 c.operate(10, 5, "*");// 結(jié)果為50 c.operate(10, 5, "/");// 結(jié)果為2 c.operate(10, 5, "^");// 此操作為乘方,拋出異常:非法操作符 } }
結(jié)果顯而易見,最開始我們要做四則運(yùn)算,后來又想加入乘方運(yùn)算,由于程序最初的時(shí)候并沒有考慮到乘方的運(yùn)算,此時(shí)就得更改源代碼;舉一反三,三角函數(shù)的運(yùn)算怎么辦?再次違反開放-封閉原則改變?cè)创a?所以,在需求變化時(shí),一個(gè)類(單元,最好具有原子性,也有可能是方法)的功能要盡可能的唯一,只做一件事。 開放-封閉原則是面向?qū)ο笤O(shè)計(jì)的核心所在,遵循這個(gè)原則可以避免許多不可避免的麻煩。而且能極大的增加軟件的可擴(kuò)展性、可維護(hù)性和可復(fù)用性。2.單一職能原則
定義:就一個(gè)類而言,應(yīng)該僅有一個(gè)引起它變化的原因
還是四則運(yùn)算,在這里我們把它做一個(gè)重構(gòu)
/** * 抽象工廠 */ interface IFactory { Integer result(int a,int b); } /** * 加法工廠 */ class AddFactory implements IFactory { @Override public Integer result(int a,int b) { return a+b; } } /** * 減法工廠 */ class SubFactory implements IFactory { @Override public Integer result(int a, int b) { return a-b; } } /** * 乘法工廠 */ class MulFactory implements IFactory { @Override public Integer result(int a, int b) { return a*b; } } /** * 除法工廠 */ class DivFactory implements IFactory { @Override public Integer result(int a, int b) { return a/b; } } /** * 測(cè)試不再贅述,為了省事沒有拋異常 :) */ public static void main(String[] args) throws Exception { IFactory factory = new AddFactory(); Integer result = factory.result(10, 5); System.out.println(result);// 15 }
這樣的話,如果再引起需求變動(dòng),(假設(shè)我們就是兩個(gè)數(shù)的運(yùn)算),直接增加類實(shí)現(xiàn)IFactory接口就可以了,是不是很方便(#^.^#),保證了開放-封閉原則的基礎(chǔ)上,單一職能。
3.依賴倒轉(zhuǎn)原則定義:
a.高層模塊不應(yīng)該依賴低層模塊。兩個(gè)都應(yīng)該依賴抽象。
b.抽象不應(yīng)該依賴細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴抽象。
說白了,要盡量針對(duì)抽象(abstract)類編程,或者針對(duì)接口(interface)編程(第二段代碼),不要針對(duì)實(shí)現(xiàn)編程(第一段代碼)。
再舉個(gè)栗子:就拿U盤的插口為例吧。U盤作為讀寫信息的一個(gè)媒介,需要連入到PC機(jī)上,如果全世界不統(tǒng)一為一個(gè)USB接口的話,那么只做U盤的廠商要針對(duì)聯(lián)想做一種,Mac做一種,戴爾做一種……想想都很可怕,所以才會(huì)出現(xiàn)USB接口規(guī)范這個(gè)抽象的概念,大家針對(duì)這個(gè)規(guī)范制作U盤就可以了。
定義:子類型必須能夠替換掉他們的父類型
public class Father { public void doSome(){ System.out.println("做數(shù)學(xué)運(yùn)算"); } } public class Son extends Father { public void method() { System.out.println("做語文運(yùn)算"); } } public static void main(String[] args) { Father test = new Son(); test.doSome(); }
可能我這里舉的栗子不太恰當(dāng),但也反映出我想表達(dá)的意思了;就是說子類所重寫的方法完全不是父類所需要的方法了,這對(duì)客戶端來說是不可思議的。
5.迪米特法則定義:如果兩個(gè)類不必彼此直接通信,那么這兩個(gè)雷就不應(yīng)當(dāng)發(fā)生直接的相互作用。如果其中一個(gè)類需要調(diào)用另一個(gè)類的某一個(gè)方法的話,可以通過第三者轉(zhuǎn)發(fā)這個(gè)調(diào)用。
根本思想就是強(qiáng)調(diào)了類之間的松耦合
舉個(gè)栗子:你公司的維修部管維修電子設(shè)備,其中一個(gè)專人A負(fù)責(zé)修PC機(jī);你電腦壞了,需要修理,打電話給A,A恰好不在,需要等到A回來才能修電腦,但是你又急用電腦,造成了公司資源的浪費(fèi)(專人A相當(dāng)于維修部的一個(gè)實(shí)例,也就是對(duì)象)。
換個(gè)角度考慮,公司所有人都可以維修PC機(jī),你直接給維修部打電話,要他們派人過來維修你的電腦(這時(shí)候,只是維修部需要關(guān)心派誰去維修電腦,你就不需要關(guān)心是誰來了)。不針對(duì)具體,只針對(duì)抽象.
定義:一個(gè)接口擁有的行為應(yīng)該盡可能的少
舉個(gè)栗子:一般手機(jī)只需要滿足打電話發(fā)短信就OK了,不需要其它額外的行為;由此可以衍生出新的接口,智能手機(jī)繼承手機(jī),添加新行為:玩王者榮耀,老年機(jī)玩不了王者榮耀,只有現(xiàn)在的智能機(jī)才能玩王者榮耀,如果把playKingOfGlory方法作為Phone接口中的方法就顯得不太合適了。
public interface Phone { void call(); void sendMessage(); } public interface SmartPhone extends Phone{ public void playKingOfGlory(); }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/70571.html
摘要:設(shè)計(jì)模式提供六個(gè)基本原則,分別是開閉原則單一職責(zé)原則里氏替換原則依賴倒置原則接口隔離原則迪米特法則開閉原則對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉。總結(jié)六大設(shè)計(jì)原則是代碼設(shè)計(jì)的基本原則。 JAVA設(shè)計(jì)模式提供六個(gè)基本原則,分別是: 開閉原則(OCP) - The Open-Closed Principle 單一職責(zé)原則(SRP) - Single Responsibility Principle 里氏...
摘要:首先先祝大家國(guó)慶節(jié)快樂今天距離為我運(yùn)營(yíng)公眾號(hào)已經(jīng)一個(gè)月了,今天把文章整合一下,希望對(duì)大家有幫助,也謝謝朋友的支持,我會(huì)繼續(xù)堅(jiān)持原創(chuàng),寫更好的文章給大家一視頻獲取學(xué)習(xí)資源分享合集二功能篇實(shí)現(xiàn)金額的語音播報(bào)功能基于模式風(fēng)格的封裝之路炫酷動(dòng)畫跳 showImg(https://segmentfault.com/img/remote/1460000011437678?w=900&h=500);...
摘要:首先先祝大家國(guó)慶節(jié)快樂今天距離為我運(yùn)營(yíng)公眾號(hào)已經(jīng)一個(gè)月了,今天把文章整合一下,希望對(duì)大家有幫助,也謝謝朋友的支持,我會(huì)繼續(xù)堅(jiān)持原創(chuàng),寫更好的文章給大家一視頻獲取學(xué)習(xí)資源分享合集二功能篇實(shí)現(xiàn)金額的語音播報(bào)功能基于模式風(fēng)格的封裝之路炫酷動(dòng)畫跳 showImg(https://segmentfault.com/img/remote/1460000011437678?w=900&h=500);...
摘要:方法比如一個(gè)修改用戶名和密碼的需求,我們把它寫在一個(gè)方法里天津市上述代碼的方法職責(zé)不明確,既有修改用戶名又修改地址,不符合單一職責(zé)原則。 Android學(xué)習(xí)資源分享合集(1)-視頻資源 簡(jiǎn)介: 單一職責(zé)原則(SRP:Single responsibility principle),它規(guī)定一個(gè)類應(yīng)該只有一個(gè)發(fā)生變化的原因。所謂職責(zé)是指類變化的原因。如果一個(gè)類有多于一個(gè)的動(dòng)機(jī)被改變,那么這...
閱讀 3715·2021-10-18 13:34
閱讀 2406·2021-08-11 11:15
閱讀 1206·2019-08-30 15:44
閱讀 696·2019-08-26 10:32
閱讀 992·2019-08-26 10:13
閱讀 2067·2019-08-23 18:36
閱讀 1781·2019-08-23 18:35
閱讀 528·2019-08-23 17:10