我有一种三维问题。 假设你有一个类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的 编辑:
为什么我不使用桥接模式
我认为不能应用桥接模式,因为我想对我的对象执行的操作取决于项目/槽片和横向尺寸。因此,我无法隔离与项目/插槽维度相关的操作,并在桥梁的一侧执行它们,并隔离与景观维度相关的操作,并在桥梁的另一侧执行它们
答案 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,就是这样。
这是你试图描述的情景吗?