我正在开发一个
Android项目,我正在面对这种情况.
我有2个班:
class A extends B { openDoor(){ //impl } closeDoor(){ //impl } } class X extends Y{ openDoor(){ //impl } closeDoor(){ //impl } }
现在,如果你观察到这两个类在openDoor()和closeDoor()
我的方法
class ContainingDuplicateMethods{ openDoor(){ //impl } closeDoor(){ //impl } } }
在类中创建ContainingDuplicateMethod的对象并调用方法,我们将其称为策略模式,但这是最好的解决方案吗?为什么在大型项目中,我们无法遵循这种做法,而且人们说这不是良好的做法,在这种情况下,我需要遵循哪些方法?
请注意,A类和X类已经扩展了其他类,我也不想使用静态,因为 – 当程序执行开始时,静态成员被加载到内存中,直到程序被终止为止,说我的代码连续运行天或周,并使用静态引用继续创建许多对象,因此可能会有内存不足的可能.
解决方法
“有利于构成遗产”是一件值得记住的事情.
开门打开门课.包括一个门作为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 }
请注意,这与策略模式相似,但并不完全相同.策略模式有一个主对象,然后插入多种策略(即不同形式的门).这有一个门和多个其他对象使用相同类型的门,虽然你可以扩展它使用战略模式,并有很多门实施很容易.