代码之家  ›  专栏  ›  技术社区  ›  tyshock

哪些设计模式未得到充分利用?[闭门]

  •  11
  • tyshock  · 技术社区  · 16 年前

    有什么特别的建议吗 Gang Of Four Design Pattern

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

    5 回复  |  直到 14 年前
        1
  •  8
  •   Mitch Wheat    16 年前

    史蒂夫·耶格写了一篇(典型的)长篇小说 blog entry about the Interpreter Pattern ,声称此模式是唯一一种可以使代码“更小”的GoF模式,并且被那些对其他GoF模式非常熟悉的程序员非法地未充分利用。我是这些程序员中的一员——我从未使用过解释器模式,尽管我认识到它对DSL之类的东西很重要。无论如何,如果你有足够的毅力阅读整个Yegge帖子,这是一篇非常发人深省的文章。

        2
  •  5
  •   fizzer    16 年前

    游客名声不好,部分原因是一些真实的问题

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

    部分原因在于GOF书中的阐述,该书强调结构的遍历,而不是向封闭的层次结构中添加虚拟函数。

    这意味着它在适当的地方没有得到考虑,例如在静态类型语言中解决双重分派问题。示例:C++中的消息传递或事件传递系统,其中消息类型是固定的,但我们希望通过添加新的收件人来扩展。在这里,消息只是结构,所以我们不关心如何封装它们。 SendTo() 不知道是什么类型的 Message MessageRecipient 是的。

    #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
  •  5
  •   Mitch Wheat    16 年前

    也许是战略模式?我看到没有很多人使用它,当计算发生变化或可以一起累积时,它非常有用。当计算的一部分可以替换为另一个计算时,我使用它。通常在用于企业产品费率的程序中。

        4
  •  4
  •   Mitch Wheat    16 年前

    对于许多新开发人员来说,访问者模式似乎很难理解。当我有可能为国家获得价值时,我正在将其用于微积分>国家>城市>房屋这样,我就不需要更改每个子集合中的数据量。我只是选择了正确的游客,最终的答案是无论国家、州或城市的数量是多少。

        5
  •  2
  •   fizzer    16 年前

    如果我们说的是非GOF模式,那么 Monitor Object 是并发OO编程的“你好世界”。令我惊讶的是,有多少程序员竟然没有听说过它,或者宁愿设计自己的即席同步方案。