索引
通过对缺失对象的封装,以提供默认无任何行为的对象替代品。
Encapsulate the absence of an object by providing a substitutable alternative that offers suitable default do nothing behavior.
In short, a design where “nothing will come of nothing”.
AbstractObject
- 声明协作对象的接口。
- 如果需要,可以实现默认行为。
RealObject
- 具体的协作对象类,提供有意义的行为。
NullObject
- 空对象类,继承自 AbstractObject,但接口实现不做任何事情。
Client
- 请求协作对象。
当以下情况成立时可以使用 Null Object 模式:
- 一个对象需要一个协作对象,但并无具体的协作对象。
- 协作对象不需要做任何事情。
- 减少了对对象是否为 Null 的判断。
- 提供默认无任何具体行为的协作对象。
- 因为 Null Object 通常没有任何状态,所以多个实例可能都是类似的,可以使用 Singleton 模式来实现。
- Null Object 看起来很像 Proxy 模式,但两者有着不同的目的。Proxy 提供对目标对象访问的控制,而 Null Object 并不隐藏任何对象。
- Null Object 可以作为 Strategy 模式中的一个特例。Strategy 提供多个具体类以区分算法,而 NullStrategy 则可不做任何事情。
- Null Object 可以作为 State 模式中的一个特例。使用 NullState 以便不做任何事情。
- 在 Visitor 模式中也可以使用 Null Object 以提供某种默认行为。
1 namespace NullObjectPattern.Implementation1 2 { 3 public interface ILog 4 { 5 void Write(string message); 6 } 7 8 public class ConsoleLog : ILog 9 { 10 public void Write(string message) 11 { 12 Console.WriteLine(message); 13 } 14 } 15 16 public class NullLog : ILog 17 { 18 public void Write(string message) 19 { 20 // do nothing 21 } 22 } 23 24 public class Client 25 { 26 public void TestCase1() 27 { 28 ILog log1 = new ConsoleLog(); 29 ILog log2 = new NullLog(); 30 31 log1.Write("message to log"); 32 log2.Write("message to log"); 33 } 34 } 35 }
《设计模式之美》为 Dennis Gao 发布于博客园的系列文章,任何未经作者本人同意的人为或爬虫转载均为耍流氓。