(转载)Visitor模式---实现家人行为 http://hi.baidu.com/huangrg/blog/item/aa9e46c7feaeebdfd100608c.html

转载 2007年09月14日 17:44:00
我家有: 老婆, 儿子, 女儿.
我考虑写一个程序模拟她们的生活.
抽象出老婆,儿子和女儿这三个对象,为了易于统一管理和访问这些对象,同时抽象了一些公共基类:Baby.Baby要提供所有可能的接口. 为了把问题简单化,假设老婆主要照顾两个小宝贝和做家务(^-^); 两个小宝贝还小,基本上就是玩.于是我们建立下面的类模型:



根据这个模型,我们可以发现一些不足的地方:

1)抽象接口提供所有子类的行为接口
   抽象基类Baby为Wife,Son和Daughter提供了所有的接口,显得比较复杂。
2)子类必须要重写不属于自己的行为
   比如儿子比较小,是不参与家务的,但在程序中,Son必须重写Housework(),只是什么都不做。当然,通过某些方式可以避免这问题出现,但同时也会带来其它新问题。
3)增加新的行为比较烦琐
   在任何一个类中增加一个新行为,就要在所有的类中做修改。比如,小孩上小学了,老婆不须要照顾小孩了,要上班;同时儿子可能还要踢足球,女儿要课余要学唱歌、舞蹈等。系统不易扩展,增加新功能容易出错;而且会越来越复杂,不易维护。

有必要对设计进行优化,使系统更易扩展和维护。注意以上类结构的特点:Wife、Son、Daughter,这此元素比较稳定;但她们的行为容易变化。
因此我们很自然想到了采用Visitor,建立下面的类模型:

采用Visitor模式重新设计后,基本上消除了以上的不足之处。特别是要增加一个新行为,只要在Visitor层次增加一个新类,不会使系统越来越复杂。下面是针对采用Visitor后的代码实现。
说明:1)代码实现里的Visitor成员函数通过重载机制统一用Visit命名;
      2)为编排简单,所有成员函数定义在类声明里实现.

以下是Visitor层次的代码:

    struct Visitor
    {
        virtual void Visit(Wife& wife) = 0;
        virtual void Visit(Son& son) = 0;
       virtual void Visit(Daughter& daughter) = 0;
     };

    class BabysatVisitor : public Visitor
    {
     public:
        virtual void Visit(Wife& wife)
        {
              std::cout << "Wife is taking care of son and daughter./n";
        }

        virtual void Visit(Son& son){ }

        virtual void Visit(Daughter& daughter){ }
     };

HouseworkVisitor也是针对Wife的一个动作,实现和BabysatVisitor类似,略。

    class PalyVisitor : public Visitor
    {
     public:
        virtual void Visit(Wife& wife){ }

       virtual void Visit(Son& son)
        {
              std::cout << "Son is playing./n";
        }

        virtual void Visit(Daughter& daughter)
        {
             std::cout << "Daughter is playing./n";
        }
     };

以下元素层次的代码:

    struct Baby
    {
          virtual void Accept(Visitor& visitor) = 0;
    };

    class Wife : public Baby
    {
     public:
        virtual void Accept(Visitor& visitor)
        {
             visitor.Visit(*this);
         }
     };

Son和Daughter用同样的方法实现Accept,略.

最后用Family管理她们。

    class Family
    {
     public:

         typedef std::multimap<Baby*, Visitor*> BabyMap;

         Family()
         {
                babies_->insert(BabyMap::value_type(new Wife, new WifeVisitor));
                babies_->insert(BabyMap::value_type(new Son, new SonVisitor));
                babies_->insert(BabyMap::value_type(new Daughter, new DaughterVisitor));
         }

         void Behave()
         {
                for (BabyMap::const_iterator it = babies_.begin(); it != babies_.end(); ++it)
                     it->first->Accept(*it->second);
         }
     private:
          BabyMap babies_;
    };

主函数类似:

     Family family;

     family.Behave();

