前言
来啦老铁!
笔者正在学习常见的设计模式,且将设计模式系列学习文章归入 “设计模式学习” 专题,赶快关注专题一起学习吧!
今天我们继续学习:
-
空对象模式
备注:笔者的学习资料大部分来源于:菜鸟教程;
学习路径
- 空对象模式简介;
- 空对象模式代码实现;
- 空对象模式优缺点分析;
- 空对象模式使用场景介绍;
1. 空对象模式简介;
在空对象模式(Null Object Pattern)中,一个空对象取代 NULL 对象实例的检查。Null 对象不是检查空值,而是反应一个不做任何动作的关系。这样的 Null 对象也可以在数据不可用的时候提供默认的行为。
在空对象模式中,我们创建一个指定各种要执行的操作的抽象类和扩展该类的实体类,还创建一个未对该类做任何实现的空对象类,该空对象类将无缝地使用在需要检查空值的地方。
以上来自:菜鸟教程
2. 空对象模式代码实现;
我们以手机品牌为例,当支持该品牌手机则返回该品牌手机实例,当无该品牌手机,则返回空对象实例;
1. 创建手机类 phone.py
class Phone:
def __init__(self, phone_name):
self.name = phone_name
def get_name(self):
return self.name
def is_null(self):
return False
2. 创建不同品牌的手机类继承于手机类,如:huawei.py, vivo.py, oppo.py
- huawei.py
from phone import Phone
class Huawei(Phone):
def __init__(self):
super().__init__("Huawei")
def mean_prize(self):
return 4000
- vivo.py
from phone import Phone
class Vivo(Phone):
def __init__(self):
super().__init__("Vivo")
def mean_prize(self):
return 2500
- oppo.py
from phone import Phone
class Oppo(Phone):
def __init__(self):
super().__init__("Oppo")
def mean_prize(self):
return 2200
3. 创建空手机类,如:nullPhone.py;
from phone import Phone
class NullPhone(Phone):
def __init__(self):
super().__init__(None)
def get_name(self):
return "Not support this kind of phone."
def is_null(self):
return True
4. 创建手机工厂类,如:phoneFactory.py;
from huawei import Huawei
from vivo import Vivo
from oppo import Oppo
from nullPhone import NullPhone
class PhoneFactory:
def __init__(self):
pass
def get_phone(self, phone_name):
if phone_name.lower() == "huawei":
return Huawei()
if phone_name.lower() == "vivo":
return Vivo()
if phone_name.lower() == "oppo":
return Oppo()
return NullPhone()
if __name__ == "__main__":
huawei = PhoneFactory().get_phone("Huawei")
print(huawei.get_name())
print("is_null", huawei.is_null())
print("============================")
apple = PhoneFactory().get_phone("Apple")
print(apple.get_name())
print("is_null", apple.is_null())
print("============================")
vivo = PhoneFactory().get_phone("vivo")
print(vivo.get_name())
print("is_null", vivo.is_null())
5. 演示;
如上,我们直接在 phoneFactory.py 内进行测试,测试结果如下:
演示至此,一个简单的空对象模式就完成了,很简单,对吧~
我们稍微归纳一下,原文链接,即空对象模式主要包含3个角色:
- 抽象对象(AbstractObject):定义所有子类公有的行为和属性;
- 真实对象(RealObject):继承AbstractObject类,并实现所有行为;
- 空对象(NullObject):继承AbstractObject类,对父类方法和属性不做实现和赋值。
3. 空对象模式优缺点分析;
-
优点:
(1)它可以加强系统的稳固性,能有有效地防止空指针报错对整个系统的影响,使系统更加稳定。
(2)它能够实现对空对象情况的定制化的控制,能够掌握处理空对象的主动权,一处定制,处处输出。
(3)它并不依靠Client来保证整个系统的稳定运行。
(4)它通过isNull对==null的替换,显得更加优雅,更加易懂。
以上(1)~(4)来自:https://blog.csdn.net/qiumengchen12/article/details/44923139
-
缺点:
- 每一个要返回的真实的实体都要建立一个对应的空对象模型,那样会增加类的数量;
- 模式使用时应谨慎,因为它可以使错误显示为正常程序执行。
4. 空对象模式使用场景介绍;
(1)对象实例需要一个协作实例。空对象模式不会引入协作实例,它只是使用现有的协作实例;
(2)部分协作实例不需要做任何处理;
(3)从客户端中将对象实例不存在的代码逻辑抽象出来。
如果本文对您有帮助,麻烦点赞、关注!
谢谢!
网友评论