Visitor泛化

本文档介绍了如何使用Visitor模式来优化对象结构和接口,避免循环依赖,并提供了一种泛化的Visit实现。通过DocElementVisitor、DocStats和IncrementFontSize类展示了如何处理Paragraph和RasterBitmap对象。此外,还提出了一种通用的BaseVisitor和BaseVisitable模板,以进一步泛化Visit接口。
摘要由CSDN通过智能技术生成

class DocElementVisitor
{
 public :
 virtural void VisitParagraph(Paragraph&)=0;
 vitrural void VisitRasterBitmap(RasterBitmap&) =0;
}

class DocElement
{
 public :
 vitual void Accept(DocElementVisitor&)=0;
 ...
};
void Paragraph::Accept(DocElementVisitor &v)
{
 v.VisitParagraph(*this);
}
void RasterBitmap::Accept(DocElementVisitor& v)
{
 v.VisitRasterBitmap(*this);
}
class DocStats:public DocElementVisitor
{
 public
 vitaul void VisitParagraph(Paragraph* par)
 {
  chars_ +=par.NumChars();
  words_ +=par.NumWords();
 }
 virtual void VisitRasterBitmap(RasterBitmap&)
 {
  ++images_;
 }
 ...
}
void Document::DisplayStatistics()
{
 DocStatS statistics;
 for(each DocElement in the document)
 {
  element->Accept(statistics);
 }
 statistics.Display();
}
某种意义让对象和操作集合在一起,同时优化结构和接口
class IncrementFontSize:public DocElementVistor
{
 public:
 virtual void VisistParagraph(Paragraph &par)
 {
  par.SetFontSize(par.GetFontSize()+1);
 }
 virtual void VisitRasterBitmap(RasterBitmap&)
 {

 }
}

解决循环依存性,dynamic_cast解决,强制切换到对象
class DocElementVisitor
{
 public:
 virtual void ~DocElementVisitor(){}
};

public ParagraphVisitor
{
 public :
 virtual void VisitParagraph(Paragraph&)=0;
}

void Paragraph::Accept(DocElementVisitor&v)
{
 if(ParagraphVisitor*p=dynamic_cast<ParagraphVisitor*>(&v))
  p->VisitParagraph(*this);
}
else
{
 
}
}

class DocStats:
 public DocElementVisitor,
 public ParagraphVisitor,
 public RasterBitmapVisitor
{
 public :
 void VisitParagraph(Paragraph&par)
 {
  chars_ +=par.NumChars();
  words_ +=par.NumWords();
 }
 void VisitRasterBitmap(RasterBitmap&)
 {
  ++imags;
 }
}
泛化Visit
class BaseVisitor
{
 public :
 Visrtual ~BaseVisitor(){}
};
template <class T ,typename R=void>
class Visitor
{
 public:
 typedef R ReturnType;
 virtual ReturnType Visit(T&)=0;
};

template<typename R=void>
class BaseVisitable
{
 public :
 typedef R ReturnType;
 virtual ~BaseVisitable(){};
 virtual R Accept(BaseVisitor&)=0;
 protected:
 template<class T>
 static ReturnType AcceptImpl(T& visited ,BaseVisitor&guest)
 {
  if(Visitor<T>*p=dynamic_cast<Visitor<T>*>(guest))
  return p->Visit(visited);
 }
 return ReturnType();
};
#define DEFINE_VISITABLE() \
virtual ReturnType Accept(BaseVisitor& guest) {return AcceptImpl(*this,guest);}

泛化visit接口

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值