最后要说明的, 如果经常娶老婆或者经常有小宝宝出生的话,也就说像Wife这些节点容易变化的话, 使用Visitor模式不一定能带来多少好处.

 

Linux 学习 一 VWare虚拟机 安装 Linux

一、linux 系统的分区 / 根分区  /boot启动分区 /swap内存交换分区 二、vware 虚拟机 nat 方式 虚拟系统上网 安装虚拟机后,会在物理机上自动生成两个 虚拟...
  • timesongjie
  • timesongjie
  • 2011年10月19日 23:20
  • 810

[转载]C++读取Excel文件(97-2000) *.xls

原帖在这里:http://hi.baidu.com/shaka_mabo/blog/item/5d93499b4b997ebdc8eaf436.html                 谢谢这位老兄分...
  • fly_feng
  • fly_feng
  • 2009年05月10日 11:23
  • 5074

wxpython 之 GDI(二)

Point 最简单的几何对象是一个点。它是一个窗口上平面的点。 DrawPoint(int x, int y) #!/usr/bin/python # -*- coding:...
  • Tony_Wong
  • Tony_Wong
  • 2014年01月01日 18:01
  • 1075

(转载)Decorator模式---实现一个验证程序 http://hi.baidu.com/huangrg/blog/item/76fe53ddb58169da8d1029c6.html

Decorator可以动态地为某个对象增加一些职责. 考虑一个密码验证程序,该程序是一个基于TCP的Client,她的基本功能是发出带有用户名、密码以及其它附加信息的请求给Server,之后得到 Se...
  • huangruiguang
  • huangruiguang
  • 2007年09月14日 17:47
  • 648

http://hi.baidu.com/%BB%A8%D4%E1%C4%C7%D1%AA%BC%C0/profile

http://hi.baidu.com/%BB%A8%D4%E1%C4%C7%D1%AA%BC%C0/profile
  • tianwailaibin
  • tianwailaibin
  • 2011年04月30日 16:14
  • 567

http://hi.baidu.com/sophie198384/blog/item/26960501e9a757021d9583a0.html

http://hi.baidu.com/sophie198384/blog/item/26960501e9a757021d9583a0.html
  • feidegenggao1
  • feidegenggao1
  • 2009年12月30日 15:21
  • 449

http://hi.baidu.com/acrobatuv/blog/item/bc6a76012b38621d4afb512c.html

http://hi.baidu.com/acrobatuv/blog/item/bc6a76012b38621d4afb512c.html
  • ZHPABC
  • ZHPABC
  • 2014年12月22日 16:21
  • 459

JAVA设计模式之Visitor模式

一个集合(Collection)中,可以包含一个Car,也可以包含一个Cat,对于不同类型的元素,他们的行为也不尽相同,比如,Car可能有start()行为,而Cat可能有eat()的行为。可是对于C...
  • chenjie19891104
  • chenjie19891104
  • 2011年05月04日 13:46
  • 13496

Java设计模式(三) Visitor(访问者)模式及多分派场景应用

基本概念Visitor 封装一些作用于数据结构中的各元素的操作,不同的操作可以借助新的visitor实现,降低了操作间的耦合性 访问者可以将数据结构和对数据的操作解耦,使得增加对数据结构的操作不需要取...
  • qq_24451605
  • qq_24451605
  • 2016年04月14日 15:32
  • 5194

http://hi.baidu.com/megachan/blog/item/61e1bb6cb7ab2de64316941b.html

函数功能 求数组的平均数或者均值 使用方法 M = mean(A) 返回沿数组中不同维的元素的平均值。 如果A是一个向量,mean(A)返回A中元素的平均值。 如果A是一个矩阵,mean(...
  • linhd1102
  • linhd1102
  • 2016年05月31日 11:16
  • 735
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:(转载)Visitor模式---实现家人行为 http://hi.baidu.com/huangrg/blog/item/aa9e46c7feaeebdfd100608c.html
举报原因:
原因补充:

(最多只允许输入30个字)