【问题标题】:What's the name of this design pattern? Façade, adapter, bridge, proxy?这种设计模式的名称是什么?外观、适配器、网桥、代理?
【发布时间】:2014-08-01 00:34:21
【问题描述】:

在我的一个项目中,我在几个地方使用了以下模式:我有一个类 A 有一堆方法,类 B 是用指向 @987654323 的某个实例的指针构造的@,只为用户(不是A 实例的所有者)导出这些方法的子集。

class A
{
public:
    void doStuff();
    void doOtherStuff();
    void doYetOtherStuff();
    B getB()
    {
        return B(this);
    }
};

class B
{
    friend class A;

public:
    void doStuff()
    {
        _a->doStuff();
    }

    void doOtherStuff()
    {
        _a->doOtherStuff();
    }

private:
    B(A* a) : _a(a) {}
    A* _a;
};

例如,A 的实例可以由我的库创建,B 的创建实例(与A 相关联)可以传递给插件,该插件仍然可以访问 @ 987654329@ 实例,尽管方式有限。

我只是对B设计模式名称感到困惑:它是外观、桥梁、适配器还是代理?还是别的什么?

【问题讨论】:

  • Proxy设计模式
  • 为什么要动态分配?为什么不简单地B getB() { return B(this); }
  • @FredOverflow:已编辑(实际用例如果不完全一样,但是是的,这种动态分配在这里没用)。
  • FACADE 但它并没有简化任何事情。它和原来的类一样好。
  • 它可以是任何东西,因为它没有做太多事情,也没有实现“接口”。

标签: c++ design-patterns proxy-classes facade bridge


【解决方案1】:

如果没有更多上下文,我将其称为委托。 B 将做事的责任委托给 A。

这是 Cocoa / UIKit 编程中极其常见的模式,特别是如果 A 是一个相当抽象的类型 - 如果 A 只是一个任何类都可以实现的接口,情况就更是如此了。

但是,如果您要简化接口,特别是如果 B 的生命周期很短(只是为了简化对 A 的访问而存在),那么是的,这就是外观模式。

关于其他模式 - 没有一个是完全排除的,但这是我的想法:

适配器通常会更改接口 - 即 B 的客户端想要调用 doStuff(),但 A 有一些其他接口(可能更复杂或特定于域),客户端不希望这样做处理,所以 B 将 A 的接口适配到客户端想要的接口。

代理通常会涉及一些远程或不易访问或可实例化的对象的表示; A 的可访问性使它看起来不像这里的代理模式,但代理当然可以包装同名的 API 调用。

如果 A 的实现可能不同,而 B 对客户隐藏了这一事实,这可能表明了一种策略模式。

【讨论】:

    【解决方案2】:

    在这种情况下,我建议检查Huston Design Patterns。在每个模式的末尾,它引用了 GoF 并给出了当前模式和相关模式之间的差异。

    例如,在 Proxy 上我们可以阅读:

    适配器为其主题提供不同的接口。代理提供相同的接口。装饰器提供了一个增强的接口。 [GoF。 p216]

    因此,由于您限制接口,这更接近于适配器,尽管我们仍然需要检查 Bridge 和 Facade。

    如果我们检查适配器,我们会得到其他块:

    Bridge 是预先设计的,让抽象和实现独立变化。改装适配器以使不相关的类一起工作。 [GoF,p161]

    Facade 定义了一个新接口,而 Adapter 重用了一个旧接口。请记住,适配器使两个现有接口协同工作,而不是定义一个全新的接口。 [GoF,pp219]

    但是,他们并没有说得那么清楚。在这一点上不太清楚,因为设计不是名称的唯一贡献者,意图也很重要。 Facade 是关于隐藏复杂性的,而 Bridge 是关于去相关正交维度的:这里都不适用。

    这样我们就剩下了适配器

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-10
      • 2015-05-06
      • 2011-03-30
      • 2012-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多