代码之家  ›  专栏  ›  技术社区  ›  Hugo Mota

模式策略、访问者和模板方法有什么区别?

  •  15
  • Hugo Mota  · 技术社区  · 15 年前

    我在一个班上,我们刚刚学习了这些设计模式。但是我看不出他们之间有什么区别。它们听起来一模一样,在抽象类的基础上创建具体的类。有人能帮我消除疑虑吗?谢谢(:

    2 回复  |  直到 10 年前
        1
  •  24
  •   wheaties    15 年前

    访问者、策略和模板模式都包含算法的应用。最大的区别在于它们是如何被唤起的,以及如何在实践中被使用。虽然看起来它们有相同的用例,但是看看对象的构造可以看出不同。

    当我们不能将函数作为一类对象传递时,通常使用策略模式。它需要一个非常具体的参数列表,并且在其调用模式中只需要该参数列表。例如:

    struct MyStrat{
        void operator()(const Foo &_input){
            _input.up( 2 );
        }
    };
    
    std::for_each( myFooList.begin(), myFooList.end(), MyStrat() );
    

    然后将其应用于“Foo”类型的对象列表。我们真的没有其他方法可以将其应用于任何其他对象。

    另一方面,当我们想将一个算法应用于一堆可能不共享相同签名或具有相同成员函数的对象时,则使用visitor模式。我们之所以说visitor模式,是因为它经常用于遍历树或其他“不相关”对象的集合(在继承意义上是不相关的)

    struct MyVisitor{
        void visit(const Foo &_input){
             _input.up( 2 );
        }
        void visit(const Bar &_input){
             _input.raiseUp( 2 );
        }
        void visit(const Baz &_input){
             _input.setUp( 2 );
        }
     };
    

    在这里,我们的想法是,我们想“起来”所有这些物体。它们都不共享同一成员函数签名,但在概念上都是相关的。因此,我们可以“访问”这些类中的每一个,但希望算法执行相同类型的任务。

    通过使用visitor模式,我们可以避免将每个类包装成代理模式。因此,对于N个类,我们希望将此算法应用于我们不需要生成N个代理类。我们只需要向visitor类添加N个方法。

    模板方法与访问者和策略模式都有很大不同。对于模板,您要做的是在层次结构中的不同子类上强制执行相同类型的算法。例如:

    class Duck{
    public:
        int count() =0;
        void makeNoise(int times) =0;
        void quack(){ makeNoise( count() ); }//the template pattern is here
    };
    
    class Mallard : public Duck{
    public:
        int count(){ return 4; }
        void makeNoise( cout << "quack" << endl; }
    };
    
    class Daffy{
    public:
        int count(){ return 1; }
        void makeNoise( cout << "Why I ought to..." << endl; }
    };
    

    因此,算法的结果在继承人中是不同的。

        2
  •  1
  •   Ravindra babu    8 年前

    共性:

    1. 策略、模板方法和访问者 :这三种模式都被归类为行为模式。

    差异:

    1. 模板法 使用继承和 策略 使用合成
    2. 这个 模板法 不应重写基类实现的。 这样,算法的结构由超类控制,细节在子类中实现
    3. 策略 将算法封装在一个接口后面,从而使我们能够在运行时更改算法
    4. 访客 模式用于对一组类似类型的对象执行操作。借助visitor模式,我们可以将操作逻辑从对象移到另一个类
    5. 如果行动的实施发生变化,我们就必须改变 访客 类而不是触摸所有其他对象。

    看一看 Template method , Strategy Visitor Sourcemaking 更好的理解文章。

    相关职位:

    When should I use the Visitor Design Pattern?

    Real World Example of the Strategy Pattern

    Template design pattern in JDK, could not find a method defining set of methods to be executed in order

    推荐文章