表示一个作用于某对象结构中各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作.

适用场景:
1.适用于元素类数据结构相对稳定(类的方法固定,但属性可以变化,如果方法变化很大,就无法使用访问者)
2.把数据的处理从数据结构上分离出来.
3.需要一个结构对象角色,组合一系列的元素类.

与装饰器模式的区别

1.装饰器模式通常是单个对象的装饰,为这个对象动态扩展了方法,也就是扩展了对象的结构,所以归为结构模式;访问者模式通常用于收集一组元素类的信息,所以归为行为模式.

2.装饰器模式不需要被装饰者有稳定的结构,被装饰者不需要知道装饰者,其中也无需增加装饰者.访问模式,需要元素类有稳定的结构,留有一个接口,来增加访问者.

UML

示例:

// 产品接口(元素类接口)
interface ProductInterface
{
public function addVisitor(VisitorInterface $visitor);
} // 访问者接口
interface VisitorInterface
{
public function visit(ProductInterface $product);
} // 具体产品类1
class Product1 implements ProductInterface
{
public function addVisitor(VisitorInterface $visitor)
{
$visitor->visit($this);
} public function getTotalExpend()
{
echo '总计支出1000';
} public function getTotalEarn()
{
echo '总计收入10000';
} } // 具体产品类2
class Product2 implements ProductInterface
{
public function addVisitor(VisitorInterface $visitor)
{
$visitor->visit($this);
} public function getTotalExpend()
{
echo '总计支出500';
} public function getTotalEarn()
{
echo '总计收入5000';
}
} // 销售主管,需要统计总收入
class Visitor1 implements VisitorInterface
{
public function visit(ProductInterface $product)
{
$product->getTotalEarn();
}
} // 产品统筹需要统计总支出
class Visitor2 implements VisitorInterface
{
public function visit(ProductInterface $product)
{
$product->getTotalExpend();
}
} // 结构对象角色,这对于访问者来说是必备的,访问者模式处理了一组元素类,而不是单个的元素类
class ObjectStruct
{
protected $products = []; public function attach(ProductInterface $product)
{
$this->products[] = $product;
} public function getProductList()
{
return $this->products;
}
} // 客户调用
$obj = new ObjectStruct();
$obj->attach(new Product1());
$obj->attach(new Product2());
$lists = $obj->getProductList(); // 销售主管访问者
$visitor1 = new Visitor1(); foreach ($lists as $product) {
$product->addVisitor($visitor1);
} // 产品统筹
$visitor2 = new Visitor2();
foreach ($lists as $product2) {
$product2->addVisitor($visitor2);
}

  

B7:访问者模式 Visitor的更多相关文章

  1. 设计模式 ( 二十 ) 访问者模式Visitor(对象行为型)

    设计模式 ( 二十 ) 访问者模式Visitor(对象行为型) 1.概述 在软件开发过程中,对于系统中的某些对象,它们存储在同一个集合collection中,且具有不同的类型,而且对于该集合中的对象, ...

  2. 乐在其中设计模式(C#) - 访问者模式(Visitor Pattern)

    原文:乐在其中设计模式(C#) - 访问者模式(Visitor Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 访问者模式(Visitor Pattern) 作者:webabc ...

  3. 访问者模式 Visitor 行为型 设计模式(二十七)

    访问者模式 Visitor    <侠客行>是当代作家金庸创作的长篇武侠小说,新版电视剧<侠客行>中,开篇有一段独白:  “茫茫海外,传说有座侠客岛,岛上赏善罚恶二使,每隔十年 ...

  4. 二十四种设计模式:访问者模式(Visitor Pattern)

    访问者模式(Visitor Pattern) 介绍表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 示例有一个Message实体类,某些对象对 ...

  5. 访问者模式(Visitor Pattern)——操作复杂对象结构

    模式概述 在软件开发中,可能会遇到操作复杂对象结构的场景,在该对象结构中存储了多个不同类型的对象信息,而且对同一对象结构中的元素的操作方式并不唯一,可能需要提供多种不同的处理方式,还有可能增加新的处理 ...

  6. 十一个行为模式之访问者模式(Visitor Pattern)

    定义: 提供一个作用于某对象结构(通常是一个对象集合)的操作的接口,使得在添加新的操作或者在添加新的元素时,不需要修改原有系统,就可以对各个对象进行操作. 结构图: Visitor:抽象访问者类,对元 ...

  7. C#设计模式——访问者模式(Visitor Pattern)

    一.概述由于需求的改变,某些类常常需要增加新的功能,但由于种种原因这些类层次必须保持稳定,不允许开发人员随意修改.对此,访问者模式可以在不更改类层次结构的前提下透明的为各个类动态添加新的功能.二.访问 ...

  8. [设计模式] 23 访问者模式 visitor Pattern

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对访问者模式是这样说的:表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作.访问 ...

  9. 学习笔记——访问者模式Visitor

    访问者模式,通过Visitor的注入,为Element扩展了方法实现.虽然避免了Element不用修改即可修改,但却破坏了类的封装性,同时,一旦变更就需要增加子类,在子类方法中调用基类方法,然后再使用 ...

随机推荐

  1. 查询oracle数据库中当前数据库所有表的名称

    http://www.cnblogs.com/hyq0002013/p/5948419.html select t.table_name from user_tables t;

  2. shell字符串变量的特异功能:字符串的替换(${str/源模式/目标模式},${str//源模式/目标模式})、截断

    https://blog.csdn.net/wzb56_earl/article/details/6953612

  3. 可折叠的listview 之ExpandableListView基本使用

    先看效果 demo实现 其他的方法和ListView的方法一样,下面来看看具体demo的实现 首先布局文件很简单,就一个控件为: <?xml version="1.0" en ...

  4. 清理tomcat缓存

    解决方案:删除work目录的内容,注意不能删除work目录,不然会出现404错误 rm -rf /usr/local/tomcat/work/*

  5. PHP文件操作函数

    1 获得文件名: basename(); 给出一个包含有指向一个文件的全路径的字符串,本函数返回基本的文件名.如果文件名是以 suffix 结束的,那这一部分也会被去掉. eg: 复制代码 代码如下: ...

  6. Nodejs微信开发

    因为使用了Bot Framework开发了一个小功能,它目前支持了Skype\Teams\Slack等,但在国内来讲,微信还是一个比较流行的软件,所以需要接上微信 原来开发Bot的时候使用的是.Net ...

  7. (1)Python 安装使用IDLE

    安装 官网 https://www.python.org/ Windows x86 web-based installer 在线安装 Windows x86 executable installer ...

  8. vijos P1190繁忙的都市(Kruskal)(最小生成树)

    P1190  繁忙的都市 城市C是一个非常繁忙的大都市,城市 中的道路十分的拥挤,于是市长决定对其中的道路进行改造.城市C的道路是这样分布的:城市中有n个交叉路口,有些交叉路口之间有道路相连,两个交叉 ...

  9. 26、Django实战第26天:配置全局导航

    1.编辑index.html,继承base.html 2.编辑base.html,根据是否登录不同显示 问题:当我们选中一个导航,选中样式并没有成为选中的状态 因此我们编辑base.html对导航中进 ...

  10. 使用lookup-method解决singleton bean依赖prototype bean的问题

    在Spring里面,当一个singleton bean依赖一个prototype bean,那么,因为singleton bean是单例的,因此prototype bean在singleton bea ...