分類 | 設計模式 |
---|---|
創建型 | 工廠方法模式(Factory Method)、抽象工廠模式(Abstract Factory)、建造者模式(Builder)、原型模式(Prototype)、單例模式(Singleton) |
結構型 | 適配器模式(Adapter)、橋接模式(Bridge)、組合模式(Composite)、裝飾器模式(Decorator)、門面模式(Facade)、享元模式(Flyweight)、代理模式(Proxy) |
行爲型 | 解釋器模式(Interpreter)、模板方法模式(Template Method)、責任鏈模式(Chain of Responsibility)、命令模式(Command)、迭代器模式(Iterator)、調解者模式(Mediator)、備忘錄模式(Memento)、觀察者模式(Observer)、狀態模式(State)、策略模式(Strategy)、訪問者模式(Visitor) |
設計模式之間的關聯關係和對比
單例模式和工廠模式
實際業務代碼中,通常會把工廠類設計爲單例。
策略模式和工廠模式
- 工廠模式包含工廠方法模式和抽象工廠模式是創建型模式,策略模式屬於行爲型模式。
- 工廠模式主要目的是封裝好創建邏輯,策略模式接收工廠創建好的對象,從而實現不同的行爲。
策略模式和委派模式
- 策略模式是委派模式內部的一種實現形式,策略模式關注的結果是否能相互替代。
- 委派模式更關注分發和調度的過程。
模板方法模式和工廠方法模式
- 工廠方法是模板方法的一種特殊實現。
- 對於工廠方法模式的 create()方法而言,相當於只有一個步驟的模板方法模式。這一個步驟交給子類去實現。而模板方法呢,將 pourVegetables()方法和 pourSauce()方法交給子類實現,pourVegetables()方法和 pourSauce()方法又屬於父類的某一個步驟且不可變更。
模板方法模式和策略模式
- 模板方法和策略模式都有封裝算法。
- 策略模式是使不同算法可以相互替換,且不影響客戶端應用層的使用。
- 模板方法是針對定義一個算法的流程,將一些有細微差異的部分交給子類實現。
- 模板方法模式不能改變算法流程,策略模式可以改變算法流程且可替換。策略模式通
裝飾者模式和靜態代理模式
- 裝飾者模式關注點在於給對象動態添加方法,而代理更加註重控制對對象的訪問。
- 代理模式通常會在代理類中創建被代理對象的實例,而裝飾者模式通常把被裝飾者作爲構造參數。
裝飾者模式和適配器模式
- 裝飾者模式和適配器模式都是屬於包裝器模式(Wrapper Pattern)。
- 裝飾者模式可以實現被裝飾者與相同的接口或者繼承被裝飾者作爲它的子類,而適配器和被適配者可以實現不同的接口。
適配器模式和靜態代理模式
適配器可以結合靜態代理來實現,保存被適配對象的引用,但不是唯一的實現方式。
適配器模式和策略模式
在適配業務複雜的情況下,利用策略模式優化動態適配邏輯。
Spring 中常用的設計模式對比
設計模式 | 一句話歸納 | 舉例 |
---|---|---|
工廠模式(Factory) | 只對結果負責,封裝創建過程 | BeanFactory、Calender |
單例模式(Singleton) | 保證獨一無二 | ApplicationContext、Calender |
原型模式(Prototype) | 拔一根猴毛,吹出千萬個 | ArrayList、PrototypeBean |
代理模式(Proxy) | 找人辦事,增強職責 | ProxyFactoryBean、JdkDynamicAopProxy、CglibAopProxy |
委派模式(Delegate) | 幹活算你的(普通員工),功勞算我的(項目經理) | DispatcherServlet、BeanDefinitionParserDelegate |
策略模式(Strategy) | 用戶選擇,結果統一 | InstantiationStrategy |
模板模式(Template) | 流程標準化,自己實現定製 | JdbcTemplate、HttpServlet |
適配器模式(Adapter) | 兼容轉換頭、充電器 | AdvisorAdapter、HandlerAdapter |
裝飾器模式(Decorator) | 包裝,同宗同源 | BufferedReader、InputStream、OutputStream、HttpHeadResponseDecorator |
觀察者模式(Observer) | 任務完成時通知 | ContextLoaderListener |
Spring 中的編程思想總結
Spring 思想 | 應用場景(特點) | 一句話歸納 |
---|---|---|
OOP | Object Oriented Programming(面向對象編程)用程序歸納總結生活中一切事物 | 封裝、繼承、多態 |
BOP | Bean Oriented Programming(面向 Bean 編程)面向 Bean(普通的 Java 類)設計程序,解放程序員 | 一切從 Bean 開始。 |
AOP | Aspect Oriented Programming(面向切面編程)找出多個類中有一定規律的代碼,開發時拆開,運行時再合併。面向切面編程,即面向規則編程 | 解耦,專人做專事 |
IOC | Inversion of Control(控制反轉)將 new 對象的動作交給 Spring 管理,並由Spring 保存已創建的對象(IOC 容器) | 轉交控制權(即控制權反轉) |
DI/DL | Dependency Injection(依賴注入)或者Dependency Lookup(依賴查找)依賴注入、依賴查找,Spring不僅保存自己創建的對象,而且保存對象與對象之間的關係。注入即賦值,主要三種方式構造方法、set 方法、直接賦值 | 賦值 |
學習 AOP 之前必須明白的幾個概念:
- Aspect(切面):通常是一個類,裏面可以定義切入點和通知。
- JointPoint(連接點):程序執行過程中明確的點,一般是方法的調用。
- Advice(通知):AOP 在特定的切入點上執行的增強處理,有 before、after、afterReturning、afterThrowing、around
- Pointcut(切入點):就是帶有通知的連接點,在程序中主要體現爲書寫切入點表達式AOP 框架創建的對象,實際就是使用代理對目標對象功能增強。Spring 中的 AOP 代理可以使 JDK 動態代理,也可以是 CGLIB 代理,前者基於接口,後者基於子類。
AOP 在 Spring 中的應用
SpringAOP 是一種編程範式,主要目的是將非功能性需求從功能性需求中分離出來,達到解耦的目的。主要應用場景有:Authentication(權限認證)、Auto Caching(自動緩存處理)、Error Handling(統一錯誤處理)、Debugging(調試信息輸出)、Logging(日誌記錄)、Transactions(事務處理)