设计模式--行为模式--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 ,