空对象模式(Null Object Pattern)
2017-09-27 16:17
246 查看
31.3 空对象模式(Null Object Pattern)
31.3.1 定义和类图
(1)定义:通过实现一个默认的无意义对象来避免NULL值出现。简单地说,就是为了避免在程序中出现NULL值判断而诞生的一种常用设计方法。
(2)类图
31.3.2 应用场景
(1)不使用空对象模式的例子
【编程实验】利用工厂模式创建图书
(2)解决方案:空对象模式
【编程实验】利用工厂模式+空对象模式创建图书
31.3.3 小结
(1)空对象模式可以加强系统的稳固性,能有效防止空指针报错对整个系统的影响。
(2)能够实现对空对象情况的定制化的控制,能够掌握处理空对象的主动权
(3)不依赖Client端来保证整个系统的稳定运行
(4)它通过isNull代替“==NULL”,显得更加优雅,更加易懂。
31.3.1 定义和类图
(1)定义:通过实现一个默认的无意义对象来避免NULL值出现。简单地说,就是为了避免在程序中出现NULL值判断而诞生的一种常用设计方法。
(2)类图
31.3.2 应用场景
(1)不使用空对象模式的例子
【编程实验】利用工厂模式创建图书
//新设计模式——空对象模式 //场景:利用简单工厂方法创建图书(不使用空对象模式) #include <iostream> #include <string> using namespace std; class IBook { public: //展示Book对象信息内容 virtual void show() = 0; }; //具体的书 class Book :public IBook { private: int id; string name; string author; public: //构造函数 Book(int id, string name, string author) { this->id = id; this->name = name; this->author = author; } void show() { cout <<"ID = " << id <<", Name = " << name << ", Author = " << author <<endl; } }; //图书对象的图书工厂代码 class BookFactory { public: IBook* getBook(int id) { IBook* book = NULL; switch(id) { case 1: book = new Book(id, "设计模式", "GOF"); break; case 2: book = new Book(id, "编译原理", "Alfred V.Aho"); break; default: book = NULL; break; } return book; } }; int main() { BookFactory bf; IBook* book = bf.getBook(3); //传入1、2时正常运行,但其他值时会报错。 //常规做法是客户端加一个判断,如果为NULL,就不能调用Show //但这种做法要依赖客户端,如果是多处调用的话,则每处都必须判断也显得很 //麻烦,如何解决这个问题?见后面的空对象模式 if(book == NULL) { cout << "book对象为NULL" << endl; } else { book->show(); } return 0; };
(2)解决方案:空对象模式
【编程实验】利用工厂模式+空对象模式创建图书
//新设计模式——空对象模式 //场景:利用简单工厂方法创建图书(使用空对象模式) #include <iostream> #include <string> using namespace std; class IBook { public: //展示Book对象信息内容 virtual void show() = 0; //判断对象是否为空 virtual bool isNull() = 0; //注意,这是新增的方法 }; //具体的书 class Book :public IBook { private: int id; string name; string author; public: //构造函数 Book(int id, string name, string author) { this->id = id; this->name = name; this->author = author; } void show() { cout <<"ID = " << id <<", Name = " << name << ", Author = " << author <<endl; } bool isNull() { return false; //返回false } }; //新增的空对象类(继承自IBook) class NullBook : public IBook { public: //show void show() { //提示出错信息,一处定制,处处使用,主动权掌握在我们手里,而不是客户端手里 cout <<"Sorry,未找到符合您输入的ID的图书信息,请确认您输入的不是非法值。" << endl; } bool isNull() { return true; //这里返回true } }; //图书对象的图书工厂代码 class BookFactory { public: IBook* getBook(int id) { IBook* book = NULL; switch(id) { case 1: book = new Book(id, "设计模式", "GOF"); break; case 2: book = new Book(id, "编译原理", "Alfred V.Aho"); break; default: book = new NullBook(); //创建一个NullBook对象 break; } return book; } }; int main() { BookFactory bf; IBook* book = bf.getBook(3); //传入1、2时正常运行,但其他值时返回空对象。 //由于返回的book永远不等于NULL,这里可以直接调用book->show() //book->show(); //但也可以让客户端调用isNull函数,并定制客户端自己的错误提示 if(book->isNull()) { //这里由客户端定制提示信息 cout << "兄弟,你输入的ID不符合规范吧?" << endl; } else { book->show(); } return 0; };
31.3.3 小结
(1)空对象模式可以加强系统的稳固性,能有效防止空指针报错对整个系统的影响。
(2)能够实现对空对象情况的定制化的控制,能够掌握处理空对象的主动权
(3)不依赖Client端来保证整个系统的稳定运行
(4)它通过isNull代替“==NULL”,显得更加优雅,更加易懂。
相关文章推荐
- Java Null Object Pattern(空对象模式)
- 设计模式:空对象模式(Null Object Pattern)
- 空对象模式(Null Object Pattern)
- 被遗忘的设计模式——空对象模式(Null Object Pattern)
- Java 空对象设计模式(Null Object Pattern) 讲解
- C#对象为Null模式(Null Object Pattern)实例教程
- 被遗忘的设计模式——空对象模式(Null Object Pattern)
- 用最简单的例子理解对象为Null模式(Null Object Pattern)
- 被遗忘的设计模式——空对象模式(Null Object Pattern)
- 【设计模式】空对象模式(Null Object Pattern)
- Java 空对象设计模式(Null Object Pattern) 讲解
- 设计模式:空对象模式(Null Object Pattern)
- 设计模式:空对象模式(Null Object Pattern)
- 适配器模式(Adapter Pattern 类对象结构型模式)
- 协调多个对象之间的交互——中介者模式(Mediator Pattern)
- 设计模式学习—传输对象模式(Transfer Object Design Pattern)
- 创建模式(Builder Pattern、构建模式、生成器,对象创建型模式)
- 面向对象设计模式之---简易工厂模式(Simple Factory Pattern)
- 简单工厂模式(Simple Factory Pattern(静态工厂方法模式)对象创建型模式)
- 【设计模式 - 21】之空对象模式(Null Object)