“有利于构成遗产”是一件值得记住的事情.
开门打开门课.包括一个门作为A和B的成员.
沃拉,完成工作.
所以A.getDoor().close(). B.getDoor().open()等
如果您需要A和B的通用接口(因此您可以在某处使用),然后创建
interface HasDoor {
Door getDoor();
}
现在A和B可以扩展任何你喜欢的类并实现HasDoor.任何需要门的课程都可以接受HasDoor(或直接接受门对象),并打开,关闭等.
没有重复的代码,充分的灵活性.
如果您需要您的门将方法返回到A和B中,则将Door类作为抽象创建,并将其作为匿名内部类在A和B中实现.抽象方法将从门被调用,然后当这些方法被调用时,可以在A和B中进行任何处理.
例如A类:
class A implements HasDoor {
private Door door = new Door() {
@override void notifyDoorChanged(boolean closed) {
// The door is telling us its been opened or closed
}
}
@override
public Door getDoor() {
return door;
}
}
门是:
public abstract class Door {
boolean closed;
abstract notifyDoorChanged();
public void close() {
closed = true;
notifyDoorChanged(closed);
}
// etc
}
请注意,这与策略模式相似,但并不完全相同.策略模式有一个主对象,然后插入多种策略(即不同形式的门).这有一个门和多个其他对象使用相同类型的门,虽然你可以扩展它使用战略模式,并有很多门实施很容易.