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

时间:2020-03-06 14:40:13  来源:igfitidea点击:

是否有我们经常使用的特定的"四人一组设计模式",却很少在其他人的设计中使用?如果可能,请描述一个简单的示例,其中该模式可能有用。它不一定必须是"四人一组"模式,但是如果我们选择非GoF模式,请在模式说明中包含一个超链接。

换一种方式:
我或者对主要模式有较深了解的其他人可能还不知道哪些良好/有用的设计模式?

解决方案

可能是战略模式?我看到使用它的人不多,当计算更改或者可以一起累积时,它很有用。当一部分计算可以被另一种计算替代时,我会使用它。通常在用于企业对产品进行定价的程序中。

这是一些文件:

  • 维基百科
  • DoFactory

对于许多新开发人员而言,Visitor模式似乎很难理解。当我有可能获得"国家">"州">"城市">"房屋"的价值时,我将其用于微积分。这样,我无需更改每个子集合中的数据量。我只是选择合适的访客,而最终的答案是无论得到多少国家,州或者城市。

  • 游客
  • 访客Wiki

史蒂夫·耶格(Steve Yegge)写了一篇(很长)有关解释器模式的博客文章,声称该模式是唯一可以使代码"更小"的GoF模式,并且被程序员充分利用,否则他们对其他GoF模式非常满意。我是从未使用过Interpreter模式的程序员之一,尽管我意识到它对DSL之类的东西很重要。无论如何,如果我们有肠胃的毅力阅读整篇Yegge文章,那将是一个非常发人深省的文章。

访客声誉不好,部分是由于一些实际问题

  • Vistor和访问的层次结构之间的循环依赖性
  • 它应该通过暴露Visited类的内部来破坏封装

部分是由于GOF书中的阐述,该书强调结构的遍历,而不是向封闭的层次结构添加虚拟功能。

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

#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);
}

如果说的是非GOF模式,那么Monitor Object是并发OO编程的" Hello World"。令我惊讶的是,有多少程序员设法不听说它,或者更喜欢设计自己的临时同步方案。