我想将Pattern Decorator应用到我的Android项目中,但是在装饰器中我将对象的成员资格放到他的类中。例如,如果我想在级别中添加 Ball ,我的装饰器 ColRebondBord 中的处理将应用于 AbstractGameObject 不是球。所以我无法知道我的物体是球还是墙。 (一个是圆形,一个是矩形)
在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中,但是没有:
有人知道我是否必须使用多态(所以在这种情况下,我必须为每个对象Ball和Wall做装饰器)或其他想法吗?
---编辑---阅读评论,有2个解决方案:(感谢@GuillaumeS和@amdev)
也许可以提出其他命题
答案 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”......