如何在子类上应用Pattern Decorator

时间:2015-01-11 11:57:37

标签: java subclass decorator instanceof

我想将Pattern Decorator应用到我的Android项目中,但是在装饰器中我将对象的成员资格放到他的类中。例如,如果我想在级别中添加 Ball ,我的装饰器 ColRebondBord 中的处理将应用于 AbstractGameObject 不是球。所以我无法知道我的物体是球还是墙。 (一个是圆形,一个是矩形)

enter image description here

在Level.java中:

AbstractGameObject ball = new Ball (sizeball, posX, posY);
ball = new ColRebondBord(ball);//ball will rebond on the border level(screen)
lvl.add(ball);//add the ball in the Level

在ColRebondBord.java中:

public void collisionBorder(double xLeftTopCorner, double yLeftTopCorner, double width, double height)
{

    if(_GameObjectDecorated instanceof Ball) {
        //treatments for Ball Object but never comes here
    }
    if(_GameObjectDecorated instanceof Wall) {
        //treatments for Wall Object but never comes here
}

这是在collisionBorder中捕获一个断点,我认为它会出现在第一个IF中,但是没有:

enter image description here

有人知道我是否必须使用多态(所以在这种情况下,我必须为每个对象Ball和Wall做装饰器)或其他想法吗?

---编辑---阅读评论,有2个解决方案:(感谢@GuillaumeS和@amdev)

  • 做ColRebondBord的2个子类:ColRebondBordBall和ColRebondBordWall
  • 做2个装饰器,一个用来装饰Ball和另一个墙

也许可以提出其他命题

2 个答案:

答案 0 :(得分:0)

使用decorator.Collision border for class" Ball"时,你不必检查子类类型。必须调用super.collisionBorder()。你必须在两个不同的classe中实现两个不同的collisionsBorder()函数,所以不要使用ColRebondBord,而是创建子类ColRebondBordBall和ColRevondBordWall。

答案 1 :(得分:0)

你必须仔细考虑你想要达到的目标。然后决定装饰器是否是实现这一目标的好方法。

装饰器可用于将一些常见的“装饰”应用于不同但相似的对象。例如,“BackgroundDecorator”可能会将背景颜色应用于不同的形状(cricle,矩形......)。然后基类必须支持装饰者可以调用的方法“setBackground”。

这里的import和point:基类必须支持装饰器使用的方法,这样你就不需要一些instanceof检查。它应该适用于所有不同的子类(例如,“BorderDecorator”可能需要在基类中使用“getBoundingBox”方法。然后,如果它们支持“getBoundingBox”方法,则可以应用于所有类型的元素。)

装饰师也可以用于整理。只需定义基类内部colision检测所需的方法(可能是抽象的)。如果需要更准确的检测,边界框可能有用,或者是折线。

在考虑切除检测时,会想到使用装饰器的其他方法。某种策略可能......“GameObject.getColisionStrategy”......