页数:9页文件大小:245.9 KB来源: 设计模式ppt课件
本课件补充访问者模式的推导过程,说明如何在不改动元素结构的前提下按功能分组新增操作,通过添加Accept方法与Visitor类消除类型判断分支。
访问者模式的补充
总目标:以一致的方式访问不同的对象1. f()有不同的实现;2. X1,X2的接口不同怎么办?2.新增职责g( ),怎么办?
方法1:修改X及子类,浩大的工程!!
方法二:使用访问者模式(1)步骤1:将f()和g()分离出去X::f( )X::g( )X1::f( )X1::g( )X2::f( )X2::g( )
步骤2:按功能重新组织f,g
进一步分析:回头再看Client:void Client::F(X&x){x.f( );}void Client::G(X&x){x.g( );}由于X中已经没有了f和g,不合适了。x.f( ),改成下面的更合适,OperateF * pf = new OperateF;pf->FoxX?(x);但?是几呢,是1还是2?这是由参数x决定的,就应由x来触发形如pf->FoxX?(x);的调用,因为只有x能知道?应该是1还是2.步骤3:修改Client,X及子类同时在X1中实现:voidX1::Called(Operate * oper) {oper->ForX1(this); }在X2中实现:voidX2::Called(Operate * oper) {oper->ForX2(this); }其中Called方法,在X,X1,X2中原先是没有的,是我们自己新加的。Void Client::F(X& x) {OperateF * pf = new OperateF;x->Called(pf);}Void Client::G(X& x) {OperateG * pg = new OperateG;x->Called(pg);}void Client::G(X& x) {OperateG * pg = new OperateG;pg>FoxX?(x);}void Client::F(X& x) {OperateF * pf = new OperateF;pf->FoxX?(x);}最终的类图(Called改名为Accept)
下载地址:{{downurl}}
{{{a}}}
{{#b}}{{{b}}}
{{/b}} {{/title}} {{#nolog}}登陆注册
{{/nolog}} {{#djsx}}点我刷新
{{/djsx}} {{#gocz}} {{/gocz}} {{#ffqr}} {{/ffqr}}