04-重构设计模式之decorator装饰器模式(对子弹加方框和尾巴)

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();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值