好程式設計師Java教程分享Java之設計模式

好程式設計師IT發表於2019-12-12

好程式設計師Java實用教程之設計模式,首先來講一下單例設計模式

單例設計模式

/*
 * 設計模式:前人總結出來的對一些常見問題的解決方案,後人直接拿來使用.
 * 常用的設計模式:單例,工廠,代理,介面卡,裝飾,模板,觀察者等,一共有23種
 * 單例:一個類只允許有一個物件,建立一個全域性的訪問點,提供出去供大家使用.
 * 
  * 分析:
 * 1.我們肯定要建立一個單例類來描述
 * 2.只允許有一個物件
 * 3.全域性的訪問點:說的就是當前的s----透過static實現的
 * 4.提供出去
 * 5.給大家使用
 * 
 * 分類:
 * 餓漢式:在定義當前單例類物件成員變數時直接初始化.
 * 懶漢式:什麼時候用什麼時候賦值(在公共方法中進行賦值)
 * 
 * 作用:
 * 1.傳值
 * 2.作為全域性的訪問點.
 * 
 *使用單例傳值的好處:
 * * 好處:可以讓兩個物件在完全沒有關係的前提下,實現值的傳遞,降低了耦合性,提高了內聚性
 * 
 * 耦合性,內聚性在微觀上說:描述的是類與類之間的關係
 * 好處:我們應該儘量提高內聚性,減少耦合性,可以提高程式的健壯性,增加程式碼的可移植性,方便實現模組兒化程式設計
 * 
 * 如何做到低耦合高內聚?
 * 在處理類與類關係的時候,讓類之間的關係越緊密耦合性越高,內聚性越低.反之,關係越鬆散耦合性越低,內聚性越高.
 */

工廠設計模式

簡單工廠模式是屬於建立型模式,又叫做靜態工廠方法(Static Factory Method)模式,但不屬於23種GOF設計模式之一。簡單工廠模式是由一個工廠物件決定建立出哪一種產品類的例項。簡單工廠模式是工廠模式家族中最簡單實用的模式,可以理解為是不同工廠模式的一個特殊實現。

Lambda表示式

Lambda表示式是Java8之後的新特性
Lambda表示式是函數語言程式設計
Java–>面嚮物件語言 block程式碼塊(閉包) 函數語言程式設計(接近於程式導向) --> 物件導向
什麼是函數語言程式設計?函數語言程式設計(英語:functional programming)或稱函式程式設計,
又稱泛函程式設計,是一種程式設計範型,它將電腦運算視為數學上的函式(cos sin tan)計算,
並且避免使用程式狀態以及易變物件。函式程式語言最重要的基礎是λ演算(lambda calculus)。
而且λ演算的函式可以接受函式當作輸入(引數)和輸出(傳出值)。
ps:λ這個符號可以在搜狗輸入法的符號中顯示

而在物件導向程式設計中,物件導向程式設計(英語:Object-oriented programming,縮寫:OOP)
是種具有物件概念的程式程式設計範型,同時也是一種程式開發的方法。它可能包含資料、屬性、程式碼與方法。
物件則指的是類的例項。它將物件作為程式的基本單元,將程式和資料封裝其中,以提高軟體的重用性、
靈活性和擴充套件性,物件裡的程式可以訪問及經常修改物件相關連的資料。在物件導向程式程式設計裡,
計算機程式會被設計成彼此相關的物件。

Lambda表示式能幹什麼

將介面的實現方式重匿名內部類的形式簡化為了一個函式式表示式方式
簡化介面實現

語法:

(形參引數) -> 表示式 或{方法體};
ps:
Lambds表示式就是實現了當前介面中的方法及簡
void show();
() -> {System.out.println(“我是Lambda表示式”)};

1.形參列表
形參列表允許省略引數型別,若形參列表中只有一個引數,形參列表的原括號也可以省略
ps:形參列表 對應的是 介面中所需要實現方法的 形參列表
void show(int a, int b);
void display(int c);
(int a,int b) -> {實現};
(int a) -> {實現};
a -> {實現};

2.箭頭(->)
必須是英文狀態下的符號 減號(-) + 大於號(>) 指向實現程式碼塊

3.程式碼塊:
若程式碼塊只包含一條語句,Lambda表示式允許允許省略花括號
若Lambda表示式中只有一條return,可以省略return關鍵字
若Lambda表示式中有多條語句(實現方法的邏輯)不能省略大括號

