文章出處
文章列表
索引
通過對缺失對象的封裝,以提供默認無任何行為的對象替代品。
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 發布于博客園的系列文章,任何未經作者本人同意的人為或爬蟲轉載均為耍流氓。
文章列表
全站熱搜