《设计模式03》.ppt

  1. 1、本文档共30页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
2.5 访问者模式(Visitor Pattern) 意图: 针对一个结构中(如树、链表、集合等)的各元素进行操作时,元素的类型可能不尽相同。 1)如何在操作时,去掉类型的检测和判断。 2)如何允许添加新的操作? 2.5.1 例子 class Animal { }; class Cat:public Animal { public: ? ? ?virtual void Sleep( ); }; class Dog:public Animal { public:? ?? ? ??virtual void Eat(); ? ??virtual void Run(); }; 问题: 1) if-else多了不易处理 2) 类型的检查(违背里氏替换原则) 3) Dog增加一个操作Run,怎么办? 4) 增加一个接口Jump,怎么办? 针对问题1)和2)修改Animal及子类 修改Animal及子类 for each( ?an in animals) { ? ? if (dynamic_cast<Cat *> (an)!=0) { ? ? ? ? ? ((Cat*)an)->Sleep( ); ? ? } else if (dynamic_cast<Dog *> (an)!=0) { ? ? ? ? ? ((Dog*)an)->Eat(); ? ? } } 分离稳定与变化部分 稳定:结构(Animal,Cat,Dog) 变化:操作(Sleep,Eat,Run,…) 按猫狗的类型对操作分组 按功能对操作分组1) class Visitor { public: ? ? ? ? virtual ?void??VisitCat?(Cat *){ } ? ? ? ??virtual ?void??VisitDog??(Dog *){ } }; class SleepVisitor?:public?Visitor { public: ? ? ? ??virtual ?void??VisitCat?(Cat* cat) { cat->Sleep();? ?}? ? ? ? ? ? ? ? ? ? }; class EatVisitor?:public?Visitor { public: ? ? ? ??virtual ?void??VisitDog?(Dog * dog)? ? ? ? ? ? ? ? { dog->Eat();} }; class RunVisitor?:public?Visitor { public: ? ? ? ??virtual ?void??VisitDog??(Dog * dog) { dog->Run();?}? }; for each( ?an in animals) { ? ? if (dynamic_cast<Cat *> (an)!=0) { ? ? ? ? ? ((Cat*)an)->Sleep( ); ? ? } else if (dynamic_cast<Dog *> (an)!=0) { ? ? ? ? ???((Dog*)an)?->Eat( ); ? ? } } class Animal { public: ? ? ? ? virtual void Accept(Visitor * v); ? ? ? ?//.... }; class Cat:public Animal { public: ? ? ? ? virtual void Accept(Visitor * v) { ?v->VisitCat(this); } ? ? ? ?//.... }; class Dog:public Animal { public: ? ? ? ? virtual void Accept(Visitor * v) ? ? ? ? ? ? ? { ?v->VisitDog(this); } ? ? ? ?//.... }; 2.5.2 访问者模式适用性 对象包含很多子对象或元素,但各元素有不同的接口,但在操作这些元素时,希望做一些涉及或依赖于具体元素类型的操作。 对象结构很少改变,但常需要在此结构上定义新操作。 2.5.3 访问者模式使用方法 分离结构和操作。 将操作按功能分类(而不是按结构分类) 按功能定义Visitor类及子类 在结构Element中添加Accept。 对Element对象,执行操作。 ?class ?BaseElement { public: ? ? ? virtual void Accept(Visitor * v) = 0;

文档评论(0)

精品文库 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档