zoukankan      html  css  js  c++  java
  • 空对象模式

    定义:当你在处理可能会出现null的对象时,可能要产生相对乏味的代码来做相应的处理,使用空对象模式可以接受null,并返回相应的信息。空对象模式通常会作为一个单独的空对象类,封装一个默认的行为。通过判断条件来返回不同的对象,空则返回空对象NullCustomer,非空返回RealCustomer,这样避免在客户端调用(XXX == null)这种判空操作。


    结构图:

    优点:这个模式可以消除重复。想象一下,假如有多个消费端,每个消费端都要判断一下是否为空,而且对于为空的场景要做特殊的处理,这样就会导致很多重复。一些例子是:日志对象和缓存对象、图书馆查书系统、查询系统。方便做测试,这些Null Object类似Stub Object。

    使用:以下案例通过工厂类 CustomerFactory 基于客户传递的名字来返回 RealCustomer 或 NullCustomer 对象。判断条件为CustomerFactory 是否存在客户的名字。
    1.创建一个对象抽象类:

    public abstract class AbstractCustomer 
    {
       protected String name;
       public abstract boolean isNull();
       public abstract String getName();
    }

    2.创建对象的实体类,非空和空对象类:

    public class RealCustomer extends AbstractCustomer 
    {
       public RealCustomer(String name) 
      {
          this.name = name;
       }
    
       public Override  String getName() 
      {
          return name;
       }
    
       public Override boolean isNull() 
      {
          return false;
       }
    }
    
    public class NullCustomer extends AbstractCustomer 
    {
        public Override String getName() 
       {
          return "Not Available in Customer Database";
       }
    
       public Override boolean isNull() 
       {
          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()); } }
    一直想把之前工作、学习时记录的文档整理到博客上,一方面温故而知新,一方面和大家一起学习 -程序小白
  • 相关阅读:
    元素类型
    PS
    盒模型
    文本样式
    WebStorm、IntelliJ IDEA、JetBrains、PhpStorm、RubyMine、PyCharm
    微信iOS WKWebview 网页开发适配指南
    js取url参数
    windows 80 端口占用
    前端Demo常用库文件链接
    MAC下利用Github 、hexo、 多说、百度统计 建立个人博客指南
  • 原文地址:https://www.cnblogs.com/wang-jin-fu/p/8321090.html
Copyright © 2011-2022 走看看