23種設計模式總篇:chenmingyu.top/design/java
命令模式屬於行爲型模式git
定義:將一個請求封裝成一個對象,從而讓你使用不一樣的請求把客戶端參數化,對請求排隊或者記錄請求日誌,能夠提供命令的撤銷和恢復功能github
角色:算法
Receiver
最後的執行者,具體的業務邏輯Command
須要執行的全部命令都在這裏聲明ConcreteCommand
實現Command
接口Invoker
接收到命令,並執行命令,命令中調用接受者Command
類的子類若是命令比較多,Command
類的子類就會變得很是的多設計模式
源碼地址:github.com/mingyuHub/d…數據結構
接受者有兩個方法,打遊戲和學習,經過實現命令接口寫了兩個具體的命令實現類,分別表明玩遊戲命令和學習命令,經過調用者去調用不一樣的命令ide
/** * @author: chenmingyu * @date: 2019/3/25 10:48 * @description: 接受者角色 */
public class Receive {
public void play(){
System.out.println("打遊戲吧");
}
public void study(){
System.out.println("要學習了");
}
}
複製代碼
/** * @author: chenmingyu * @date: 2019/3/25 10:51 * @description: 命令接口 */
public interface Commandable {
/** * 命令執行接口 */
void execute();
}
複製代碼
持有receive
實例性能
/** * @author: chenmingyu * @date: 2019/3/25 10:52 * @description: 玩遊戲命令 */
public class GameCommand implements Commandable{
private Receive receive;
public GameCommand(Receive receive) {
this.receive = receive;
}
@Override
public void execute() {
this.receive.play();
}
}
複製代碼
持有receive
實例學習
/** * @author: chenmingyu * @date: 2019/3/25 10:54 * @description: 學習命令 */
public class StudyCommand implements Commandable {
private Receive receive;
public StudyCommand(Receive receive) {
this.receive = receive;
}
@Override
public void execute() {
this.receive.study();
}
}
複製代碼
持有Commandable
的實現類的實例ui
/** * @author: chenmingyu * @date: 2019/3/25 10:51 * @description: 調用者 */
@Data
public class Invoker {
/** * 持有Commandable的實現類的實例 */
private Commandable commandable;
/** * 執行命令 */
public void action(){
this.commandable.execute();
}
}
複製代碼
public static void main(String[] args) {
Invoker invoker = new Invoker();
Receive receive = new Receive();
Commandable gameCommand = new GameCommand(receive);
invoker.setCommandable(gameCommand);
invoker.action();
Commandable studyCommand = new StudyCommand(receive);
invoker.setCommandable(studyCommand);
invoker.action();
}
複製代碼
輸出
打遊戲吧
要學習了
複製代碼
設計模式之禪:www.kancloud.cn/sstd521/des…
建立型設計模式
關注於如何建立對象
保證在程序運行期間一個類只有一個實例,並提供一個全局訪問點
用工廠方法代替new操做,讓子類去決定實例化哪一個類,工廠方法將一個類的實例化延遲到子類
抽象工廠模式屬於建立型模式,是對工廠方法模式的擴展,抽象工廠比工廠模式更爲抽象,工廠方法模式針對產品等級結構,而抽象工廠針對產品族
經過克隆一個已經存在的對象實例來返回新的實例,而不是經過new去建立對象
經過克隆一個已經存在的對象實例來返回新的實例,而不是經過new去建立對象
結構型設計模式
關注於類和對象之間的關係
組合兩個不相干類,在兩個不兼容的接口之間提供一個混合接口,使其兼容適配
將抽象部分與它的實現部分分離,使它們均可以獨立地變化。橋接模式將系統各維度抽象出來,各維度獨立變化,以後可經過聚合,將各維度組合起來,減小它們之間耦合
用來描述部分與總體的關係,是用於把一組類似的對象看成一個單一的對象。組合模式依據樹形結構來組合對象,因此組合模式的使用場景就是出現樹形結構的地方。
裝飾器模式能夠爲一個現有的類增長新功能,又不改變其結構,要求裝飾類和被裝飾類實現同一個接口,裝飾類持有被裝飾類的實例
外觀模式是爲了解決類與類之家的責任關係和依賴關係的,經過提供一個Facade類來隱藏這些複雜的類之間關係的調用,並提供一個接口,供外部調用,利用這種方式進行類之間的解耦
代理模式就是在操做原對象的時候,多出來一個代理類,用來對原對象的訪問進行控制和替代原對象進行一些操做
運用共享技術有效地支持大量細粒度對象的複用,主要用來減小對象的建立,用來減小內存和提升性能,比較常見的鏈接池,緩衝池這類的池技術都是享元模式
行爲型設計模式
關注於對象之間的通訊
在父類(抽象類)中定義好算法的流程,提供抽象方法,針對不一樣的實現交由不一樣的子類去實現,經過這種方式將公共代碼提取出來封裝在父類中,而後父類去控制行爲,子類負責實現
在系統中提供一組策略,並將每一個策略封裝成類,使他們能夠相互轉換,具體策略的選擇由客戶端決定
定義對象間一種一對多的依賴關係,使得每當一個對象改變狀態,則全部依賴於它的對象都會獲得通知並被自動更新
迭代器模式就是爲解決遍歷元素而誕生的,它提供一種方法訪問一個容器對象中各個元素,而又不需暴露該對象的內部細節
使多個對象都有機會處理請求,從而避免了請求的發送者和接受者之間的耦合關係。將這些對象連成一條鏈,並沿着這條鏈傳遞該請求,直到有對象處理它爲止
將一個請求封裝成一個對象,從而讓你使用不一樣的請求把客戶端參數化,對請求排隊或者記錄請求日誌,能夠提供命令的撤銷和恢復功能,用來下降類之間解耦
在不破壞封裝性的前提下,捕獲一個對象的內部狀態,並在該對象以外保存這個狀態。這樣之後就可將該對象恢復到原先保存的狀態,其實就是在某個時刻備份了對象的狀態,在更改對象狀態後,能夠經過備份將對象還原成備份時刻的狀態
容許一個對象在其內部狀態改變時改變它的行爲,對象看起來彷佛修改了它的類,對象的行爲依賴於它的狀態(屬性),而且能夠根據它的狀態改變而改變它的相關行爲
封裝一些做用於某種數據結構中的各元素的操做,它能夠在不改變數據結構的前提下定義做用於這些元素的新的操做,訪問者模式就是將數據結構與數據操做相分離
用一箇中介對象來封裝一系列的對象交互,中介者使各對象不須要顯式地相互引用,從而使其耦合鬆散,並且能夠獨立地改變它們之間的交互
給定一門語言,定義它的文法的一種表示,並定義一個解釋器,該解釋器使用該表示來解釋語言中的句子