当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《哪些设计模式未得到充分利用?》经验,为你挑选了3个好方法。

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

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



1> Scott Bale..:

Steve Yegge撰写了一篇关于解释器模式的(通常)漫长的博客文章,声称这种模式是唯一可以使代码"更小"的GoF模式,并且由于程序员对其他GoF模式非常熟悉而未能充分利用这种模式. .我是那些程序员之一 - 我从来没有使用过Interpreter模式,虽然我认识到它对DSL之类的东西很重要.无论如何,这是一篇非常发人深省的文章,如果你有坚韧的阅读整个Yegge帖子.



2> Patrick Desj..:

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

这是一些文档:

维基百科

DoFactory



3> fizzer..:

访客声誉不佳,部分原因是一些真正的问题

Vistor和Visited层次结构之间的循环依赖关系

它应该通过暴露Visited类内部来破坏封装

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

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

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

推荐阅读
有风吹过best
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有