必须有一个设计模式,但哪一个?

时间:2015-03-03 13:57:45

标签: python design-patterns

我有一种三维问题。 假设你有一个类Item和一个实现相同接口的类Slot。 (我只接受两个课程,但问题必须扩展到大量的课程)。 Land and Water也是如此,实现相同的界面(如景观,这并不重要)

Car and Boat继承自Item,彼此非常接近。 Parking_slot和Harbor_slot也是如此,继承自Slot。在这里你有两个维度,我可以闻到一个桥梁模式,但不完全。

class Data:

    @abstract_method
    def do_this():
        pass

    @abstract_method
    def do_that():
        pass


class Item(Data):

    @abstract_method
    def do_this():
        pass

    @abstract_method
    def do_that():
        pass


class Slot(Data):

    @abstract_method
    def do_this():
        pass

    @abstract_method
    def do_that():
        pass


class Car(Item):

    def do_this():
        # actually_do_something

    def do_that():
        # actually_do_something


class Boat(Item):

    def do_this():
        # actually_do_something
        # close to Car

    def do_that():
        # actually_do_something
        # close to Car


class Parking_slot(Slot):

    def do_this():
        # actually_do_something

    def do_that():
        # actually_do_something


class Harbor_slot(Slot):

    def do_this():
        # actually_do_something
        # close to Parking_slot

    def do_that():
        # actually_do_something
        # close to Parking_slot

事情是,必须按照景观数量进行扩展。

对于3d维度,我希望有一个使用它实现的状态机,所以我可以在每个状态中有不同的do_that和do_this行为。例如,这些状态可以是数据的存储方式,我们将有一个boat_csv,car_bdd,Parking_slot_cloud等类集合。

我不希望每个项目/插槽下都有一个包含每个Landscape的继承树,并且在每个树叶下面都有一个每个数据状态的继承树。

我已经阅读了设计模式圣经(http://www.uml.org.cn/c++/pdf/DesignPatterns.pdf)中描述的所有模式,感觉它们都不匹配。你知道任何模式适用于我的情况吗?

@Milosz Krajewski的

编辑
为什么我不使用桥接模式
我认为不能应用桥接模式,因为我想对我的对象执行的操作取决于项目/槽片和横向尺寸。因此,我无法隔离与项目/插槽维度相关的操作,并在桥梁的一侧执行它们,并隔离与景观维度相关的操作,并在桥梁的另一侧执行它们

1 个答案:

答案 0 :(得分:0)

我不确定这是不是你的问题。不要太个人化(你可能会反正),但你的描述还不清楚。我将描述我认为你的问题是什么(或者是类似的)。如果我说得对,请继续阅读,如果没有,请忽略它。

问题:我们有类层次结构,比方说:Control< - Button< - Checkbox。不幸的是,我们还有另一个维度:WinForms和GTK(不相关,但它们都继承了一些Abstract)。所以我们最终将类增加:WinFormsControl,GTKControl,WinFormsButton,GTKButton和WinFormsCheckbox以及GTKCheckbox。

添加新的Control / Widget需要编写两个类,比方说,添加RadioButton将需要WinFormsRadioButton和GTKRadioButton。 添加新的“工具包”,比方说Qt,需要编写三个新控件:QtControl,QtButton,QtCheckbox(当然还有QtRadioButton)。添加第三维并开始哭...

答案是“桥”。您创建一个类层次结构Control,Button,Checkbox。你将所有“工具包”依赖于ToolkitServices,比如说WinFormServices和GTKServices(以及QtServices)。 Control将ToolkitService作为参数。

最终左边有一个层次结构(Control< - Button< - Checkbox),右边第二个(WinForms,GTK)。左侧“使用”右侧(组合)但添加新工具包,比如说Qt,是关于添加一个新类:QtServices,就是这样。

这是你试图描述的情景吗?