Java設計模式 - - 單例模式 裝飾者模式

Java設計模式 單例模式 裝飾者模式

做者 : 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。。。。。。。。。。");

}
相關文章
相關標籤/搜索