天天看點

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

好程式員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;

1.需要記住形式為了Scala做準備

2.Lambda可以替換匿名内部類一次實作的方式

Lambda隻能實作接口中一個抽方法.

模闆設計模式

/*
 * 模闆設計模式:我們在實作一個功能的時候,功能分成兩部分,一部分是确定的,一部分是不确定的.将确定的部分交給目前類實作
 *                 将不确定的部分交給子類實作.子類實作的結果又會反過來影響确定部分的功能.
 * 
 * 執行個體:計算一個功能的耗時
 * 分析:固定的功能:開始時間,結束時間
 * 不固定的功能:程式運作的時間
 */           

内部類

/*
 * 内部類:定義在A類裡面的B類就是内部類,内部類的地位與A類的成員變量,成員方法平等,内部類也可以看做是A類的成員,成員之間可以互相調用
 作用:我們可以通過内部類讓java間接實作多繼承
 */
 
 /*
 * 局部内部類:定義在一個類方法中的類
 * 作用範圍:從定義開始到目前的方法結束
 */
 
 /*
 * 靜态内部類:内部類的類型是static類型的.
 注意:靜态内部類不一定有靜态方法,有靜态方法的一定是靜态内部類
 */
 
 /*
 * 匿名内部類(對象):定義在一個類方法中的匿名子類對象,屬于局部内部類
 * 匿名子類對象:
 * 匿名内部類對象:
 * 
 * 建立匿名内部類對象注意點:1.匿名内部類對象必須有父類或者父接口
 * 
     匿名内部類對象的作用:
 * 1.當隻用到目前子類的一個執行個體對象的時候,定義好馬上使用
 * 2.當不好起名字的時候
 * 3.可以更好的定義運作時的回調(知道即可)
 * 
 * 内部類的作用:
 * 1.間接實作了多繼承
 * 2.友善定義
 * 3.隻有外部類可以通路建立的内部類的屬性和方法,包括私有方法
 * 4.同一個包中其他的類不可見,有了很好的封裝性
 */