首页计算机计算机软件设计模式 09 补充访问者模式.pptx

09 补充访问者模式.pptx

页数:9页文件大小:245.9 KB来源: 设计模式ppt课件

本课件补充访问者模式的推导过程,说明如何在不改动元素结构的前提下按功能分组新增操作,通过添加Accept方法与Visitor类消除类型判断分支。

访问者模式的补充封面,说明在元素接口各异时如何以一致方式访问不同对象
访问者模式的总目标与三个问题:f() 实现各异、X1 与 X2 接口不同、新增职责 g() 怎么办
方法一在 X 及子类中直接添加统一操作,改动量浩大
查看本课件的文字版(共 9 页,供检索与复制)

第1页:访问者模式的补充封面

访问者模式的补充

第2页:访问者模式的总目标与三个问题

总目标:以一致的方式访问不同的对象1. f()有不同的实现;2. X1,X2的接口不同怎么办?2.新增职责g( ),怎么办?

第3页:方法一:在元素中添加统一操作

方法1:修改X及子类,浩大的工程!!

第4页:方法二(一):按操作功能分组

方法二:使用访问者模式(1)步骤1:将f()和g()分离出去X::f( )X::g( )X1::f( )X1::g( )X2::f( )X2::g( )

第5页:步骤2:定义访问者接口与实现类

步骤2:按功能重新组织f,g

第6页:进一步分析:仍需判断元素类型

进一步分析:回头再看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.

第7页:步骤3:在元素中添加Accept

步骤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);}

第8页:访问者模式的最终类图

最终的类图(Called改名为Accept)

第9页:

顶部目录