面向对象的访问者模式+组合模式

因为原始文本的源代码继续是访问者模式组合的代码示例,所以这里是一个评论的组合,但它主要是关于访问者模式。顾名思义,在这种模式下将有一个访问者类。(就像检察官在最近热议的人的名义下,他跑到一个腐败官员的家里调查和收集证据,然后他被定罪)。当访问者类调用访问者类时,他会把它传递给它。

直接查看代码:


是基类/访问者

抽象类单元{
摘要功能(bombardstrength); / /获得单位的攻击
U3000 U3000

此方法将调用访问者类,并将其传递给它。
功能(armyvisitor游客接受美元){
$method = visit. get_class(美元);
访问方法>($);调用访问者类,这里使用访问。get_class(美元)名字的方法
}
U3000 U3000

按照原来的语句是要设置深度,虽然会有调用,但是这个方法不重要,对于理解这个模式不能控制他(通常与一些代码理解原则不太关系,在原始代码中)。
保护功能setdepth($深度){
$这个深度= $ $深度;
}

功能getDepth(){
返回$此深度;
}
}



弓箭手
类弓箭手扩展单位{
功能bombardstrength(){
返回4;
}
}

激光枪

类lasercannonunit扩展单元{
功能bombardstrength(){
返回44;
}
}

/骑兵

级骑兵延伸单位{
功能bombardstrength(){
返回2;骑兵攻击比阿切尔低

}
}



/ /组合的单元类继承的实例,让军队和troopcarrier类removeunit和addunit方法,这是因为基地班三级以上的最小单位不是一个军事集团removeunit和addunit对他们没有影响。

抽象类compositeunit扩展单元{
私有=数组($单位);存储单元类的任何继承实例

功能(getcomposite){ / /这个方法主要是用来判断当前的实例是一个compositeunit类
返回$此;
}

受保护函数单元(){
返回$这个单位;
}

功能removeunit(单位美金){ / /删除一个军事单位
美元->单位= array_udiff(
$单位,数组($单位),

功能($,$){ return($ = $ B)0:1;}

);
}

功能addunit(单位美金){ / /添加一个军事单位
如果(in_array(美元单位,美元->单位,真)){
返回;
}
单位-> setdepth美元(美元->深度+ 1);
$这个单位{ } = $单位;
}

功能bombardstrength(){
0美元;
foreach(美元->单位为美元单位){
RET + = $单位美元-> bombardstrength();
}
返回$;
}

功能(armyvisitor游客接受美元){ / /电话来访者
父::接受(访问者);在第一个客户机代码中调用基类的接受方法,将保存一组军事信息。
foreach(美元->单位这样美元){ / /电话接受第一个军事单位的方法,客户端代码将被保存在每个军事单位信息
这样美元->接受(为游客);
}
}
}



{陆军}

班军延伸compositeunit {

}

/舰队

类troopcarrier延伸compositeunit {

}



访问类

抽象类armyvisitor {
抽象函数访问(单位$节点);执行访问者的业务逻辑
功能visitarcher(弓箭手为节点){ / /其实我想理解这个抽象类和抽象方法(访问)是不够的,更为下面的方法调用访问圈

/……
$访问($节点);
}

功能visitcavalry(骑兵为节点){

/……
$访问($节点);
}

功能visitlasercannonunit(lasercannonunit $节点){

/……
$访问($节点);
}

功能visittroopcarrierunit(骑兵为节点){

/……
$访问($节点);
}

功能visitarmy(骑兵为节点){

/……
$访问($节点);
}
}

访问者类主要用于获取和保存访问者对象信息。
类textdumparmyvisitor延伸armyvisitor {
私有$文本;
函数访问(单位$节点){
$;
= 4 *美元美元垫节点-> getdpth();
$ RET = sprintf(% { $垫} S
退役= get_class美元($节点)。;
ret =美元炮轰:($节点-> bombardstrength)。;
$;
}

函数gettext(){
返回$ >文本;
}
}

对于每个对象对访问者类征税,客户机代码将调用2。
类taxcollectionvisitor延伸armyvisitor {
私人应付账款= 0;
私有$报告;

函数访问(单位$节点){
$ -列维($节点,1);
}

功能visitarcher(弓箭手为节点){ / /碳在父类的方法,对不同的单位征收不同的税
$ -列维($节点,2);
}

功能visitcavalry(骑兵为节点){
$ -列维($节点,3);
}

功能visittroopcarrierunit(troopcarrierunit $节点){
$ -列维($节点,5);
}

私人功能税(单位$单位金额){主营业务逻辑
美元->报告=税get_class(美金);
$ $ >报告:金额。;
此$;
}

功能getreport(){
返回$ >报告;
}

功能gettax(){
返回$;
}
}


1客户机代码(每个对象的一些信息获取和输出)
类unitscript {
静态函数joinexisting(单位newunit美元,美元单位occupyingunit){
为补偿;
如果(!is_null($ COM = occupyingunit美元-> getcomposite())){
计算机> addunit美元(美元newunit);
其他{ }
新陆军();
计算机> addunit美元(美元occupyingunit);
com - > addunit美元(美元newunit);
}
返回$;
}
}



main_army美元=新的军队();
unitscript::joinexisting(New Archer(),main_army美元);
unitscript::joinexisting(新lasercannonunit(美元),main_army);
unitscript::joinexisting(新骑兵(),main_army美元);

textdump美元=新textdumparmyvisitor();
main_army ->接受美元(美元textdump);
打印textdump美元-> gettext();



客户机代码(为每个对象征税2,最终输出总收集数)
main_army美元=新的军队();
unitscript::joinexisting(New Archer(),main_army美元);
unitscript::joinexisting(新lasercannonunit(美元),main_army);
unitscript::joinexisting(新骑兵(),main_army美元);
收税人=新taxcollectionvisitor(美元);
main_army ->接受美元(美元收税人);
打印为收税人-> gettax();

代码太懒惰/没有测试,抱歉!感兴趣的朋友自己调试一下!


以上谈的PHP面向对象的访问模式+组合模式是萧边分享你的全部内容。我希望能给你一个参考,希望你能支持它。