【设计模式】空对象模式
2023-09-14 08:59:11 时间
在空对象模式(Null Object Pattern)中,一个空对象取代 NULL 对象实例的检查。Null 对象不是检查空值,而是反应一个不做任何动作的关系。这样的 Null 对象也可以在数据不可用的时候提供默认的行为。
在空对象模式中,我们创建一个指定各种要执行的操作的抽象类和扩展该类的实体类,还创建一个未对该类做任何实现的空对象类,该空对象类将无缝地使用在需要检查空值的地方。
实现
我们将创建一个定义操作(在这里,是客户的名称)的 AbstractCustomer 抽象类,和扩展了 AbstractCustomer 类的实体类。工厂类CustomerFactory 基于客户传递的名字来返回 RealCustomer 或 NullCustomer 对象。
NullPatternDemo,我们的演示类使用 CustomerFactory 来演示空对象模式的用法。
步骤 1
创建一个抽象类。
public abstract class AbstractCustomer { protected String name; public abstract boolean isNil(); public abstract String getName(); }
步骤 2
创建扩展了上述类的实体类。
public class RealCustomer extends AbstractCustomer { public RealCustomer(String name) { this.name = name; } @Override public String getName() { return name; } @Override public boolean isNil() { return false; } }
public class NullCustomer extends AbstractCustomer { @Override public String getName() { return "Not Available in Customer Database"; } @Override public boolean isNil() { return true; } }
步骤 3
创建 CustomerFactory 类。
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 对象。
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
相关文章
- Java4android学习之对象导论
- AngularJS的核心对象angular上的方法全面解析(AngularJS全局API)
- hibernate5(8)操纵对象入门[3]操控对象封装方法
- Node.js自定义对象事件监听与发射
- 设计模式 ( 二十 ) 访问者模式Visitor(对象行为型)
- 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
- 设计模式 ( 十七) 状态模式State(对象行为型)
- 设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)
- 设计模式 ( 十三 ) 命令模式Command(对象行为型)
- 设计模式 ( 十二 ) 职责链模式(Chain of Responsibility)(对象行为)
- JavaScript中的内置对象--Number对象
- 我用2周的时间深入学习了JS的对象、内置类型、Function、this、作用域、闭包、protot
- 【设计模式】传输对象模式
- 【设计模式】数据访问对象模式
- OPenGL中的缓冲区对象
- 《设计模式之禅》--空对象模式
- 【设计模式】数据访问对象模式
- .NET Core采用的全新配置系统[4]: “Options模式”下各种类型的Options对象是如何绑定的?
- .NET Core采用的全新配置系统[3]: “Options模式”下的配置是如何绑定为Options对象
- java list按照元素对象的指定多个字段属性进行排序
- 掌握Java命令模式:将请求封装成对象,解耦发送者和接收者的关系
- Java观察者模式:轻松实现对象间的一对多依赖
- PHP面试题:单例模式,创建mysqli数据库链接的单例对象
- Java的二十三种设计模式(适配器模式(Adapter)、对象的适配器模式)
- Python爬虫:Scrapy链接解析器LinkExtractor返回Link对象
- C++之4种实例化对象方式(一百一三十一)
- 数据访问对象模式
- 空对象模式
- 哪一个对象可以用于获得浏览器发送的请求。
- C++ 类 & 对象
- 掌握Java命令模式:将请求封装成对象,解耦发送者和接收者的关系
- 从零开始构建Java对象:探究建造者模式的设计之美