2015-03-03 43 views
2

我有一种三维问题。 可以说你有一个类Item和一个实现相同接口的类Slot。 (我只有两门课,但问题必须扩展到大量课程)。这同样适用于土地和水资源,实现相同的接口(如景观,这并不重要)必须有一个设计模式,但哪一个?

汽车和小船从项目继承和非常接近对方。 与从插槽继承的Parking_slot和Harbor_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

'foo_A'和'bar_A'之间的关系是什么?什么阻止你使用多重继承,只是......这样做(又或为什么你需要一个设计模式来做些什么?) – sol 2015-03-03 14:53:09

+0

在代码方面没有任何关系。但是如果我添加一个foo_C,我还会添加一个bar_C。除此之外,不分享代码。 – Borbag 2015-03-03 14:57:41

+0

我不需要设计模式,我需要的是有一个可扩展的体系结构。 – Borbag 2015-03-03 15:04:31

回答

0

的其他SID执行他们,我不知道这是你的问题。不要太亲自(你可能会反正),但你的描述是不清楚的。我将描述我认为你的问题是(或类似于)。如果我明白了,请继续阅读,如果没有,请忽略它。

问题:我们有一流的层次,让我们说:控制< - 巴顿< - 复选框。不幸的是,我们还有另外一个方面:WinForms和GTK(无关紧要,但它们都继承了一些Abstract)。所以我们最终得到乘法类:WinFormsControl,GTKControl,WinFormsButton,GTKButton和WinFormsCheckbox和GTKCheckbox。

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

答案是“桥”。您创建一个类层次结构控制,按钮,复选框。将所有依赖于“工具包”的东西都放到ToolkitServices中,比如说WinFormServices和GTKServices(和QtServices)。控件将ToolkitService作为参数。 (控制< - 按钮< - 复选框)和第二个在右边(WinForms,GTK)。左侧“使用”右侧(组合),但添加新工具包,让我们说Qt,是关于添加一个新类:QtServices,就是这样。

这是你想描述的场景吗?

+0

1)您认为如何改进我的问题描述? 2)就像我在我的问题中所说的那样,桥模式的气味确实存在。你实际上已经理解了这个问题,但是在应用这个模式时存在一个问题:我想应用在我的对象上的操作不依赖于其中一个维度,但是他们需要知道要执行的两个维度。在这种情况下,我不能像桥梁模式那样将它们分开。 – Borbag 2015-03-03 16:06:19

+0

我认为你的描述太抽象了。也许在A和B或Foo和Bar之间可以发现共同点,但将它们隐藏在这些名称之后使得找不到(对我们而言)。在某种意义上,询问“什么样的设计模式?”你要求我们找到它们,同时你也在混淆它们。 – 2015-03-04 11:29:50

相关问题