设计模式笔记二十二:空对象模式
2017-03-04 22:01
141 查看
原文:http://www.runoob.com/design-pattern/
少许个人理解,如有错误请指出。欢迎一起讨论。
在空对象模式(Null Object Pattern)中,一个空对象取代 NULL 对象实例的检查。Null 对象不是检查空值,而是反应一个不做任何动作的关系。这样的 Null 对象也可以在数据不可用的时候提供默认的行为。
在空对象模式中,我们创建一个指定各种要执行的操作的抽象类和扩展该类的实体类,还创建一个未对该类做任何实现的空对象类,该空对象类将无缝地使用在需要检查空值的地方。
目的:(原文没有提及,以下整理自http://www.2cto.com/kf/201504/388387.html)
比如我们在写Java Web项目时有个方法叫getBookInfoByIndex,目的是返回Book对象之后再调用book.show方法来获取某个书籍的基本信息。如果我们输入1,2,3等等可以查询到的数字,程序运行正常,但是一旦我们输入-1,或者超过书本数量的index,那不就会报错么。此时我们比较常规的做法就是在客户端加一个判断,判断是否为null。如果为null的话,就不再调用show()方法。但是,你有没有考虑过?这样做,确实消除了报错,但是这样做真的好吗?你想如果在一段程序中有很多处调用getBookInfoByIndex()方法,岂不是很多处都要判断book对象是否为null?这还不算坏,如果哪一处没有判断,然后报错了,很有可能导致程序没法继续运行甚至崩溃。
代码实现
我们将创建一个定义操作(在这里,是客户的名称)的 AbstractCustomer 抽象类,和扩展了 AbstractCustomer 类的实体类。工厂类 CustomerFactory 基于客户传递的名字来返回 RealCustomer 或 NullCustomer 对象。
NullPatternDemo,我们的演示类使用 CustomerFactory 来演示空对象模式的用法。
空对象模式的 UML 图
步骤 1
创建一个抽象类。
AbstractCustomer.java
步骤 2
创建扩展了上述类的实体类。
RealCustomer.java
NullCustomer.java
步骤 3
创建 CustomerFactory 类。
CustomerFactory.java
步骤 4
使用 CustomerFactory,基于客户传递的名字,来获取 RealCustomer 或 NullCustomer 对象。
NullPatternDemo.java
步骤 5
验证输出。
这个设计模式应该是相当好理解的。
少许个人理解,如有错误请指出。欢迎一起讨论。
在空对象模式(Null Object Pattern)中,一个空对象取代 NULL 对象实例的检查。Null 对象不是检查空值,而是反应一个不做任何动作的关系。这样的 Null 对象也可以在数据不可用的时候提供默认的行为。
在空对象模式中,我们创建一个指定各种要执行的操作的抽象类和扩展该类的实体类,还创建一个未对该类做任何实现的空对象类,该空对象类将无缝地使用在需要检查空值的地方。
目的:(原文没有提及,以下整理自http://www.2cto.com/kf/201504/388387.html)
比如我们在写Java Web项目时有个方法叫getBookInfoByIndex,目的是返回Book对象之后再调用book.show方法来获取某个书籍的基本信息。如果我们输入1,2,3等等可以查询到的数字,程序运行正常,但是一旦我们输入-1,或者超过书本数量的index,那不就会报错么。此时我们比较常规的做法就是在客户端加一个判断,判断是否为null。如果为null的话,就不再调用show()方法。但是,你有没有考虑过?这样做,确实消除了报错,但是这样做真的好吗?你想如果在一段程序中有很多处调用getBookInfoByIndex()方法,岂不是很多处都要判断book对象是否为null?这还不算坏,如果哪一处没有判断,然后报错了,很有可能导致程序没法继续运行甚至崩溃。
代码实现
我们将创建一个定义操作(在这里,是客户的名称)的 AbstractCustomer 抽象类,和扩展了 AbstractCustomer 类的实体类。工厂类 CustomerFactory 基于客户传递的名字来返回 RealCustomer 或 NullCustomer 对象。
NullPatternDemo,我们的演示类使用 CustomerFactory 来演示空对象模式的用法。
空对象模式的 UML 图
步骤 1
创建一个抽象类。
AbstractCustomer.java
public abstract class AbstractCustomer { protected String name; public abstract boolean isNil(); public abstract String getName(); }
步骤 2
创建扩展了上述类的实体类。
RealCustomer.java
public class RealCustomer extends AbstractCustomer { public RealCustomer(String name) { this.name = name; } @Override public String getName() { return name; } @Override public boolean isNil() { return false; } }
NullCustomer.java
public class NullCustomer extends AbstractCustomer { @Override public String getName() { return "Not Available in Customer Database"; } @Override public boolean isNil() { return true; } }
步骤 3
创建 CustomerFactory 类。
CustomerFactory.java
public class CustomerFactory { public static final String[] names = {"Rob", "Joe", "Julie"}; public static AbstractCustomer getCustomer(String name){ for (int i = 0; i < names.length; i++) { if (names[i].equalsIgnoreCase(name)){ return new RealCustomer(name); } } return new NullCustomer(); } }
步骤 4
使用 CustomerFactory,基于客户传递的名字,来获取 RealCustomer 或 NullCustomer 对象。
NullPatternDemo.java
public class NullPatternDemo { public static void main(String[] args) { AbstractCustomer customer1 = CustomerFactory.getCustomer("Rob"); AbstractCustomer customer2 = CustomerFactory.getCustomer("Bob"); AbstractCustomer customer3 = CustomerFactory.getCustomer("Julie"); AbstractCustomer customer4 = CustomerFactory.getCustomer("Laura"); System.out.println("Customers"); System.out.println(customer1.getName()); System.out.println(customer2.getName()); System.out.println(customer3.getName()); System.out.println(customer4.getName()); } }
步骤 5
验证输出。
Customers Rob Not Available in Customer Database Julie Not Available in Customer Database
这个设计模式应该是相当好理解的。
相关文章推荐
- 设计模式学习笔记二十二:对象的轮回 - 通用对象池的实现
- 《C# 设计模式》笔记: 第4章 在C#中使用类和对象
- C#面向对象设计模式纵横谈 学习笔记1 面向对象设计模式与原则
- C#面向对象设计模式纵横谈 学习笔记22 State模式(行为型模式)
- C#面向对象设计模式学习笔记(4) - Factory Method 工厂方法模式(创建型模式)
- Builder生成器(创建型设计模式)面向对象设计模式纵横谈讲座笔记之四
- 学习C#面向对象设计模式纵横谈---笔记
- 设计模式学习笔记二:面向对象基础六之委托与事件
- 设计模式笔记(二十二) —— 享元模式
- 设计模式笔记 0.面向对象设计模式与原则
- C#面向对象设计模式学习笔记(3) - Builder 生成器模式(创建型模式)
- 设计模式学习笔记二十二——Strategy模式
- 面向对象设计模式学习笔记(1)
- 面向对象设计与模式与原则--面向对象设计模式纵横谈讲座笔记之一
- C#面向对象设计模式纵横谈(2):Singleton 单件(创建型模式) 笔记
- [设计模式学习笔记][之二]面象对象单挑结构化设计
- 设计模式学习笔记二:面向对象基础二
- 设计模式学习笔记二:面向对象基础三之多态
- 设计模式学习笔记6——设计模式基础5--不变对象
- Sigleton单件(创建型模式)--面向对象设计模式纵横谈讲座笔记之二