当前位置:编程学习 > JAVA >>

设计模式--行为模式--NULL Object--Java

NULL OBJECT Patterns         
          第一次发现此模式时,是由于Bob大叔的经典著作《Agile Principles, Patterns, and Practices In C#》!
       下面是出自书中的例子作为引例:
[java]  
Employee e = DB.GetEmployee("Bob");  
if (e != null && e.IsTimeToPay(today))  
        e.Pay();  
          通过这个小小的例子会发现每次都得在条件中判断e!=null。
                    1、代码重复。
                    2、代码丑陋。
                    3、容易漏写。
        解决方式:
 
[java]  
Employee e = DB.GetEmployee("Bob");  
if (e.IsTimeToPay(today))  
         e.Pay();  
 
[java]  
public abstract class Employee  
{  
       public abstract bool IsTimeToPay(DateTime time);  
       public abstract void Pay();  
       public static readonly Employee NULL =  new NullEmployee();  
       private class NullEmployee : Employee  
       {  
           public override bool IsTimeToPay(DateTime time)  
           {  
                return false;  
           }  
           public override void Pay(){  
  
           }  
      }  
}  
 
连连看
 下面举出一个较为实际的例子:
[java]  
             // present game item  
or (int i = 0; i < world.getRow(); i++) {  
for (int j = 0; j < world.getCol(); j++) {  
    game.getGraphics().drawPixmap(world.getItem(i, j),  
            j * world.getItemSize(),  
            i * world.getItemSize());  
}  
此局部代码主要为绘制练练看元素。
world.getRow     获取连连看矩阵行数
world.getCol      获取连连看矩阵列数
world.getItem    获取连连看制定位置的Image
 
其中getItem代码:
[java]  
public Pixmap getItem(int i, int j) {  
        switch (datas[i][j]) {  
        case 1:  
            return Assets.a;  
        case 2:  
            return Assets.b;  
        case 3:  
            return Assets.c;  
        case 4:  
            return Assets.d;  
        case 5:  
            return Assets.e;  
        case 6:  
            return Assets.f;  
        case 7:  
            return Assets.g;  
        case 8:  
            return Assets.h;  
        case 9:  
            return Assets.i;  
        case 10:  
            return Assets.j;  
        }  
        return Assets.NULL;  
    }  
 
 
资源加载代码:
[java]  
              Assets.a = g.newPixmap("a.png", PixmapFormat.ARGB8888);  
Assets.b = g.newPixmap("b.png", PixmapFormat.ARGB8888);  
Assets.c = g.newPixmap("c.png", PixmapFormat.ARGB8888);  
Assets.d = g.newPixmap("d.png", PixmapFormat.ARGB8888);  
Assets.e = g.newPixmap("e.png", PixmapFormat.ARGB8888);  
Assets.f = g.newPixmap("f.png", PixmapFormat.ARGB8888);  
Assets.g = g.newPixmap("g.png", PixmapFormat.ARGB8888);  
Assets.h = g.newPixmap("h.png", PixmapFormat.ARGB8888);  
Assets.i = g.newPixmap("i.png", PixmapFormat.ARGB8888);  
Assets.j = g.newPixmap("j.png", PixmapFormat.ARGB8888);  
  
Assets.NULL = new AndroidPixmap(Bitmap.createBitmap(40, 40,  
        Config.ARGB_8888), PixmapFormat.ARGB8888);  
 
 
通过使用NULL OBJECT 模式,在绘制时根本不用考虑获取的连连看元素的图片是否为null,使得代码更清晰更优美,另一方面使得渲染职责不必知道我要绘制的元素是否合法,符合OO的封装思想。
在此我们使用了一个透明的连连看元素作为“NULL OBJECT”。
补充:软件开发 , Java ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,