数码资讯
轻松掌握PHP设计模式的访问者模式
选购提示
关注价格、性能、续航、售后和真实使用场景,理性比较后再下单。
访问者模式解决的问题
在编码过程中,我们常常需要向一些相似的对象添加一些代码。让我们以一个计算机对象打印部分为例。
*抽象基类
* /
抽象类单位
{
*得到这个名字
* /
摘要公共职能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,在类实现的保存方法,我们将同样的课数操作解耦的一类对象的集合,手术是游客。
以上是本文的全部内容,希望能对您有所帮助,希望大家多多支持。
在编码过程中,我们常常需要向一些相似的对象添加一些代码。让我们以一个计算机对象打印部分为例。
*抽象基类
* /
抽象类单位
{
*得到这个名字
* /
摘要公共职能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,在类实现的保存方法,我们将同样的课数操作解耦的一类对象的集合,手术是游客。
以上是本文的全部内容,希望能对您有所帮助,希望大家多多支持。
声明:本文内容用于数码产品信息整理与选购参考,具体价格、库存、售后政策以官方渠道和电商页面实时信息为准。