美文网首页
我也想说下设计模式-访问者模式

我也想说下设计模式-访问者模式

作者: 逍遥客栈 | 来源:发表于2018-02-08 15:41 被阅读0次

    访问者模式定义是数据稳定,操作变化时,在不改变数据结构情况下,新增操作。

    网上搜索一下,全都是正确的,有蜜蜂采花的:说有几种花,2种蜜蜂去采。有医院拿药的:有几种药,到2个部门去操作。全部都用到了访问者模式,代码当然没问题。但是我看了也是蒙蔽,TM到底什么情况下使用这个模式?

    去看了下大话设计模式的例子:男女2种人,在不同状态下不同的操作。成功时:男女分别是什么心情,失败时又是什么心情,状态会变化。

    刚开始代码是

    男人(zt){

        if(zt1){...}

     else if(zt2){...}

    }

    女人(zt){

     if(zt==zt1){...}

     else if(zt==zt2){...}

    }

    在状态会增加,男女不变的情况下,显然直接使用了访问者模式。可能我比较愚钝,怎么就直接使用了模式,跳跃还是比较大,也是很蒙蔽啊。

    如果是我自己写,既然状态会多

    状态1(person){

    if (男人){}

    else if(女人){}

    }

    状态2(person){

    if (男人){}

    else if(女人){}

    }

    ...... 这样不是状态可扩展,if 方法判断复杂,直接改为多态。

     接口 zt{

    visitor(男人){...}

    visitor(女人){...}

    }

      zt1{

    visitor(男人){...}

    visitor(女人){...}

    }

     zt2{

    visitor(男人){...}

    visitor(女人){...}

    }

    由于状态是基于接口(现在不都是接口编程吗,有啥好说的),但是离访问者模式代码很远啊

    people{

    acapt(zt);

    }

    男人(zt){

    acapt(zt){ zt.visitor(男人)}

    }

    女人(zt){

    acapt(zt){ zt.visitor(女人)}

    }

    为什么要这样写?将访问入口写在people类中?为什么不直接调用

    People p = new Man();

    Statle s = new AStatle();

    s.visit(p);//报错  子类可以取代父类,父类当然不能取代子类

    代码调用者 和 参数 有自己的静态类型和实际类型,参数的实际类型不影响分派。

    People p = new Man();

    Statle s = new AStatle();

    p.accept(s);

    这样写确实完美了,经过了几次演变,发现个问题,一是把数据和行为分开,哪个是固定即数据,那个是变化即行为?

    其实根据具体场景,如果是 人去游览比如海洋馆和植物园,到底哪个可变,那个不可变?还是看需求

    如果都是可变,也就用不了这个模式了。

    相关文章

      网友评论

          本文标题:我也想说下设计模式-访问者模式

          本文链接:https://www.haomeiwen.com/subject/dptttftx.html