2010-09-08 49 views
2

我试图找出最佳的设计模式从知道太多关于它包含在父对象隔离的子对象。最佳设计模式来隔离在父对象数组包含

对于子对象的方法例如,有这样的父类...

 
class Airplane { 
    var seats:Array 
    ... 

    function removeSeat(seat:Seat) { 
    // find seat object in seats array and remove it 
    } 
} 

子类...

 
class Seat { 
    var rowNumber:int 
    ... 
} 

如果我在座位对象的上下文我的工作,我想删除自己从我的父母Airplane对象中,将座椅与Airplane.seats阵列中的位置分开的最佳方式是什么?

我知道我可以通过飞机父对象到座椅的构造函数,然后调用飞机的removeSeat方法来去除座椅,但我想在座椅知道的一些关于飞机如果可能的话。有任何想法吗?

+3

也许你的问题是,座位可以删除自己......? – willcodejavaforfood 2010-09-08 11:20:57

+0

无可否认,这可能是问题所在。上面的例子是虚构的,但我实际上有一个座位编辑视图,它上面有一个“删除座位”按钮。该视图只知道Seat实例,它是最清晰的编程方式。将移动座位按钮链接到飞机视图可能会更好,因为最终它是飞机的功能。总的来说,我可以看到两种情况下的UX情况 - 例如用户希望在一个更直观的单一视图中执行Seat操作,即使它们在较高的环境中有效。 – supertodda 2010-09-08 12:52:04

回答

4

您可以使用事件处理程序模式 - 本质上,飞机在施工时将“removeMe”回调传递给座椅。座椅然后在想要移除时执行此回调。座位不知道谁在回调中传递 - 它只需要知道回调的签名,在此示例中,第一个参数是对Seat对象的引用。

E.g.在伪代码中

class Airplane { 
    // will be passed in as callback 
    function removeSeat(seat) { 
    array.remove(seat); 
    } 
    .. 
    var seat = new Seat(); 
    seat.removeCallback = removeSeat; 
    .. 
} 

class Seat() { 
    removeCallback = null; 
    ... 
    ... 
    // when we want to remove the seat, run the callback if set 
    if (removeCallback !== null) { 
     removeCallback(this); 
    } 
} 
0

为了保持这种分离,您访问座位的环境也应该知道他们所属的女巫飞机。例如:

class AirplaneService { 
    public function removeEmptySeats(Airplane airplane) { 
     foreach seat in airplane { 
     if seat is empty { 
      airplane.removeSeat(seat); 
     } 
     } 
    } 

    public function removeRowSeats(Airplane airplane, int rowNumber) { 
     foreach seat in airplane { 
     if seat.getRowNumber() == rowNumber { 
      airplane.removeSeat(seat); 
     } 
     } 
    } 
} 
2

尝试实施访问者模式的变体。

interface SeatContainer { 

    function removeSeat(seat:Seat); 

} 

然后你的飞机实现了接口

class Airplane implements SeatContainer { 
    var seats:Array 
    ... 

    function removeSeat(seat:Seat) { 
    // find seat object in seats array and remove it 
    } 
} 

而且你的座位持有参考接口

class Seat { 
    var container:Container 
    ... 
    function removeMyself() { 
    container.removeSeat(this); 
    } 
} 

这样,座椅对象忽略了什么样的容器中,正在与SeatContainer的实际实施隔离:它可能是Car,Cinema,Boat或SeatContainer接口的任何实现。

+0

这是一个很好的解决方案,但仅仅为了claritie的缘故,这与GoF Visitor模式没有任何关系。 – munificent 2010-09-08 17:31:40