哪些设计模式未得到充分利用?

时间:2008-09-24 15:30:42

标签: design-patterns

您经常使用的是Gang Of Four Design Pattern,但在其他人的设计中几乎没有使用过吗?如果可能,请描述一个简单的示例,其中此模式可能很有用。它不一定是Gang of Four模式,但如果您选择非GoF模式,请包含指向模式描述的超链接。

换句话说:
我或其他对主要模式有所了解的人有哪些好/有用的设计模式可能还不知道?

5 个答案:

答案 0 :(得分:8)

史蒂夫·叶格(Steve Yegge)写了一篇(通常)长篇blog entry about the Interpreter Pattern,声称这种模式是唯一可以使代码“更小”的GoF模式,并且被其他人非常熟悉的程序员犯罪未充分利用GoF模式。我是那些程序员之一 - 我从来没有使用过Interpreter模式,虽然我认识到它对DSL之类的东西很重要。无论如何,这是一篇非常发人深省的文章,如果你有坚韧的阅读整个Yegge帖子。

答案 1 :(得分:5)

战略模式可能吗?我看不到很多人使用它,当计算改变或可以累积在一起时它非常有用。当计算的一部分可以被另一个计算替换时,我使用它。通常在用于企业产品费率的程序中。

以下是一些文档:

答案 2 :(得分:5)

访客声誉不佳,部分原因是存在一些实际问题

  • Vistor和Visited层次结构之间的循环依赖
  • 它应该通过公开Visited classes internals
  • 来破坏封装

部分是由于GOF书中的阐述,强调遍历结构而不是将虚函数添加到封闭的层次结构中。

这意味着在适当的情况下不会考虑它,例如解决静态类型语言中的双重调度问题。示例:在C ++中传递系统的消息或事件,其中消息的类型是固定的,但我们希望通过添加新的收件人来扩展。这里,消息只是结构,所以我们不关心封装它们。 SendTo()不知道MessageMessageRecipient的类型。

#include <iostream>
#include <ostream>
using namespace std;

// Downside: note the cyclic dependencies, typically expressed in
// real life as include file dependency. 
struct StartMessage;
struct StopMessage;

class MessageRecipient
{
public:
    // Downside: hard to add new messages
    virtual void handleMessage(const StartMessage& start) = 0;
    virtual void handleMessage(const StopMessage& stop) = 0;
};

struct Message
{
    virtual void dispatchTo(MessageRecipient& r) const = 0;
};

struct StartMessage : public Message
{
    void dispatchTo(MessageRecipient& r) const
    {
        r.handleMessage(*this);
    }
    // public member data ...
};

struct StopMessage : public Message
{
    StopMessage() {}

    void dispatchTo(MessageRecipient& r) const
    {
        r.handleMessage(*this);
    }
    // public member data ...
};

// Upside: easy to add new recipient
class RobotArm : public MessageRecipient
{
public:
    void handleMessage(const StopMessage& stop)
    {
        cout << "Robot arm stopped" << endl;
    }

    void handleMessage(const StartMessage& start)
    {
        cout << "Robot arm started" << endl;
    }
};

class Conveyor : public MessageRecipient
{
public:
    void handleMessage(const StopMessage& stop)
    {
        cout << "Conveyor stopped" << endl;
    }

    void handleMessage(const StartMessage& start)
    {
        cout << "Conveyor started" << endl;
    }
};

void SendTo(const Message& m, MessageRecipient& r)
{
    // magic double dispatch
    m.dispatchTo(r);
}

int main()
{
    Conveyor c;
    RobotArm r;

    SendTo(StartMessage(), c);
    SendTo(StartMessage(), r);
    SendTo(StopMessage(), r);
}

答案 3 :(得分:4)

许多新开发者似乎很难理解访客模式。当我有可能获得Country&gt; State&gt; City&gt; House的价值时,我正在使用它进行微积分。这样我就不需要改变每个子集合中有多少数据了。我只选择合适的访客,最终的答案是获得任何国家,州或城市的数量。

答案 4 :(得分:2)

如果我们谈论的是非GOF模式,那么Monitor Object就是并发OO编程的'Hello World'。我很惊讶有多少程序员管理不听,或者更喜欢设计他们自己的ad hoc同步方案。