1. 程式人生 > >常用設計模式詳解,附設計系統思路圖

常用設計模式詳解,附設計系統思路圖


UML語言: 補 充:spring帶來了面向切面程式設計,在屬性和行為中切一些代理方法或者屬性進去;是對面向物件程式設計的有益補充; 設計7原則: 1、開閉原則:軟體對擴充套件是開放的,對修改是關閉的;【這是一個綱領性原則,最後要達到的結果就是強內聚,少耦合;】 2、單一職責原則:每一個物件都有一個單獨的職責(一個職責不是一個方法)【案例】:一個方法要操作流程,則流程發生改變就要改變方法;當方法只實現功能,就不會被改變;通過RUN方法來進行流程控制; 3、DRY : 聚合組合原則,抽取公共部分放置在一個地方避免程式碼重複; 4、LSP:里氏替換原則,子類必須能夠替換父類; 5、DIP:依賴倒置原則,高層模組不應該依賴於底層模組,二者都應該依賴於抽象; 抽象不應該依賴於細節,細節應該依賴於抽象;【在設計介面
或者呼叫方法的時候依賴抽象而不是具體的方法;】 6、ISP:介面隔離原則,不應該強迫客戶程式依賴它們不需要的使用的方法; 7、最小介面原則:儘可能設定最少的介面(將可以合併的介面合併起來形成新的介面); 1、架構模式: 1、三層架構: 表現層--業務層--持久層; (貧血型-物件的屬性和行為相分離); 2、檢視的VCM模型: 2、設計模式:按照幹什麼來進行分類 1、建立模式:涉及物件的建立 單例模式@、工廠模式@、建造者模式、原型模式@; 2、結構模式:設計類和物件的組合 Facade外觀模式、代理模式,介面卡模式裝飾器模式-星巴克咖啡@; 3、行為模式:刻畫了類和物件交換及分配職責的方式,目標是解耦; 觀察者模式,命令模式
,模板模式; 2.1 單例模式(Singleton)第一種:預載入方式懶漢模式 1,構造方法私有化, 將自己在自己內部例項化一個物件作為自己的屬性,使用一個方法將這個物件作為返回值返出去; 特點:1、該物件就算不用,也要在記憶體中產生出來; 2、執行緒絕對安全; 程式碼示例: public class Singleton { // private static Singleton sin = new Singleton(); // private Singleton(){ // } // public static Singleton getInstance(){ // return sin; // } 第二種:餓漢模式: 如果靜態成員變數sin == null 則 重新new一個物件出來;否則就直接返回sin已經new出來的物件; 特點: 1、延遲載入時間,在真正需要用的時候才用; 2、不加同步執行緒不安全的;加同步效率就低;(synchronize); 程式碼示例
: public class Singleton { // private static Singleton sin; // private Singleton(){ // } // public synchronized static Singleton getInstance(){ // if(sin == null){ // sin = new Singleton(); // } // return sin; // } 第三種:雙鎖模式:外面的if,可以避免所有程式碼進同步塊,只有非第一次才進來判斷、第二個IF避免切程式,導致new出兩個物件; 特點:1、即實現高併發,又實現同步安全; 2、同時實現延遲載入; 程式碼示例: public class Singleton { private static Singleton sin; private Singleton(){ } public static Singleton getInstance(){ if(sin == null){ synchronized(Singleton.class){ if(sin == null){ sin = new Singleton(); } } } return sin; } } 2.2工廠模式: DButil,中的JDBC連結物件,中專門產生物件,其他人來使用它; 好處:1、客戶類和工廠類分開,消費者任何時候需要某種產品只需向工廠請求即可; 第一種:簡單工廠模式:一個工廠生產多個產品,【案例】:肯德基後臺生產,前臺按需取用; 程式碼示例:原始碼(設計模式-KFC工廠) 服務員,點餐傳入,根據點餐對應的進入相應的產品迴應;所有產品繼承產品介面實現產品描述和產品獲取行為; 第二種:工廠方法模式:工廠發生變化,同樣的產品不同的工廠出來的有不同的效果,漢堡(肯德基、麥當勞、漢堡王) 抽象一個快餐店,都有各自實現漢堡的方法; 程式碼示例: 第三種:抽象工廠方法:工廠能抽象出來,產品也可以抽象出來; 2.3原型模式(prototype):建立一個和已有的模型一模一樣的新物件,Clone; 第一種:淺克隆模型: 克隆,重寫物件的clone()方法的訪問修飾符為public; 不一定改變; 重寫物件要實現Cloneable 標識介面; 特徵:未實現引用的克隆; 程式碼實現: •public class AbstractSpoon implements Cloneable {   String spoonName;   public void setSpoonName(String spoonName) {this.spoonName = spoonName;}   public String getSpoonName() {return this.spoonName;}   public Object clone()   {     Object object = null;     try {       object = super.clone();     } catch (CloneNotSupportedException exception) {       System.err.println("AbstractSpoon is not Cloneable");     }     return object;   } } 第二種:深克隆模型1: 在克隆物件重寫的克隆方法中,對引用物件的技巧屬性指向新克隆的物件, 第三種:深克隆模型1: 通過序列化中間加byteArrayOutPutStream的位元組處理流再輸入回來,就可以了;通過這個管道的toByteArray()實現; 且都要實現標記介面; 程式碼實現: •public Man deepClone(){ try { –ByteArrayOutputStream bo = new ByteArrayOutputStream(); –ObjectOutputStream outObj = new ObjectOutputStream(bo); –outObj.writeObject(this); – –ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray()); –ObjectInputStream outIn = new ObjectInputStream(bi); –Man m = (Man)outIn.readObject(); – –return m; •} catch (Exception e) { •e.printStackTrace(); •} •return null; •} 2.4外觀模式:【案例】:照相機的一鍵模式,ATM機的run方法;只需呼叫run方法,就可以實現複雜的過程; 給客戶一個選擇選單,自己選擇呼叫那個方法那個功能; 類似選單選擇; 2.5裝飾器模式:如何避免一個父類的子類太多,造成的子類膨脹爆炸問題;--星巴克咖啡; 關鍵點: 主要內容必須有主次之分才能實現; 實現過程:通過聚合和組合解決了繼承的類爆炸問題; 程式碼實現 2.6橋樑模式:當內容沒有主次之分的時候使用橋樑模式; 實現過程:在應對多維度的變化中抽取出變化的兩個關鍵點, 然後各自寫各自的介面,然後把動作作為屬性的一個屬性,將所需要的動作傳給屬性類; 程式碼實現 2.7介面卡模式:往往在呼叫別人的方法的時候,別人提供的不匹配我們的使用,中間需要加一個介面卡; 實現過程:1、繼承一個,新增一個屬性; 2、新增兩個屬性; 程式碼在建立物件中最後幾頁 2.8代理模式(Proxy):幫助實現面向物件程式設計的面向方向程式設計;Spring中經常用(核心框架); 場景描述:胡總請客戶去吃飯,飯店前臺要結賬,找祕書周密,周可以再這個胡總的支付方法前面和後面加上自己的方法,清點和飯店優惠;但是大家不知道有祕書的存在,只知道胡總請客吃飯的;