Decorator
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。 这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。 我们通过下面的实例来演示装饰器模式的用法。
GameObject
public abstract class GameObject {
public int x,y;
public abstract void paint(Graphics g);
public abstract int getWidth();
public abstract int getHeight();
}
Bullet和Explode、tank、wall中添加getWidth()和getHeight()方法,删除原本的x,y
GODecorator,游戏对象装饰器
public abstract class GODecorator extends GameObject {
GameObject go;
public GODecorator(GameObject go){
this.go = go;
}
@Override
public abstract void paint(Graphics g);
}
RectDecorator
public class RectDecorator extends GODecorator{
public RectDecorator(GameObject go) {
super(go);
}
@Override
public void paint(Graphics g) {
this.x = go.x;
this.y = go.y;
go.paint(g);
//加个方框
Color c=g.getColor();
g.setColor(Color.WHITE);
g.drawRect(go.x,go.y,getWidth()+2,getHeight()+2);
g.setColor(c);
}
@Override
public int getWidth() {
return super.go.getWidth();
}
@Override
public int getHeight() {
return super.go.getHeight();
}
}
TailDecorator
public class TailDecorator extends GODecorator{
public TailDecorator(GameObject go) {
super(go);
}
@Override
public void paint(Graphics g) {
this.x = go.x;
this.y = go.y;
go.paint(g);
//加个方框
Color c=g.getColor();
g.setColor(Color.WHITE);
g.drawLine(go.x,go.y,go.x+getWidth(),go.y+getHeight());
g.setColor(c);
}
@Override
public int getWidth() {
return super.go.getWidth();
}
@Override
public int getHeight() {
return super.go.getHeight();
}
}
对发射的子弹,做一个方框和尾巴的装饰
public class DefaultFireStrategy implements FireStrategy {
int bX = t.x + Tank.WIDTH / 2 - Bullet.WIDTH / 2;
int bY = t.y + Tank.HEIGHT / 2 - Bullet.HEIGHT / 2;
//new Bullet(bX, bY, t.dir, t.group);
//new bullet把自己又加了一遍bug
//两个装饰器一起使用
GameModel.getInstance().add(
new RectDecorator(
new TailDecorator(new Bullet(bX, bY, t.dir, t.group))));
if (t.group == Group.GOOD) new Thread(() -> new Audio("audios/tank_fire.wav").play()).start();
}
}