【设计模式】—— 访问者模式Visitor
前言:【模式总览】——————————by xingoo
模式意图
对于某个对象或者一组对象,不同的访问者,产生的结果不同,执行操作也不同。此时,就是访问者模式的典型应用了。
应用场景
1 不同的子类,依赖于不同的其他对象
2 需要对一组对象,进行许多不相关的操作,又不想在类中是现在这些方法
3 定义的类很少改变,但是执行的操作却经常发生改变。
模式结构

Context 环境角色
class Context{
List<Node> list = new ArrayList();
public void add(Node node) {
list.add(node);
}
public void visit(Visitor visitor) {
for(Node node : list){
node.accept(visitor);
}
}
}
Visitor 访问者角色
interface Visitor{
public void visit(NodeA nodeA);
public void visit(NodeB nodeB);
}
class VisitA implements Visitor{
public void visit(NodeA nodeA){
System.out.println("***visitA***");
nodeA.action();
}
public void visit(NodeB nodeB){
System.out.println("***visitA***");
nodeB.action();
}
}
class VisitB implements Visitor{
public void visit(NodeA nodeA){
System.out.println("***visitB***");
nodeA.action();
}
public void visit(NodeB nodeB){
System.out.println("***visitB***");
nodeB.action();
}
}
Node 被访问角色
interface Node{
public void accept(Visitor visitor);
}
class NodeA implements Node{
public void accept(Visitor visitor) {
visitor.visit(this);
}
public void action(){
System.out.println("NodeA visited");
}
}
class NodeB implements Node{
public void accept(Visitor visitor) {
visitor.visit(this);
}
public void action(){
System.out.println("NodeB visited");
}
}
全部代码
package com.xingoo.test.design.visitor; import java.util.ArrayList;
import java.util.List; interface Visitor{
public void visit(NodeA nodeA);
public void visit(NodeB nodeB);
}
class VisitA implements Visitor{
public void visit(NodeA nodeA){
System.out.println("***visitA***");
nodeA.action();
}
public void visit(NodeB nodeB){
System.out.println("***visitA***");
nodeB.action();
}
}
class VisitB implements Visitor{
public void visit(NodeA nodeA){
System.out.println("***visitB***");
nodeA.action();
}
public void visit(NodeB nodeB){
System.out.println("***visitB***");
nodeB.action();
}
}
interface Node{
public void accept(Visitor visitor);
}
class NodeA implements Node{
public void accept(Visitor visitor) {
visitor.visit(this);
}
public void action(){
System.out.println("NodeA visited");
}
}
class NodeB implements Node{
public void accept(Visitor visitor) {
visitor.visit(this);
}
public void action(){
System.out.println("NodeB visited");
}
}
class Context{
List<Node> list = new ArrayList();
public void add(Node node) {
list.add(node);
}
public void visit(Visitor visitor) {
for(Node node : list){
node.accept(visitor);
}
}
}
public class Client {
private static Context ctx = new Context();
public static void main(String[] args) {
ctx.add(new NodeA());
ctx.add(new NodeB());
ctx.visit(new VisitA());
ctx.visit(new VisitB());
}
}
运行结果
***visitA***
NodeA visited
***visitA***
NodeB visited
***visitB***
NodeA visited
***visitB***
NodeB visited
【设计模式】—— 访问者模式Visitor的更多相关文章
- 设计模式 -- 访问者模式(Visitor)
写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------主要内容包括: 初识访问者模 ...
- C#设计模式——访问者模式(Visitor Pattern)
一.概述由于需求的改变,某些类常常需要增加新的功能,但由于种种原因这些类层次必须保持稳定,不允许开发人员随意修改.对此,访问者模式可以在不更改类层次结构的前提下透明的为各个类动态添加新的功能.二.访问 ...
- 大话设计模式--访问者模式 Visitor -- C++实现实例
1. 访问者模式: 表示一个作用于某对象结构中的和元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 访问者模式把数据结构和作用于结构上的操作之间的耦合脱开,使得操作集合可以 ...
- 深入浅出设计模式——访问者模式(Visitor Pattern)
模式动机 对于系统中的某些对象,它们存储在同一个集合中,且具有不同的类型,而且对于该集合中的对象,可以接受一类称为访问者的对象来访问,而且不同的访问者其访问方式有所不同,访问者模式为解决这类问题而诞生 ...
- 设计模式 ( 二十 ) 访问者模式Visitor(对象行为型)
设计模式 ( 二十 ) 访问者模式Visitor(对象行为型) 1.概述 在软件开发过程中,对于系统中的某些对象,它们存储在同一个集合collection中,且具有不同的类型,而且对于该集合中的对象, ...
- 乐在其中设计模式(C#) - 访问者模式(Visitor Pattern)
原文:乐在其中设计模式(C#) - 访问者模式(Visitor Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 访问者模式(Visitor Pattern) 作者:webabc ...
- 访问者模式 Visitor 行为型 设计模式(二十七)
访问者模式 Visitor <侠客行>是当代作家金庸创作的长篇武侠小说,新版电视剧<侠客行>中,开篇有一段独白: “茫茫海外,传说有座侠客岛,岛上赏善罚恶二使,每隔十年 ...
- 二十四种设计模式:访问者模式(Visitor Pattern)
访问者模式(Visitor Pattern) 介绍表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 示例有一个Message实体类,某些对象对 ...
- .NET设计模式访问者模式
一.访问者模式的定义: 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 二.访问者模式的结构和角色: 1.Visitor 抽象访问者角色,为该 ...
- JAVA 设计模式 访问者模式
用途 访问者模式 (Visitor) 表示一个作用于某对象结构中的各元素的操作. 它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 访问者模式是一种行为型模式. 用途
随机推荐
- vue 打包后,后缀名为.woff等字体问题不能用解决办法
1.打开 build / webpack.prod.conf.js ,找到 module: { rules: utils.styleLoaders({ sourceMap: config.build. ...
- Python基础(条件判断和循环) if elif else for while break continue;
条件判断 计算机之所以能做很多自动化的任务,因为它可以自己做条件判断. 比如,输入用户年龄,根据年龄打印不同的内容,在Python程序中,用if语句实现: age = 20 if age >= ...
- 几种flash存储芯片的用途和分类
1.IIC EEPROM------容量小,采用的是IIC通信协议:用于在掉电时,存系统配置参数,比如屏幕亮度等.常用芯片型号有 AT24C02.FM24C02.CAT24C02等,其常见的封装多为D ...
- Java设计模式-建造者(Builder)模式
目录 由来 使用 1. 定义抽象 Builder 2. 定义具体 Builder类 3. 定义具体 Director类 4. 测试 定义 文字定义 结构图 优点 举例 @ 最近在看Mybatis的源码 ...
- Microsoft Dynamics CRM 增删改子表汇总子表的某个字段到主表的某个字段(通用插件)
背景 经常有某个汇总子表的数量到主表的总数量,或者汇总子表的总价到主表的总价这种需求. 传统的做法: 1.就是为每个子表实体单独写成一个插件,但是这样不好复用. 2.主表的汇总字段是汇总货币类型,但是 ...
- CodeFirst从零搭建ASP.NETCore2.0
没时间介绍了,废话不说先上车 以下所有扯淡都是建立在.NETCore2.0环境已经搭建好 右键解决方案>新建项目> 选择Web>ASP.NETCoreWeb应用程序(.NET Cor ...
- Js_checkbox的互斥
function ck_click(obj) { var ck_20 = document.getElementById("ck_20"); var ck_25 = documen ...
- 微软职位内部推荐-SW Engineer II for WinCE
微软近期Open的职位: Do you have a passion for embedded devices and services?   Does the following m ...
- LeetCode 504. Base 7 (C++)
题目: Given an integer, return its base 7 string representation. Example 1: Input: 100 Output: "2 ...
- Scrum Meeting day 2
第二次会议,开发人员会议 . • 前端: 1. 登陆界面,login, sign up, 添加加载时的图片. 2. 主界面:采用类微信类型.应含有联系人.群聊.设置 3. ...