• Visitor模式和Observer观察者模式


    所谓访问者模式,就是不同服务提供者对同一种服务提供的服务内容不同。

    Typedef   std::vector<Ivisitable>   VisitbleArray;    

    Typedef  std::vector<IVisitor>  VisitorArray;

    Interface  IVisitable

    {

          void      AcceptSum(IVisitor  visitor);     

    void      AcceptAvg(IVisitor  visitor);

          void     CalcSum( IVisitor  visitor) ;

    void    CalcAvg(IVisitor  visitor);

    void    Attach(  Ivisitor  v);

    void    Detach ( Ivisitor  v);      

    }                                                                

    Typedef   std::vector<Ivisitable>   VisitbleArray;    

    Interface IVisitor

    {

    void         GetSum ( IVisitable  v);                       

    void         GetAvg(IVisitable  v);

    void  VisitSumCollection(VisitbleArray collection);      

    void  VisitAvgCollection(VisitbleArray collection);       

    }       

    Class   CVisitor1: public   IVisitor

    {

    void         GetSum ( IVisitable  v)

    {                    

    Printf(“ vistor1 invoke: ”);

         v. AcceptSum (this);

    }                    

    void      GetAvg(IVisitable  v)

    {       

    Printf(“ vistor1 invoke: ”);

       v.AcceptAvg(this);

    }

    //在本方法中,我们实现了对Collection的元素的成功访问
      void   VisitSumCollection(VisitbleArray collection) {
         VisitbleArray::Iterator it = collection.begin();
          while (it  != collection.end())

    {
             it->AcceptSum(this);

    It++;
          }

    }

    void   VisitAvgCollection(VisitbleArray collection) {
         VisitbleArray::Iterator it = collection.begin();
          while (it  != collection.end())

    {
             it->AcceptAvg(this);

    It++;
          }

    }                

    Class   CVisitor2: public   IVisitor

    {

    void         GetSum ( IVisitable  v)

    {                    

    Printf(“ vistor2 invoke: ”);

         v. AcceptSum (this);

    }                    

    void      GetAvg(IVisitable  v)

    {       

    Printf(“ vistor2 invoke: ”);

       v.AcceptAvg(this);

    }

    //在本方法中,我们实现了对Collection的元素的成功访问
      void   VisitSumCollection(VisitbleArray collection) {
         VisitbleArray::Iterator it = collection.begin();
          while (it  != collection.end())

    {
             it->AcceptSum(this);

    It++;
          }

    }

    void   VisitAvgCollection(VisitbleArray collection) {
         VisitbleArray::Iterator it = collection.begin();
          while (it  != collection.end())

    {
             it->AcceptAvg(this);

    It++;
          }

    }                

    Class    CProduct1 :  public   IVisitable

    {

                void      AcceptSum(IVisitor  visitor)

    {

    visitor-> GetSum(this);

    }

         void      AcceptAvg(IVisitor  visitor)

    {

    Visitor->GetAvg(this);

    }

           void     CalcSum( IVisitor  visitor)

    {

         Float  sum =0.0;

    for(std::vector<float>::iterator  it = m_Vec.begin(); m_vec.end();it++)

    Sum += *it;

    Printf(“ product1 calc  sum is =%f ”,sum);

    }     

           void     CalcAvg( IVisitor  visitor)

    {

         Float  sum =0.0,avg=0.0;

    for(std::vector<float>::iterator  it = m_Vec.begin(); m_vec.end();it++)

    Sum += *it;

    avg=sum/ m_Vec.size();

    Printf(“ product1 calc  avg  is =%f ”,avg);

    }

    private:

        std::vector<float>  m_Vec;

    }

    Class    CProduct2 :  public   IVisitable

    {

           void      AcceptSum(IVisitor  visitor)

    {

    visitor-> GetSum(this);

    }

         void      AcceptAvg(IVisitor  visitor)

    {

    Visitor->GetAvg(this);

    }

           void     CalcSum( IVisitor  visitor)

    {

         Float  sum =0.0;

    for(std::vector<float>::iterator  it = m_Vec.begin(); m_vec.end();it++)

    Sum += *it;

    Printf(“ product2 calc  sum is =%f ”,sum);

    }     

           void     CalcAvg( IVisitor  visitor)

    {

         Float  sum =0.0,avg=0.0;

    for(std::vector<float>::iterator  it = m_Vec.begin(); m_vec.end();it++)

    Sum += *it;

    avg=sum/ m_Vec.size();

    Printf(“ product2 calc  avg  is =%f ”,avg);

    }

    private:    

        std::vector<float>  m_Vec;

    }

    所谓观察者式,就是不同种观察者希望提供一种服务。

  • 相关阅读:
    [POJ1195] Mobile phones(二维树状数组)
    [SWUST1740] 圆桌问题(最大流)
    [SWUST1759] 骑士共存问题(最大流,最大独立集)
    欧拉函数O(sqrt(n))与欧拉线性筛素数O(n)总结
    BZOJ 1036: [ZJOI2008]树的统计Count-树链剖分(点权)(单点更新、路径节点最值、路径求和)模板,超级认真写了注释啊啊啊
    POJ 3237.Tree -树链剖分(边权)(边值更新、路径边权最值、区间标记)贴个板子备忘
    计蒜客 30999.Sum-筛无平方因数的数 (ACM-ICPC 2018 南京赛区网络预赛 J)
    洛谷 P3383 【模板】线性筛素数-线性筛素数(欧拉筛素数)O(n)基础题贴个板子备忘
    计蒜客 30996.Lpl and Energy-saving Lamps-线段树(区间满足条件最靠左的值) (ACM-ICPC 2018 南京赛区网络预赛 G)
    计蒜客 30990.An Olympian Math Problem-数学公式题 (ACM-ICPC 2018 南京赛区网络预赛 A)
  • 原文地址:https://www.cnblogs.com/skyofbitbit/p/4231692.html
Copyright © 2020-2023  润新知