您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“java設(shè)計(jì)模式七大設(shè)計(jì)原則中的單一職責(zé)原則和接口隔離原則介紹”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“java設(shè)計(jì)模式七大設(shè)計(jì)原則中的單一職責(zé)原則和接口隔離原則介紹”吧!
簡單介紹一下七大設(shè)計(jì)原則:
開閉原則:是所有面向?qū)ο笤O(shè)計(jì)的核心,對擴(kuò)展開放,對修改關(guān)閉
依賴倒置原則:針對接口編程,依賴于抽象而不依賴于具體
單一職責(zé)原則:一個接口只負(fù)責(zé)一件事情,只能有一個原因?qū)е骂愖兓?/p>
接口隔離原則:使用多個專門的接口,而不是使用一個總接口
迪米特法則(最少知道原則):只和朋友交流(成員變量、方法輸入輸出參數(shù)),不和陌生人說話,控制好訪問修飾符
里氏替換原則:子類可以擴(kuò)展父類的功能,但不能改變父類原有的功能
合成復(fù)用原則:盡量使用對象組合(has-a)/聚合(contanis-a),而不是繼承關(guān)系達(dá)到軟件復(fù)用的目的
單一職責(zé)(Simple Responsibility Pinciple,SRP)是指不要存在多于一個導(dǎo)致類變更 的原因。
假設(shè)我們有一個 Class 負(fù)責(zé)兩個職責(zé),一旦發(fā)生需求變更,修改其中一個職責(zé)的邏輯代碼,有可能會導(dǎo)致另一個職責(zé)的功能發(fā)生故障。這樣一來,這個 Class 存在兩個導(dǎo) 致類變更的原因。如何解決這個問題呢?我們就要給兩個職責(zé)分別用兩個 Class 來實(shí)現(xiàn), 進(jìn)行解耦。后期需求變更維護(hù)互不影響。這樣的設(shè)計(jì),可以降低類的復(fù)雜度,提高類的 可讀性,提高系統(tǒng)的可維護(hù)性,降低變更引起的風(fēng)險(xiǎn)??傮w來說就是一個 Class/Interface/Method 只負(fù)責(zé)一項(xiàng)職責(zé)。
接下來我們參考《設(shè)計(jì)模式之禪》一書中所提到關(guān)于用戶信息管理的示例來舉例:
新建用戶信息IUserInfo
類:
/** * @author eamon.zhang * @date 2019-09-25 下午4:07 */ public interface IUserInfo { void setUserID(String userID); String getUserID(); void setPassword(String password); String getPassword(); void setUserName(String userName); String getUserName(); boolean changePassword(String oldPassword); boolean deleteUser(); void mapUser(); boolean addOrg(int orgID); boolean addRole(int roleID); }
用戶信息維護(hù)類圖:
如果像這樣子來設(shè)計(jì),即使是一個初級程序員也可以看出這個解耦設(shè)計(jì)得有問題,用戶的屬性和用戶的行為沒有分離開。應(yīng)該把用戶的信息抽離成為一個BO
,把行為抽離成為一個Biz
(業(yè)務(wù)邏輯)。然后我們修改這個接口。 創(chuàng)建 IUserBo
類:
/** * @author eamon.zhang * @date 2019-09-25 下午4:18 */ public interface IUserBO { void setUserID(String userID); String getUserID(); void setPassword(String password); String getPassword(); void setUserName(String userName); String getUserName(); }
創(chuàng)建 IUserBiz
類:
/** * @author eamon.zhang * @date 2019-09-25 下午4:18 */ public interface IUserBiz { boolean changePassword(String oldPassword); boolean deleteUser(); void mapUser(); boolean addOrg(int orgID); boolean addRole(int roleID); }
職責(zé)劃分后的類圖:
我們將IUserInfo
拆分為了IUserBo
和IUserBiz
。我們就實(shí)現(xiàn)了兩個類的單一職責(zé),也就是讓引起他們變化原因只有一種,并且讓相關(guān)性強(qiáng)的內(nèi)容聚合在一個類內(nèi)部。
但是,我們在實(shí)際開發(fā)中會項(xiàng)目依賴,組合,聚合這些關(guān)系,還有還有項(xiàng)目的規(guī)模,周期,技術(shù)人員的水平,對進(jìn)度的把控,很多類都不符合單一職責(zé)。但是,我們在編寫代碼的過程,盡可能地讓接口和方法保持 單一職責(zé),對我們項(xiàng)目后期的維護(hù)是有很大幫助的。
接口隔離原則(Interface Segregation Principle, ISP)是指用多個專門的接口,而不使 用單一的總接口,客戶端不應(yīng)該依賴它不需要的接口。這個原則指導(dǎo)我們在設(shè)計(jì)接口時(shí) 應(yīng)當(dāng)注意一下幾點(diǎn):
一個類對一類的依賴應(yīng)該建立在最小的接口之上。
建立單一接口,不要建立龐大臃腫的接口。
盡量細(xì)化接口,接口中的方法盡量少(不是越少越好,一定要適度)。
接口隔離原則符合我們常說的高內(nèi)聚低耦合的設(shè)計(jì)思想,從而使得類具有很好的可讀性、 可擴(kuò)展性和可維護(hù)性。我們在設(shè)計(jì)接口的時(shí)候,要多花時(shí)間去思考,要考慮業(yè)務(wù)模型,包括以后有可能發(fā)生變更的地方還要做一些預(yù)判。所以,對于抽象,對業(yè)務(wù)模型的理解 是非常重要的。
下面我們來看一段代碼,寫一個動物行為的抽象:
IAnimal
接口:
/** * @author eamon.zhang * @date 2019-09-25 下午4:56 */ public interface IAnimal { void eat(); void fly(); void swim(); }
Bird
類實(shí)現(xiàn):
/** * @author eamon.zhang * @date 2019-09-25 下午4:57 */ public class Bird implements IAnimal { public void eat() { } public void fly() { } public void swim() { } }
Dog
類實(shí)現(xiàn):
/** * @author eamon.zhang * @date 2019-09-25 下午4:57 */ public class Dog implements IAnimal { public void eat() { } public void fly() { } public void swim() { } }
可以看出,Bird
的 swim()
方法可能只能空著,Dog
的 fly()
方法顯然不可能的。這時(shí)候,我們針對不同動物行為來設(shè)計(jì)不同的接口,分別設(shè)計(jì) IEatAnimal
,IFlyAnimal
和 ISwimAnimal
接口,來看代碼:
IEatAnimal
接口:
/** * @author eamon.zhang * @date 2019-09-25 下午4:59 */ public interface IEatAnimal { void eat(); }
IFlyAnimal
接口:
/** * @author eamon.zhang * @date 2019-09-25 下午5:01 */ public interface IFlyAnimal { void fly(); }
ISwimAnimal
接口:
/** * @author eamon.zhang * @date 2019-09-25 下午5:02 */ public interface ISwimAnimal { void swim(); }
Dog
只實(shí)現(xiàn) IEatAnimal
和 ISwimAnimal
接口:
/** * @author eamon.zhang * @date 2019-09-25 下午4:57 */ public class Dog implements IEatAnimal,ISwimAnimal { public void eat() { } public void swim() { } }
來看下兩種類圖的對比,還是非常清晰明了的:
到此,相信大家對“java設(shè)計(jì)模式七大設(shè)計(jì)原則中的單一職責(zé)原則和接口隔離原則介紹”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。