一定有一个设计模式,但是是哪一个



我有一个三维问题。假设您有一个类Item和一个类Slot实现相同的接口。(我只上两节课,但这个问题必须针对大量的课程)。陆地和水域也是如此,实现相同的界面(就像景观一样,这并不重要)

Car和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

问题是,这必须与景观的数量成比例。

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

我不想在每个项目/插槽下都有一个带有每个Landscape的继承树,也不想在这个树叶下有一个用于每个数据状态的继承树。

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

编辑@Milosz Krajewski:
为什么我不使用桥接模式
我认为桥接模式无法应用,因为我想对对象执行的操作取决于项目/插槽和横向维度。因此,我无法隔离与项目/插槽维度相关的操作并在网桥的一侧执行,也无法隔离与横向维度相关的运算并在网桥的另一侧执行。

我不确定这是否是您的问题。不要把它看得太个人化(你可能无论如何都会),但你的描述很不清楚。我会描述一下我认为你的问题是什么(或类似于什么)。如果我做对了,继续阅读,如果没有,就忽略它。

问题:我们有类层次结构,比如说:Control<-按钮<-复选框。不幸的是,我们还有另一个维度:WinForms和GTK(不相关,但它们都继承了一些抽象)。因此,我们最终增加了类:WinFormsControl、GTKControl、WinFormsButton、GTKButton和WinFormsCheckbox以及GTKCheckbox。

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

答案是"桥"。您可以创建一个类层次结构Control、Button、Checkbox。您将所有依赖于ToolkitServices的"工具箱",比如WinFormServices和GTKServices(以及QtServices)。控件将ToolkitService作为参数。

您最终在左边有一个层次结构(Control<-Button<-Checkbox),在右边有第二个层级结构(WinForms,GTK)。左边"使用"右边(组合),但添加新的工具箱,比如Qt,就是添加一个新类:QtServices,仅此而已。

这是你想要描述的场景吗?

最新更新