美文网首页设计模式学习
设计模式:空对象模式

设计模式:空对象模式

作者: 狄仁杰666 | 来源:发表于2022-03-07 22:07 被阅读0次

前言

来啦老铁!

笔者正在学习常见的设计模式,且将设计模式系列学习文章归入 “设计模式学习” 专题,赶快关注专题一起学习吧!

今天我们继续学习:

  • 空对象模式

备注:笔者的学习资料大部分来源于:菜鸟教程

学习路径

  1. 空对象模式简介;
  2. 空对象模式代码实现;
  3. 空对象模式优缺点分析;
  4. 空对象模式使用场景介绍;

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

  • 缺点:

  1. 每一个要返回的真实的实体都要建立一个对应的空对象模型,那样会增加类的数量;
  2. 模式使用时应谨慎,因为它可以使错误显示为正常程序执行。

4. 空对象模式使用场景介绍;

(1)对象实例需要一个协作实例。空对象模式不会引入协作实例,它只是使用现有的协作实例;
(2)部分协作实例不需要做任何处理;
(3)从客户端中将对象实例不存在的代码逻辑抽象出来。

如果本文对您有帮助,麻烦点赞、关注!

谢谢!

相关文章

网友评论

    本文标题:设计模式:空对象模式

    本文链接:https://www.haomeiwen.com/subject/olkpcrtx.html