博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
行为型模型 空对象模式
阅读量:6503 次
发布时间:2019-06-24

本文共 2459 字,大约阅读时间需要 8 分钟。

行为型模型 空对象模式

 

空对象模式

在空对象模式(Null Object Pattern)中,一个空对象取代 NULL 对象实例的检查。Null 对象不是检查空值,而是反应一个不做任何动作的关系。这样的 Null 对象也可以在数据不可用的时候提供默认的行为。

在空对象模式中,我们创建一个指定各种要执行的操作的抽象类和扩展该类的实体类,还创建一个未对该类做任何实现的空对象类,该空对象类将无缝地使用在需要检查空值的地方。

 

实现

我们将创建一个定义操作(在这里,是客户的名称)的 AbstractCustomer 抽象类,和扩展了 AbstractCustomer 类的实体类。工厂类 CustomerFactory 基于客户传递的名字来返回 RealCustomer 或 NullCustomer 对象。

NullPatternDemo,我们的演示类使用 CustomerFactory 来演示空对象模式的用法。

 

 

 

 

/** * 行为型模型 空对象模式 * 创建一个未对该类做任何实现的空对象类,该空对象类将无缝地使用在需要检查空值的地方。 * 不要为了屏蔽null而使用空对象,应保持用null,远比用非null的值来替代“无值”要好。(慎用) * */#define _CRT_SECURE_NO_WARNINGS#include 
#include
class AbstractCustomer{public: virtual bool isNil() = 0; virtual std::string getName() = 0; virtual ~AbstractCustomer() {}protected: std::string name;};class RealCustomer: public AbstractCustomer{public: RealCustomer(std::string name) { this->name = name; } virtual std::string getName() override { return this->name; } virtual bool isNil() override { return false; }};class NullCustomer: public AbstractCustomer{public: virtual std::string getName() override { return "Not Available in Customer Database"; } virtual bool isNil() { return true; }};class CustomerFactory{public: static std::string names[]; static AbstractCustomer * getCustomer(std::string name) { for (unsigned i = 0; i < names->length(); i++) { if (names[i] == name) { return new RealCustomer(name); } } return new NullCustomer(); }};std::string CustomerFactory::names[] = {
"Rob", "Joe", "Julie"};void mytest(){ AbstractCustomer * customer1 = CustomerFactory::getCustomer("Rob"); AbstractCustomer * customer2 = CustomerFactory::getCustomer("Bob"); AbstractCustomer * customer3 = CustomerFactory::getCustomer("Julie"); AbstractCustomer * customer4 = CustomerFactory::getCustomer("Laura"); std::cout << "Customers" << std::endl; std::cout << customer1->getName() << std::endl; std::cout << customer2->getName() << std::endl; std::cout << customer3->getName() << std::endl; std::cout << customer4->getName() << std::endl; delete customer1; delete customer2; delete customer3; delete customer4; return;}int main(){ mytest(); system("pause"); return 0;}

 

验证输出。

CustomersRobNot Available in Customer Database Julie Not Available in Customer Database

 

转载地址:http://nvmyo.baihongyu.com/

你可能感兴趣的文章
php 5.4 memcache,linux下php5.4添加memcache扩展
查看>>
php session作用,session的作用是什么
查看>>
php 两行数据合并,PHP如何实现统计数据合并
查看>>
java国外研究综述,国内外研究现状_毕业论文
查看>>
php执行事务,thinkPHP框架中执行事务的方法示例
查看>>
php 两个值比较大小写,php比较两个字符串(大小写敏感)的函数strcmp()
查看>>
java3d获取模型在xoy平面的投影,将3D世界点投影到新视图图像平面
查看>>
php 修改图片src,jq修改src图片地址 .attr is not a function
查看>>
sudo php 无法打开,从PHP / Apache,exec()或system()程序作为root用户:“ sudo:无法打开审核系统:权限被拒绝”...
查看>>
sql数据库java连接sqlserver2005数据库
查看>>
clientapivc api TCP&UDP—helloworld
查看>>
下划线的学习1
查看>>
在struts2.3.4.1中使用注解、反射、拦截器实现基于方法的权限控制
查看>>
单例模式 - 程序实现(Java)
查看>>
如何隐藏Cognos Viewer
查看>>
响应式网页设计:rem、em设置网页字体大小自适应
查看>>
ImageView的属性android:scaleType
查看>>
商业智能给数据获取带来的局部效益案例
查看>>
巧妙运用二进制验证权限
查看>>
C#中的WebBrowser控件的使用
查看>>