B7:访问者模式 Visitor
表示一个作用于某对象结构中各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作.
适用场景:
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的更多相关文章
- 设计模式 ( 二十 ) 访问者模式Visitor(对象行为型)
设计模式 ( 二十 ) 访问者模式Visitor(对象行为型) 1.概述 在软件开发过程中,对于系统中的某些对象,它们存储在同一个集合collection中,且具有不同的类型,而且对于该集合中的对象, ...
- 乐在其中设计模式(C#) - 访问者模式(Visitor Pattern)
原文:乐在其中设计模式(C#) - 访问者模式(Visitor Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 访问者模式(Visitor Pattern) 作者:webabc ...
- 访问者模式 Visitor 行为型 设计模式(二十七)
访问者模式 Visitor <侠客行>是当代作家金庸创作的长篇武侠小说,新版电视剧<侠客行>中,开篇有一段独白: “茫茫海外,传说有座侠客岛,岛上赏善罚恶二使,每隔十年 ...
- 二十四种设计模式:访问者模式(Visitor Pattern)
访问者模式(Visitor Pattern) 介绍表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 示例有一个Message实体类,某些对象对 ...
- 访问者模式(Visitor Pattern)——操作复杂对象结构
模式概述 在软件开发中,可能会遇到操作复杂对象结构的场景,在该对象结构中存储了多个不同类型的对象信息,而且对同一对象结构中的元素的操作方式并不唯一,可能需要提供多种不同的处理方式,还有可能增加新的处理 ...
- 十一个行为模式之访问者模式(Visitor Pattern)
定义: 提供一个作用于某对象结构(通常是一个对象集合)的操作的接口,使得在添加新的操作或者在添加新的元素时,不需要修改原有系统,就可以对各个对象进行操作. 结构图: Visitor:抽象访问者类,对元 ...
- C#设计模式——访问者模式(Visitor Pattern)
一.概述由于需求的改变,某些类常常需要增加新的功能,但由于种种原因这些类层次必须保持稳定,不允许开发人员随意修改.对此,访问者模式可以在不更改类层次结构的前提下透明的为各个类动态添加新的功能.二.访问 ...
- [设计模式] 23 访问者模式 visitor Pattern
在GOF的<设计模式:可复用面向对象软件的基础>一书中对访问者模式是这样说的:表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作.访问 ...
- 学习笔记——访问者模式Visitor
访问者模式,通过Visitor的注入,为Element扩展了方法实现.虽然避免了Element不用修改即可修改,但却破坏了类的封装性,同时,一旦变更就需要增加子类,在子类方法中调用基类方法,然后再使用 ...
随机推荐
- WCF测试小程序
using System;using System.Collections.Generic;using System.Linq;using System.Runtime.Serialization;u ...
- P1029 最大公约数和最小公倍数问题
题目描述 输入二个正整数x0,y0(2<=x0<100000,2<=y0<=1000000),求出满足下列条件的P,Q的个数 条件: 1.P,Q是正整数 2.要求P,Q以x0为 ...
- python的property的用法
假设定义了一个类:C,该类必须继承自object类,有一私有变量_xclass C: def __init__(self): self.__x=None 1.现在介绍第一种使用属性的方法: 在该类中定 ...
- log4j 输入不同日志文件
log4j的强大功能无可置疑,但实际应用中免不了遇到某个功能需要输出独立的日志文件的情况,怎样才能把所需的内容从原有日志中分离,形成单独的日志文件呢?其实只要在现有的log4j基础上稍加配置即可轻松实 ...
- ITerms2在mac系统下的安装和配色,并和go2shell关联
官网下载并安装 拖到应用文件夹使其在应用中展示 熟悉快捷键 无鼠标复制: cmd+f:查找首字母,再按tab向右选择词汇,按shift+tab向左选择词汇 分屏 cmd+d:垂直分屏 cmd+shif ...
- 25,Spark Sort-Based Shuffle内幕彻底解密
一:为什么需要Sort-Based Shuffle? 1, Shuffle一般包含两个阶段任务: 第一部分:产生Shuffle数据的阶段(Map阶段,额外补充,需要实现ShuffleManager中 ...
- ANDROID NFC读M1卡
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.Cons ...
- 30、Django实战第30天:修改邮箱和用户信息
修改个人邮箱需要完成两个接口,一个是获取验证码,一个是新的邮箱和验证码是否匹配 1.编辑users.views.py class SendEmailCodeView(LoginRequiredMixi ...
- Forward与include的区别
Forward与include的区别 <jsp:include>标签用于把另外一个资源的输出内容插入进当前JSP页面的输出内容之中,这种在JSP页面执行时的引入方式称之为动态引入. < ...
- [BZOJ 2425] 计数
Link: BZOJ 2425 传送门 Solution: 其实就是利用数位$dp$的思想来暴力计数的一道题目 如果答案有$dgt$位,可以类似 [BZOJ 1833] 先计算出1至$dgt-1$位的 ...