访问者模式解决的问题



在编码过程中,我们常常需要向一些相似的对象添加一些代码。让我们以一个计算机对象打印部分为例。



*抽象基类
* /
抽象类单位
{

*得到这个名字
* /
摘要公共职能getName();

}


* CPU类
* /
类CPU扩展单元
{
公共职能getName()
{
return'i是CPU;
}
}


*内存类
* /
类内存扩展单元
{
公共职能getName()
{
return'i是记忆;
}
}


*键盘类
* /
类键盘扩展单元
{
公共职能getName()
{
return'i是键盘;
}
}


*计算机类
* /
级计算机
{
保护_items美元= { };

公共功能添加(单位$单位)
{
美元-> _items { } = $单位;
}

公共功能打印()
{
循环打印组件
foreach(美元-> _items达项目){
$项-> getName();
}
}
}





这上面的时间代码看起来像一个非常完美的外观,但问题是,现在我们不仅需要打印部分,每个模块也需要保存到数据库中,不仅如此,还需要打印的价格的各个部分;如果在单元基类(getPrice)和保存(添加)的方法,我们可以实现所需的功能,但它有问题,你不知道还需要添加的操作,如果每一个新的操作是这样的,我们的班级会变得越来越臃肿。

访问者模式的实现



访问者模式就是为了解决这个问题。他解除了数据结构与操作之间的耦合,从而使操作集可以相对自由地演化。让我们看看下面改进过的代码:



*抽象基类
* /
抽象类单位
{

*得到这个名字
* /
摘要公共职能getName();


*用于接受访问者对象和回调访问者的访问方法
*非常关键的方法
* /
公共功能接受(访客访问者)
{
方法=访问。get_class(美元);
如果(method_exists($访客,$方法)){
访问者$ > $方法($);
}
}
}


* CPU类
* /
类CPU扩展单元
{
公共职能getName()
{
return'i是CPU;
}
}


*内存类
* /
类内存扩展单元
{
公共职能getName()
{
return'i是记忆;
}
}


*键盘类
* /
类键盘扩展单元
{
公共职能getName()
{
return'i是键盘;
}
}


*键盘类
* /
访问者接口
{
公共功能visitcpu(CPU为CPU);
公共功能(记忆记忆visitmemory美元);
公共功能visitkeyboard(键盘为键盘);
}


*
* /
类printvisitor实现访客
{
公共功能visitcpu(CPU为CPU)
{
你好。为CPU -> getName()。;
}

公共功能(记忆记忆visitmemory美元)
{
你好。$记忆-> getName()。;
}

公共功能visitkeyboard(键盘为键盘)
{
你好。$键盘-> getName()。;
}
}


*
* /
级计算机
{
保护_items美元= { };

公共功能添加(单位$单位)
{
美元-> _items { } = $单位;
}


*接受方法调用每个组件
* /
公共功能接受(访客访问者)
{
foreach(美元-> _items达项目){
$项目>接受(访客);
}
}
}

计算机=新计算机();
计算机>添加(新的CPU());
计算机>添加(新内存());
$计算机>添加(新的键盘());

printvisitor美元=新printvisitor();
计算机->打印美元(美元printvisitor);

上面的代码将打印出来。
你好,我是中央处理器
你好,我是记忆
你好,我是键盘



总结



以上改进后,我们将变得非常容易,如果我们需要添加保存到数据库,可以添加一个类实现访客,如savevisitor,在类实现的保存方法,我们将同样的课数操作解耦的一类对象的集合,手术是游客。

以上是本文的全部内容,希望能对您有所帮助,希望大家多多支持。