做者 : Stanley 羅昊html
【轉載請註明出處和署名,謝謝!】設計模式
靜態代理模式:https://www.cnblogs.com/StanleyBlogs/p/10761604.html安全
設計模式其實就是是寫了不少代碼的人總結出來的經驗!函數
設計模式是關於一些問題的最佳解決方案;測試
也就是說,每個典型的問題,關於一個典型的問題,他都會總結出來一個最佳的解決方案;this
就比方說醫生問診:編碼
你掛不一樣的科室,也就是不一樣的醫生,每一個醫生都有本身擅長並拿手的治療方案,關於某一個疾病都有本身獨特的解決方案;spa
設計模式其實也同樣,就是經過大量的代碼總結出來的一些問題的最佳解決辦法;線程
Java的設計模式一共有23種設計模式;設計
在這23種設計模式中,你僅掌握3~4種設計模式便可,而且要求可以手寫出來;
23種設計模式並分爲三大類:
1.建立型模式【五種】
工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式
2.結構型模式【七種】
適配器模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式
3.行爲型模式【十一種】
策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、解釋器模式
總原則:開閉原則(Open Close Princciple)
對修改關閉,對擴展開放,全部的設計模式都必須遵循這個原則!
也就是說,全部的設計模式,你能夠擴展它的功能,可是不能夠修改它原始的功能;
1.單一職責原則
不要存在多於一個致使類變動的緣由,也就是說每一個類應該實現單一的職責,如若否則,就應該把類拆分;
2.里氏替換原則
里氏替換原則中,子類對父類的方法儘可能不要重寫和重載,由於父類表明了定義好的結構,經過這個規範的接口與外界交互,子類不該該隨便破壞它;
3.依賴倒轉原則
這個原則的意思四,每一個接口中不存在子類用不到卻必須實現的方法,若是否則,就要將接口拆分。使用多張個隔離的接口,比使用單個接口(多個幾口方法結合到一個的接口)更好;
4.迪米特法則(最少知道原則)
就是說,一個類對本身的依賴的類知道的越少越好。也就是說不管被依賴的類多麼複雜,都應該將邏輯封裝在方法的內部,經過public方法提供給外部,這樣當被依賴的類變化時,才能量最小的影響該類;
6.複合重用原則
儘可能首先使用合成/聚合的方式,而不是使用繼承的方式;
單例設計模式是最簡單的設計模式
目的:建立全局惟一的實例對象;
1.餓漢模式
在類加載的時候,就建立一個對象,由於就比較餓嘛,上來就建立對象;
2.懶漢模式
須要的時候才建立,由於比較懶,你不拿鞭子抽它,他就不動;
下面呢,我將建立一個類,這個類,我就把它搞成一個單例設計模式;
單例設計模式有三點,第一點:私有的構造器;
第二點:私有的靜態屬性,而且變量類型與類同名;
第三點:共有的建立實例對象的方法(那我這個方法返回的確定是一個SingleDemo01類型);
標準的線程安全的單例模式:
public class SingleDemo01{
//1.私有的構造器 private SingleDemo01(){} //2.私有的靜態屬性 private static SingleDemo01 single; //3.公有的建立實例對象的方法 public SingleDemo01getInstance(){ if(single == null)//2個線程 synchronized(SingleDemo01.class){ if(single == null){ single = new SingleDemo01(); } } return single; }
}
當你須要對某一個類的某一個功能進行加強的時候,就要用到裝飾者模式;
下面就舉一些例子來完成對裝飾者模式的認知:
我如今想對list集合中的add方法進行加強,在添加元素時打印一句「開始添加元素」,添加完成後再打印一句「元素添加完成」;
咱們看到以上需求,咱們本次採用裝飾者模式去實現,去實現以前呢須要注意兩點:
1.將要裝飾的或包裝的類,做爲加強類的屬性
2.須要實現加強功能
具體實現過程:
首先,咱們先定義一個類,叫MyList;
我如今要增強List的add方法,那麼首先我就須要讓list做爲個人成員屬性;
定義好一個list泛型類型的屬性後,咱們須要對它進行賦值,因此咱們就再給它提供一個構造函數;
以後呢,咱們在類中寫一個帶參的add方法,那我如今這個add方法是否是就是要對原始的add方法進行加強了;
編碼:
public class MyList{ private List<String>list; public MyList(List<String>list){ super(); this.list = list; } public void add (String e){ //添加以前輸出一句 System.out.println("start。。。。。。。。。。"); //添加 list.add(e); //添加以後再輸出一句 System.out.println("end。。。。。。。。。。"); }
這個就是裝飾者模式,某類中的某一個方法進行加強
//寫一個main方法進行測試 public static void main (String[] args){ //先創建一個list集合 List<String>list = new List<String>(); //list集合建完以後,我是否是就再建一個Mylist直接把值穿進去是否是就能夠了 MyList my = newMyList(list); my.add("ss"); } }
打印輸出結果:
咱們看到執行結果,是否是已經按照要求加強了;
這個時候咱們還能夠繼續改進;
改形成只能添加含有start的元素;
咱們僅需加一個if判斷便可:
public class MyList{ private List<String>list; public MyList(List<String>list){ super(); this.list = list; } public void add (String e){ //添加以前輸出一句 System.out.println("start。。。。。。。。。。"); //添加 if(e.contains("start")){//這裏咱們加了一個判斷,表示判斷添加進來的元素是否包含start,若是不包含就不進入該方法,也就意味着元素沒添加進去 list.add(e); } //添加 list.add(e); //添加以後再輸出一句 System.out.println("end。。。。。。。。。。"); }