ps:Java中Lambda表示式的結合需要和介面完成
Stream API --> 流式程式設計
看Lambda包Test類
Lambda表示式還能作為引數傳遞
看Lambda包TestDemo類

ps:Java8中若這個介面需要使Lambda表示式實現此時我們需要在這個介面上提供一個註解
@FunctionalInteFace

Lambda表示式引用全域性變數和區域性變數
看Lambda包TestDemo2類

Lambda式表示式引用構造方法和方法引用

1.引用類方法
在函式式介面中定義的抽象方法,而方法的實現是觸發某個類方法實現此時我們就可以透過 :: 形式完成
看Lambda包TestDemo3

2.引用例項方法(成員方法)
在函式式介面中定義的抽象方法,而方法的實現是透過觸發某類類建立的來完成時我們就可以 透過 :: 形式完成
看Lambda包TestDemo4;
版本二:
在函式式介面中定義的抽象方法,而方法上的實現是透過抽象方法中特定的物件引數來完成我們可以透過 :: 形式完成
不過 :: 之前是當前物件的資料了型別,而非 new出一個物件
看Lambda包TestDemo5;
3.引用構造方法
在函式式介面中定義的抽閒方法,而該方法的實現是通透過new 來建立物件,此時我們就可以使用 :: 形式來完成
ps:固定形式 構建物件的型別 :: new;
看Lambda包TestDemo6;

總結:

在上面兩個案例中使用到了一個全新的形式 類或(物件) :: 靜態方法/成員方法
若在Lambda表示式中引用了靜態方法或成員方法時 只有一句話 ,可以使用 :: 形式進行簡化
:: 之前 是這個方法主要的呼叫發起者 類/物件
:: 之後 靜態方法/成員方法
ps:一定要主要 方法後面千萬不要傳入引數
呼叫方法的引數,會透過介面中方法的引數進行傳遞

Lambda表示式和匿名內部類的區別
1.匿名內部類可以為任意介面建立物件,不管介面中包含多少個抽象方法,只要匿名內部類實現所有方法即可
但是Lambda表示式只能為函式式介面建立物件(只能實現一個抽象方法)
2.匿名內部類可以為抽象類甚至是普通類建立物件
但是Lambda表示式只能為函式介面建立物件
3.匿名內內部類實現的抽象方法方法體允許呼叫介面定義預設(default)方法
但是Lambda表示式的實現是不允許呼叫預設方法的

Lambda的實際引用
看Lambda包TestDemo7;

ps:
1.需要記住形式為了Scala做準備
2.Lambda可以替換匿名內部類一次實現的方式
Lambda只能實現介面中一個抽方法.

模板設計模式

/*
 * 模板設計模式:我們在實現一個功能的時候,功能分成兩部分,一部分是確定的,一部分是不確定的.將確定的部分交給當前類實現
 * 				將不確定的部分交給子類實現.子類實現的結果又會反過來影響確定部分的功能.
 * 
 * 例項:計算一個功能的耗時
 * 分析:固定的功能:開始時間,結束時間
 * 不固定的功能:程式執行的時間
 */

內部類

/*
 * 內部類:定義在A類裡面的B類就是內部類,內部類的地位與A類的成員變數,成員方法平等,內部類也可以看做是A類的成員,成員之間可以相互呼叫
 作用:我們可以透過內部類讓java間接實現多繼承
 */
 
 /*
 * 區域性內部類:定義在一個類方法中的類
 * 作用範圍:從定義開始到當前的方法結束
 */
 
 /*
 * 靜態內部類:內部類的型別是static型別的.
 注意:靜態內部類不一定有靜態方法,有靜態方法的一定是靜態內部類
 */
 
 /*
 * 匿名內部類(物件):定義在一個類方法中的匿名子類物件,屬於區域性內部類
 * 匿名子類物件:
 * 匿名內部類物件:
 * 
 * 建立匿名內部類物件注意點:1.匿名內部類物件必須有父類或者父介面
 * 
     匿名內部類物件的作用:
 * 1.當只用到當前子類的一個例項物件的時候,定義好馬上使用
 * 2.當不好起名字的時候
 * 3.可以更好的定義執行時的回撥(知道即可)
 * 
 * 內部類的作用:
 * 1.間接實現了多繼承
 * 2.方便定義
 * 3.只有外部類可以訪問建立的內部類的屬性和方法,包括私有方法
 * 4.同一個包中其他的類不可見,有了很好的封裝性
 */


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913892/viewspace-2668245/,如需轉載,請註明出處,否則將追究法律責任。

相關文章