裝飾者模式的應用場景

2021-10-10 09:26:20 字數 4067 閱讀 8267

裝飾者模式(decorator pattern)是指在不改變原有物件的基礎之上,將功能附加到物件上,提供了比繼承更有彈性的替代方案(擴充套件原有物件的功能),屬於結構型模式。裝飾者模式在我們生活中應用也比較多如給煎餅加雞蛋;給蛋糕加上一些水果;給房子裝修等,為物件擴充套件一些額外的職責。裝飾者在**程式中適用於以下場景:

1、用於擴充套件乙個類的功能或給乙個類新增附加職責。

2、動態的給乙個物件新增功能,這些功能可以再動態的撤銷。

來看乙個這樣的場景,上班族白領其實大多有睡懶覺的習慣,每天早上上班都是踩點,於是很多小夥伴為了多賴一會兒床都不吃早餐。那麼,也有些小夥伴可能在上班路上碰到賣煎餅的路邊攤,都會順帶乙個到公司茶水間吃早餐。賣煎餅的大姐可以給你的煎餅加雞蛋,也可以加香腸。

下面我們用**還原一下碼農的生活。首先建立乙個煎餅battercake 類:

public class battercake 

public int getprice()

}

建立乙個加雞蛋的煎餅battercakewithegg 類

public class battercakewithegg extends battercake

@override

//加乙個雞蛋加1塊錢

public int getprice()

}

再建立乙個既加雞蛋又加香腸的battercakewitheggandsausage 類:

public class battercakewitheggandsausage extends battercakewithegg

@override

//加乙個香腸加2塊錢

public int getprice()

}

編寫客戶端測試**:

public class battercaketest 

}

執行結果沒有問題。但是,如果使用者需要乙個加2 個雞蛋加1 根香腸的煎餅,那麼用我們現在的類結構是建立不出來的,也無法自動計算出**,除非再建立乙個類做定製。如果需求再變,一直加定製顯然是不科學的。那麼下面我們就用裝飾者模式來解決上面的問題。首先建立乙個建煎餅的抽象battercake 類:

public abstract class battercake
建立乙個基本的煎餅(或者叫基礎**)basebattercake:

public class basebattercake extends battercake 

public int getprice()

}

然後,再建立乙個擴充套件**的抽象裝飾者battercakedecotator 類:

public abstract class battercakedecorator extends battercake 

protected abstract void dosomething();

@override

protected string getmsg()

@override

protected int getprice()

}

然後,建立雞蛋裝飾者eggdecorator 類:

public class eggdecorator extends battercakedecorator 

protected void dosomething()

@override

protected string getmsg()

@override

protected int getprice()

}

建立香腸裝飾者sausagedecorator 類:

public class sausagedecorator extends battercakedecorator 

protected void dosomething()

@override

protected string getmsg()

@override

protected int getprice()

}

編寫客戶端測試**:

public class battercaketest 

}

為了加深印象,我們再來看乙個應用場景。是否還有小夥伴記得我們上次講個的介面卡模式,為了實現新功能與老功能相容,建立乙個新的類繼承已有的類,實現功能擴充套件,遵循開閉原則。今天我們再用裝飾者模式再來公升級一次**,同時也做乙個更好的對比。先看原來的**,member 類:

public class member 

public void setusername(string username)

public string getpassword()

public void setpassword(string password)

public string getmid()

public void setmid(string mid)

public string getinfo()

public void setinfo(string info)

}

resultmsg 類:

public class resultmsg 

public int getcode()

public void setcode(int code)

public string getmsg()

public void setmsg(string msg)

public object getdata()

public void setdata(object data)

}

isigninservice 介面:

public inte***ce isigninservice
signinservice 實現類:

public class signinservice implements isigninservice 

/*** 登入的方法

* @param username

* @param password

* @return

*/public resultmsg login(string username,string password)

}

建立新的邏輯處理類signinforthirdservice,實現新建立的介面:

public class siginforthirdservice implements isiginforthirdservice 

public resultmsg regist(string username, string password)

public resultmsg login(string username, string password)

public resultmsg loginforqq(string id)

public resultmsg loginforwechat(string id)

public resultmsg loginfortoken(string token)

public resultmsg loginfortelphone(string telphone, string code)

public resultmsg loginforregist(string username, string passport)

}

客戶端測試**:

public class decoratortest 

}

裝飾者模式最本質的特徵是講原有類的附加功能抽離出來,簡化原有類的邏輯。通過這樣兩個案例,我們可以總結出來,其實抽象的裝飾者是可有可無的,具體可以根據業務模型來選擇。

觀察者模式應用場景例項

觀察者模式應用場景例項 場景描述 哈票以購票為核心業務 此模式不限於該業務 但圍繞購票會產生不同的其他邏輯,如 1 購票後記錄文字日誌 2 購票後記錄資料庫日誌 3 購票後傳送簡訊 4 購票送抵扣卷 兌換卷 積分 5 其他各類活動等 傳統解決方案 在購票邏輯等類內部增加相關 完成各種邏輯。存在問題 ...

觀察者模式應用場景例項

觀察者模式應用場景例項 場景描述 哈票以購票為核心業務 此模式不限於該業務 但圍繞購票會產生不同的其他邏輯,如 1 購票後記錄文字日誌 2 購票後記錄資料庫日誌 3 購票後傳送簡訊 4 購票送抵扣卷 兌換卷 積分 5 其他各類活動等 傳統解決方案 在購票邏輯等類內部增加相關 完成各種邏輯。存在問題 ...

設計模式應用場景

設計模式應用場景 1 command 建立和執行事務 實體上的解耦 時間上的解耦 undo方法 2 active object模式 該模式與command模式結合 實現多執行緒控制的一項古老的技術,為許多任務業系統提供了乙個簡單的多工核心。3 template method 與 strategy 分...