GoF著作中未提到的设计模式(3):Null Object
来源:互联网 发布:网络延长线接法 编辑:程序博客网 时间:2024/05/17 23:25
Null Object模式的目的包括:
1. 当对象提供者无法提供指定类型的对象时, 返回一个什么都不做的对象, 这对调用者是透明的,并且调用者不用判断获得的对象是否为null了,当然,对象提供者必须告知调用者(通过约定等).
2. 有时候需要传递一个什么都不做的某个类型的对象给合作方. 例如某个函数需要实现特定接口的对象(通过参数传入)进行某些操作, 该函数的调用者在某些情况下希望不进行这些操作,那么他就可以传进来一个实现了该接口但函数体全为空的对象,这个对象就是Null Object.
举个例子,从某处(不是通过new来创建)获得一个对象后,我们的第一反应就是判断这个对象是否为null,这都成为程序员的本能了。
如果为null,则做一些特殊处理,就像下面的代码片段:
if( recorder==null ){
Log.error("Recorder对象为空");
lastErrorCode =0;
}
else{
recorder.record("记录点啥...");
}
看到了没有,为了处理这个对象为null的情况,增加了很多行代码,而且类似的代码片段充斥在整个项目中,看着都想吐了。
要是EventRecorder的作者拍着胸脯向你保证:我给你的EventRecorder对象绝对不会是null!不然我生孩子没.......
人家都这么说了,那咱就应该相信他!
以后写代码就舒心多了,看着也清爽:
recorder.record("终于不用判断是否为NULL了.......");
Null Object模式就可以实现上面的约定。
下面是EventRecorder的声明:
publicvoid record(String event);
}
增加两个实现类:
publicvoid record(String event);
// 记录内容到数据库中
}
}
publicclass RecordEventToFileimplements EventRecorder{
publicvoid record(String event);
// 记录内容到文件中
}
}
下面是EventRecorderFactory中getRecorderByType的简单实现:
EventRecorder recorder =null;
if(type ==0)
recorder =new RecordEventToDatabase();
elseif(type==1)
recorder =new RecordEventToFile();
return recorder;
}
可以看出这个方法的返回值可能是null,调用者就需要判断这种情况。
下面我们实现一个什么都不做的EventRecorder:
publicvoid record(String event);
}
下面是修改后的getRecorderByType:
EventRecorder recorder =null;
if(type ==0)
recorder =new RecordEventToDatabase();
elseif(type==1)
recorder =new RecordEventToFile();
else
recorder =new NullEventRecorder();// 这就是Null Object
return recorder;
}
这样就可以保证该方法的返回值永远不会为null了。
再举一个例子来说明第二个目的:
publicinterface Payer {
publicvoid pay(int money);
}
// 使用信用卡付款
public PayerByCardimplements Payer{
publicvoid pay(int money){
// 刷卡
}
}
// 不付款(这就是一个Null Object, 什么都不做)
public NullPayerimplements Payer{
publicvoid pay(int money){
}
}
下面是一个使用Payer对象的方法:
if(payer==null)
throw Exception;
payer.pay();
}
下面是一个使用场景:
if(userType=="黑社会老大")
payer =new NullPayer();
else
payer =new PayerByCard();
payer.pay();
// 享受服务....
- GoF著作中未提到的设计模式(3):Null Object
- GoF著作中未提到的设计模式(3):Null Object
- GoF著作中未提到的设计模式之三:Null Object
- GoF著作中未提到的设计模式(1): Archetype
- GoF著作中未提到的设计模式
- GoF著作中未提到的设计模式(1): Archetype
- GoF著作中未提到的设计模式(2):Interceptor
- GoF著作中未提到的设计模式(6):Specification
- GoF著作中未提到的设计模式之一: Archetype
- GoF著作中未提到的设计模式(1): Archetype
- GoF著作中未提到的设计模式(6):Specification
- GoF著作中未提到的设计模式(5):Object Pool
- GoF著作中未提到的设计模式之五:Object Pool
- GoF著作中未提到的设计模式(5):Object Pool
- GoF著作中未提到的设计模式(4):Double Dispatch
- GoF著作中未提到的设计模式(7):Publish-Subscribe
- GoF著作中未提到的设计模式之二:Interceptor
- GoF著作中未提到的设计模式之四:Double Dispatch
- Android 中Message,MessageQueue,Looper,Handler详解+实例
- 提供一个JAVA过滤HTML代码和截取字符串的类(包括测试用例)
- Macromedia FlashPaper 2的安装方法(XP和Win7)
- GoF著作中未提到的设计模式(2):Interceptor
- DELETE 语句 oracle /mssql 对比
- GoF著作中未提到的设计模式(3):Null Object
- GoF著作中未提到的设计模式(4):Double Dispatch
- JAVA版二叉树的先序、中序、后序和层次遍历
- GoF著作中未提到的设计模式(5):Object Pool
- (二)二十三中设计模式之我见-----------------适配器模式(Adapter Pattern)
- Silverlight获取控件绝对位置
- android中APK开机自动运行
- GoF著作中未提到的设计模式(6):Specification
- V4L2编程