設計模式的目的
使程式擁有更好的的
- 代碼復用性(一次編譯,處處運行[手動狗頭])
- 可讀性(不可替代性堪憂呀)
- 可擴展性(新增功能時方便)
- 可靠性(新增功能后對舊功能沒有影響)
- 高內聚,低耦合
設計模式的七大原則
設計模式的原則:設計“設計模式”時,遵守的原則,這樣設計的依據
〇、設計模式核心思想
- 找出應用中可能需要變化之處,將其獨立出來,不要和固定不變的代碼混在一起
- 針對介面編程,而不是針對實作介面編程
- 為了互動物件之間的松耦合設計而努力
一、單一職責原則
即一個類只負責一個職責,如有多個職責應分為多個類
- 可以降低類的復雜性,一個類只負責一個職責
- 提高類的可讀性,可維護性
- 降低變更引起的風險
- 通常情況下,我們應當遵守單一職責原則,當類足夠簡單時,可以下放到方法上遵守單一職責原則
二、介面隔離原則
一個類對另一個類的依賴應當建立在最小介面上
如存在一個介面Interface1存在4個方法a()、b()、c()、d(),它有一個實作類Impl1實作了它的四個方法,現存在類Class1需要使用介面中的b()和c()方法,即Class1依賴與Interface1,使用uml類圖表示如圖

對于實作類Impl1來說,a()和d()方法沒有被使用,可以無需實作,卻必須要書寫,此時出現代碼的冗余,根據介面隔離原則,可以將Interface1介面進行拆分

此時如果有另一個類需要使用b()、c()、d()三個方法時,需要將上圖中的Interface2再拆分一次

至此,ClassA對ImplA的依賴,ClassB對ImplB的依賴,建立在最小介面上
三、依賴倒轉原則
- 高層模塊不應該依賴低層模塊,二者都應該依賴其抽象
- 抽象不應該依賴細節,細節應該依賴抽象
- 依賴倒轉的中心思想:面向介面編程
- 依賴倒轉原則的設計理念:相對于細節的多變性,抽象的東西要更為穩定,以抽象為基礎搭建的架構比以細節為基礎的架構更為穩定,
- 使用介面或抽象類的目的是制定好規范,將展示細節的任務交給他們的實作類去完成,
例1:列印出來源的資訊
不遵守依賴倒轉原則的寫法
public class RawDependenceReversal {
public static void main(String[] args) {
Person p = new Person();
p.receive(new Email());
}
}
class Email{
public String getInfo(){
return "電子郵件資訊";
}
}
class Person{
public void receive(Email e){
System.out.println(e.getInfo());
}
}
此時,若Person類可以接收的來源不只是Email,還需要添加其他來源時,會比較麻煩,
遵守依賴倒轉原則進行改進:
public class ImproveDependenceReversal {
public static void main(String[] args) {
Persons p = new Persons();
p.receive(new Emails());
p.receive(new WeChat());
}
}
interface Sender{
public String getInfo();
}
class Emails implements Sender{
@Override
public String getInfo(){
return "電子郵件資訊";
}
}
class WeChat implements Sender{
@Override
public String getInfo() {
return "微信資訊";
}
}
class Persons{
public void receive(Sender e){
System.out.println(e.getInfo());
}
}
依賴倒轉的使用方式示例\
方式1:使用介面方式來進行依賴(呼叫方法時使用介面作為引數),此時,依賴的是介面而不是細節類,因此符合依賴倒轉原則
interface IOpenAndClose{
void open(ITV tv);
}
class OpenAndClose implements IOpenAndClose{
@Override
public void open(ITV tv) {
tv.play();
}
}
interface ITV{
void play();
}
方式2:通過構造方法來進行依賴
interface IOpenAndClose{
void open();
}
interface ITV{
void play();
}
class OpenAndClose implements IOpenAndClose{
public ITV tv;
public OpenAndClose(ITV tv){
this.tv = tv;
}
@Override
public void open() {
this.tv.play();
}
}
方式3:通過setter方法來進行依賴
interface IOpenAndClose{
void open();
public void setTv(ITV tv);
}
interface ITV{
void play();
}
class OpenAndClose implements IOpenAndClose{
private ITV tv;
@Override
public void open() {
this.tv.play();
}
@Override
public void setTv(ITV tv) {
this.tv = tv;
}
}
注意事項和細節
- 低層模塊盡量都要有其對應的高層抽象類或介面,穩定性更好
- 變數的宣告盡量是抽象類或介面,使變數和實際物件之間添加一層緩沖,利于擴展和優化
- 繼承時遵循里氏替換原則
四、里氏替換原則
- 所有參考基類的地方必須能夠透明的使用其子類的物件,
- 使用繼承時,子類盡量不重寫父類方法,
- 繼承實際上提升了類的耦合性,在適當的情況下,可以使用聚合、組合、依賴來解決問題
五、開閉原則
- 模塊和方法應該對擴展(提供方)開放,對修改(使用方)關閉,用抽象構建框架,用實作擴展細節
- 軟體需要變化時,盡量通過擴展物體的方式來實作變化,而不是通過修改現有的代碼來實作庇阿變化
- 其他原則及使用設計模式的目的是遵守開閉原則
六、迪米特法則
- 一個物件應該對其他物件保持最小的了解,
- 迪米特法則又稱為最小知道原則,一個類對于其依賴的類,不管它多么復雜,都只關心其提供的
public方法, - 迪米特法則就是只與直接的朋友通信
- 直接的朋友:出現在成員變數、方法引數、方法回傳值的類稱為直接的朋友,出現在區域變數(方法內部的變數)的類不是直接的朋友,
七、合成復用原則
- 盡量使用合成/聚合的關系,而不是使用繼承
設計模式分類
23種分為三大類
-
創建型模式
單例模式、抽象工廠模式、原型模式、建造者模式、工廠模式
-
結構型模式
配接器模式、橋接模式、裝飾模式、組合模式、外觀模式、享元模式、代理模式
-
行為型模式
模板方法模式、命令模式、訪問者模式、迭代器模式、觀察者模式、中介者模式、備忘錄模式、解釋器模式、狀態模式、策略模式、職責鏈模式
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/245132.html
標籤:設計模式
