抽象设计/模式问题

时间:2010-02-26 12:18:50

标签: objective-c design-patterns

我有一堆对象负责自己的构建(从网络消息中获取属性,然后构建)。通过构造我的意思是设置框架大小,颜色,那种东西,而不是文字对象的构造。

当我开始添加条件来控制构建算法时,代码变得非常臃肿和混乱,所以我决定将算法分成一个“Builder”类,它基本上获取对象的属性,找出需要的东西完成然后将更改应用于对象。

将构建器算法分开的优点是我可以包装/装饰它,或者完全覆盖它。对象本身不需要担心它是如何构建的,它只是创建builder并“装饰”builder,并具有完成工作所需的额外功能。

我对这种方法非常满意,除了一件事......因为我的Builder没有从对象本身继承(对象很大而且我想要运行时自定义),所以我必须暴露很多对象的内部属性。

这就像雇用建筑工人来重建你的房子一样。他自己不是一所房子,但他需要访问内部细节,他透过窗户看不到任何事情。我不想把我的房子打开给每个人,只有建筑师。

我知道对象应该照顾自己,在理想的世界中,我的对象(房子)会自行构建,但我只重构此对象的build部分,我需要一种方法来应用动态构建算法,我讨厌仅仅为了Builder而使用getter和setter来打开我的对象。

我应该提到我在Obj-C ++中工作,所以缺少friend类或内部类。如果解释过于抽象,我会很乐意用更具体的东西来澄清。主要是寻找关于在这种情况下该怎么做的想法或建议。

干杯人, 萨姆

编辑:这是宣告

的好方法
interface House(StuffTheBuilderNeedsAccessTo)

Builder.h内的类别?这样我想我可以声明构建器需要的属性并将合成器放在House.mm中。没有人可以访问属性,除非它们包含Builder标题....

这就是我能想到的全部!

5 个答案:

答案 0 :(得分:1)

我建议使用Factory模式来构建对象 你可以在SO上搜索“工厂”,你就得到一个号码。与之相关的问题。

另请参阅Builder模式。

答案 1 :(得分:1)

您可能需要考虑使用委托。为您的类添加委托方法(以及支持的方法的协议)。 Builder类的对象可以用作委托。 委托可以实现像calculateFrameSize(返回帧大小)等方法。委托的返回值可以存储为ivar。这样,您的类的实现细节仍然是隐藏的。你只是将逻辑外包。

答案 2 :(得分:1)

实际上有一个名为Builder的设计模式,它试图通过为某个类创建不同的配置来解决问题。检查出。也许它可以给你一些想法?

但潜在的问题仍然存在;构建器需要访问它正在构建的对象的属性。

答案 3 :(得分:0)

相反,使用多重继承,所以你的类也是一个Builder?这意味着大部分算法都可以在基类中,并且可以扩展到适合您特定House的neads。它不是很漂亮,但它应该让你抽象出大部分功能。

答案 4 :(得分:0)

我不知道Obj-C ++,所以我不知道这是否可行,但这听起来像Categories的问题。在house本身的声明中,只向house展示必要的方法,创建一个包含您想要隐藏的所有私有方法的类别。