Java 如何在子类上应用模式装饰器
我想将模式装饰器应用到我的Android项目中,但在装饰器中,我将对象的成员资格释放到了他的类中。例如,如果我想在我的关卡中添加一个球,则装饰器ColreBord中的处理将应用于AbstractGameObject而不是球。所以我不知道我的物体是球还是墙。(一个是圆,一个是矩形) 在Level.java中:Java 如何在子类上应用模式装饰器,java,subclass,decorator,instanceof,Java,Subclass,Decorator,Instanceof,我想将模式装饰器应用到我的Android项目中,但在装饰器中,我将对象的成员资格释放到了他的类中。例如,如果我想在我的关卡中添加一个球,则装饰器ColreBord中的处理将应用于AbstractGameObject而不是球。所以我不知道我的物体是球还是墙。(一个是圆,一个是矩形) 在Level.java中: AbstractGameObject ball = new Ball (sizeball, posX, posY); ball = new ColRebondBord(ball);//ba
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中,但不是:
有人知道我是否必须使用多态性(在这种情况下,我必须为每个对象球和墙做装饰)或其他想法吗
---编辑---阅读评论,有两种解决方案:(感谢@GuillaumeS和@amdev)
- ColRebondBord的Do 2子类:ColRebondBordBall和ColRebondBordWall
- 做两个装饰,一个装饰球,另一个装饰墙
也许还可以提出其他命题在使用decorator时,您不必检查子类类型。类“Ball”的碰撞边界必须调用super.collisionBorder()。并且您必须在两个不同的类E中实现两个不同的collisionsBorder()函数,因此不必使用ColRebondBord,创建子类ColRebondBordBall和ColRevondBordWall。您必须仔细考虑您想要实现的目标。然后决定装饰师是否是实现这一目标的好方法 装饰师可以将一些常见的“装饰”应用于不同但相似的对象。例如,“BackgroundDecorator”可能会将背景颜色应用于不同的形状(圆形、矩形…)。然后,基类必须支持decorator可以调用的方法“setBackground” 这里的重点是:基类必须支持decorator使用的方法,这样就不需要一些instanceof检查。它应该适用于所有不同的子类(例如,“BorderDecorator”可能需要基类中的“getBoundingBox”方法。然后,如果支持“getBoundingBox”方法,它可以应用于所有类型的元素) 装饰师也可以用于装饰。只需在基类(可能是抽象类)内定义冲突检测所需的方法。如果需要更精确的检测,边界框或多段线可能是有用的
在考虑冲突检测时,会想到使用装饰器的其他方法。某种策略也许。。。“GameObject.getColisionStrategy”…所声明的GameObjectStrategy类型是什么?您是否尝试放置断点来检查对象的类型?@GuillaumeS我为您添加了一个断点捕获。感谢您的帮助GameObjectDecorated的类型似乎是MvtSensor。使用decorator时,您不必检查子类类型。类“Ball”的碰撞边界必须调用super.collisionBorder()。您必须在两个不同的子类中实现两个不同的collisionsBorder()函数,所以不要创建ColRebondBord,而是创建子类ColRebondBordBall和ColRevondBordWall。@GuillaumeS,因为在我的实际项目中我是这样做的:
AbstractGameObject ball=new ball(holeSize,0,0);ball=新MVT传感器(ball);ball=新ColRebondBord(ball);添加一级(球)代码>您的愿景感兴趣,谢谢。但我认为要保留amdev的主张:做ColreBond的两个子类