有時候我們的代碼中為避免 NullPointerException 會出現很多的對Null的判斷語句,而這些語句一旦多起來,我們的代碼就會變的慘不忍睹,因此我們引入了空對象模式(null object pattern)以此來使我們的代碼變的更優雅一點。
下面來看一下空對象模式的大概視圖
為了方便我這里就直接用手寫的了,大家諒解一下:) ,湊合着看吧
假如我們需要查詢某個學生的信息,我們輸入學號來進行查詢,如果沒有這個學生的話,我們就返回一個空對象,以此來實現空對象模式。
下面是我的代碼實現。
import java.util.Scanner;
//首先我定義一個為查詢和空對象的類定義一個共同的接口
interface AbstractCustomer{
String query();
}
//查詢學號的具體實現
class RealObject implements AbstractCustomer{
@Override
public String query() {
//這里你也可以返回一些別的有用的東西,我這里為了演示就返回一個字符串
return "successful";
}
}
//空對象類的實現
class NullObject implements AbstractCustomer{
@Override
public String query() {
return "can not find this student";
}
}
//建造工廠
class CustomerFactory{
//我們假定這是我們儲存學生學號的數據庫,現在我們獲取到了,把它裝到我們的數組里
int[] arr = {1,2,3,4,5};
public AbstractCustomer query(){
//模擬查詢學號
Scanner scanner = new Scanner(System.in);
System.out.println("please input student_id:\n");
int index = scanner.nextInt();
for(int i : arr){
if(i == index){
return new RealObject();
}
}
//如果沒有查找到的話我們直接返回一個空對象
return new NullObject();
}
}
//接下來是客戶端方面,我們直接操作工廠即可
public class Main {
static void customer(CustomerFactory cf){
//先調用工廠的query返回一個對象,然后再用這個對象調用自己的query
String s = cf.query().query();
System.out.println(s);
}
public static void main(String[] args){
customer(new CustomerFactory());
}
}
上面則是描述的空對象模式,當我們需要較多的判斷是否為null時,可以用到這個模式,以上代碼還可以給接口再添加一個isNull方法來確切的判斷是否為Null。
我們來執行一下這個程序
接下來我們輸入一個數組里沒有的數據
以上就是空對象模式的講解,如果大家有任何疑問可以在回復區給我回復,謝謝:)