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

意图
意图解析
侠客行代码示例
package visitor.侠客行;
public interface 掌门人 { }
package visitor.侠客行;
public class 没做过坏事的掌门 implements 掌门人 {
}
package visitor.侠客行;
public class 做过坏事的掌门 implements 掌门人 {
}
package visitor.侠客行; import java.util.ArrayList;
import java.util.List; public class 侠客岛 { private List<掌门人> 掌门人List = new ArrayList<>(); public void add掌门人(掌门人 某掌门) {
掌门人List.add(某掌门);
} public void 赏善罚恶(String 处理人) { if (处理人.equals("张三")) { for (掌门人 某掌门X : 掌门人List) { if (某掌门X instanceof 没做过坏事的掌门) { System.out.println("好掌门, 张三: 赏赐没做过坏事的掌门"); } else if (某掌门X instanceof 做过坏事的掌门) { System.out.println("坏掌门, 张三: 不管做过坏事的掌门");
} System.out.println();
}
} else if (处理人.equals("李四")) { for (掌门人 某掌门X : 掌门人List) { if (某掌门X instanceof 没做过坏事的掌门) { System.out.println("好掌门, 李四: 不管没做过坏事的掌门"); } else if (某掌门X instanceof 做过坏事的掌门) { System.out.println("坏掌门, 李四: 惩罚做过坏事的掌门");
}
System.out.println();
}
}
}
}


新版代码示例
package visitor.新版侠客行;
public interface 掌门人 {
} package visitor.新版侠客行;
public class 没做过坏事的掌门 implements 掌门人 {
} package visitor.新版侠客行;
public class 做过坏事的掌门 implements 掌门人 {
}
package visitor.新版侠客行;
public interface 访问使者 {
void 拜访(做过坏事的掌门 坏人);
void 拜访(没做过坏事的掌门 好人);
}
package visitor.新版侠客行;
public class 张三 implements 访问使者 {
@Override
public void 拜访(没做过坏事的掌门 好人) {
System.out.println("好掌门, 张三: 赏赐没做过坏事的掌门");
}
@Override
public void 拜访(做过坏事的掌门 坏人) {
System.out.println("坏掌门, 张三: 不管做过坏事的掌门");
}
}
package visitor.新版侠客行;
public class 李四 implements 访问使者 {
@Override
public void 拜访(没做过坏事的掌门 好人) {
System.out.println("好掌门, 李四: 不管没做过坏事的掌门");
}
@Override
public void 拜访(做过坏事的掌门 坏人) {
System.out.println("坏掌门, 李四: 惩罚做过坏事的掌门");
}
}
package visitor.新版侠客行; import java.util.ArrayList;
import java.util.List; public class 侠客岛 {
private List<掌门人> 掌门人List = new ArrayList<>(); public void add掌门人(掌门人 某掌门) {
掌门人List.add(某掌门);
} public void 赏善罚恶(访问使者 使者) {
for (掌门人 某掌门X : 掌门人List) {
if (某掌门X instanceof 没做过坏事的掌门) {
使者.拜访((没做过坏事的掌门)某掌门X);
} else if (某掌门X instanceof 做过坏事的掌门) {
使者.拜访((做过坏事的掌门)某掌门X);
}
System.out.println();
}
}
}
package visitor.新版侠客行;
public class Test {
public static void main(String[] args){
侠客岛 善善罚恶二使 = new 侠客岛();
善善罚恶二使.add掌门人(new 做过坏事的掌门());
善善罚恶二使.add掌门人(new 没做过坏事的掌门());
善善罚恶二使.add掌门人(new 没做过坏事的掌门());
善善罚恶二使.add掌门人(new 做过坏事的掌门());
访问使者 张三 = new 张三();
访问使者 李四 = new 李四();
善善罚恶二使.赏善罚恶(李四);
善善罚恶二使.赏善罚恶(张三);
}
}

package visitor.新版侠客行;
public class 龙木岛主 implements 访问使者 {
@Override
public void 拜访(做过坏事的掌门 坏人) {
System.out.println("龙木岛主,惩罚坏人");
}
@Override
public void 拜访(没做过坏事的掌门 好人) {
System.out.println("龙木岛主,赏赐好人");
}
}




最新版侠客行代码示例
package visitor.最新版本侠客行;
public interface 掌门人 {
void 接受拜访(访问使者 赏善使者);
}
package visitor.最新版本侠客行;
public class 没做过坏事的掌门 implements 掌门人 {
@Override
public void 接受拜访(访问使者 赏善罚恶使者) {
赏善罚恶使者.拜访(this);
}
}
package visitor.最新版本侠客行;
public class 做过坏事的掌门 implements 掌门人 {
@Override
public void 接受拜访(访问使者 赏善罚恶使者) {
赏善罚恶使者.拜访(this);
} }
package visitor.最新版本侠客行;
public interface 访问使者 {
void 拜访(做过坏事的掌门 坏人);
void 拜访(没做过坏事的掌门 好人);
} package visitor.最新版本侠客行;
public class 张三 implements 访问使者 {
@Override
public void 拜访(没做过坏事的掌门 好人) {
System.out.println("好掌门, 张三: 赏赐没做过坏事的掌门");
}
@Override
public void 拜访(做过坏事的掌门 坏人) {
System.out.println("坏掌门, 张三: 不管做过坏事的掌门");
}
}
package visitor.最新版本侠客行;
public class 李四 implements 访问使者 {
@Override
public void 拜访(没做过坏事的掌门 好人) {
System.out.println("好掌门, 李四: 不管没做过坏事的掌门");
}
@Override
public void 拜访(做过坏事的掌门 坏人) {
System.out.println("坏掌门, 李四: 惩罚做过坏事的掌门");
}
}
package visitor.最新版本侠客行; import java.util.ArrayList;
import java.util.List;
public class 侠客岛 {
private List<掌门人> 掌门人List = new ArrayList<>();
public void add掌门人(掌门人 某掌门) {
掌门人List.add(某掌门);
}
public void 赏善罚恶(访问使者 使者) {
for (掌门人 某掌门X : 掌门人List) {
某掌门X.接受拜访(使者);
System.out.println();
}
}
}

package visitor.最新版本侠客行;
public class 龙木岛主 implements 访问使者 {
@Override
public void 拜访(做过坏事的掌门 坏人) {
System.out.println("龙木岛主,惩罚坏人");
}
@Override
public void 拜访(没做过坏事的掌门 好人) {
System.out.println("龙木岛主,赏赐好人");
}
}

package visitor.最新版本侠客行;
public class 不好不坏的掌门 implements 掌门人 {
@Override
public void 接受拜访(访问使者 赏善罚恶使者) {
赏善罚恶使者.拜访(this);
}
}

代码演化小结

最新版侠客行结构

回首意图
结构

概念示例代码
package visitor;
public class example {
public static void main(String[] args) {
A1 a1 = new A1();
A2 a2 = new A2();
A3 a3 = new A3();
B1 b1 = new B1();
B2 b2 = new B2();
B3 b3 = new B3();
b1.accept(a1);
b1.accept(a2);
b1.accept(a3);
b2.accept(a1);
b2.accept(a2);
b2.accept(a3);
b3.accept(a1);
b3.accept(a2);
b3.accept(a3);
}
}
abstract class A {
abstract void visit(B1 b1);
abstract void visit(B2 b2);
abstract void visit(B3 b3);
}
class A1 extends A {
@Override
void visit(B1 b1) {
System.out.println("A1 play with B1");
}
@Override
void visit(B2 b2) {
System.out.println("A1 play with B2");
}
@Override
void visit(B3 b3) {
System.out.println("A1 play with B3");
}
}
class A2 extends A {
@Override
void visit(B1 b1) {
System.out.println("A2 play with B1");
}
@Override
void visit(B2 b2) {
System.out.println("A2 play with B2");
}
@Override
void visit(B3 b3) {
System.out.println("A2 play with B3");
}
}
class A3 extends A {
@Override
void visit(B1 b1) {
System.out.println("A3 play with B1");
}
@Override
void visit(B2 b2) {
System.out.println("A3 play with B2");
}
@Override
void visit(B3 b3) {
System.out.println("A3 play with B3");
}
}
abstract class B {
abstract void accept(A a);
}
class B1 extends B {
@Override
void accept(A a) {
a.visit(this);
}
}
class B2 extends B {
@Override
void accept(A a) {
a.visit(this);
}
}
class B3 extends B {
@Override
void accept(A a) {
a.visit(this);
}
}

总结
访问者模式 Visitor 行为型 设计模式(二十七)的更多相关文章
- 设计模式 ( 二十 ) 访问者模式Visitor(对象行为型)
设计模式 ( 二十 ) 访问者模式Visitor(对象行为型) 1.概述 在软件开发过程中,对于系统中的某些对象,它们存储在同一个集合collection中,且具有不同的类型,而且对于该集合中的对象, ...
- 设计模式23:Visitor 访问者模式(行为型模式)
Visitor 访问者模式(行为型模式) 动机(Motivation)在软件构造过程中,由于需求的改变,某些类层次结构中常常需要增加新的行为(方法),如果直接在基类中做这样的修改,将会给子类带来繁重的 ...
- 二十四种设计模式:访问者模式(Visitor Pattern)
访问者模式(Visitor Pattern) 介绍表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 示例有一个Message实体类,某些对象对 ...
- 责任链模式 职责链模式 Chain of Responsibility Pattern 行为型 设计模式(十七)
责任链模式(Chain of Responsibility Pattern) 职责链模式 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系 将这些对象连接成一条链,并沿着这 ...
- 乐在其中设计模式(C#) - 访问者模式(Visitor Pattern)
原文:乐在其中设计模式(C#) - 访问者模式(Visitor Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 访问者模式(Visitor Pattern) 作者:webabc ...
- 迭代器模式 Iterator 行为型 设计模式(二十)
迭代器模式(Iterator) 走遍天下,世界那么大,我想去看看 在计算机中,Iterator意为迭代器,迭代有重复的含义,在程序中,更有“遍历”的含义 如果给定一个数组,我们可以通过for循 ...
- 访问者模式(Visitor Pattern)——操作复杂对象结构
模式概述 在软件开发中,可能会遇到操作复杂对象结构的场景,在该对象结构中存储了多个不同类型的对象信息,而且对同一对象结构中的元素的操作方式并不唯一,可能需要提供多种不同的处理方式,还有可能增加新的处理 ...
- 解释器模式 Interpreter 行为型 设计模式(十九)
解释器模式(Interpreter) 考虑上图中计算器的例子 设计可以用于计算加减运算(简单起见,省略乘除),你会怎么做? 你可能会定义一个工具类,工具类中有N多静态方法 比如定义了两个 ...
- 命令模式 Command 行为型 设计模式(十八)
命令模式(Command) 请分析上图中这条命令的涉及到的角色以及执行过程,一种可能的理解方式是这样子的: 涉及角色为:大狗子和大狗子他妈 过程为:大狗子他妈角色 调用 大狗子的“回家吃饭”方法 引子 ...
随机推荐
- php 阿里云短信服务及阿里大鱼实现短信验证码的发送
一:使用阿里云的短信服务 ① 申请短信签名 ②申请短信模板 ③创建Access Key,获取AccessKeyId 与 AccessKeySecret.(为了安全起见,这里建议使用子用户的Access ...
- 设计模式的征途—17.模板方法(Template Method)模式
在现实生活中,很多事情都需要经过几个步骤才能完成,例如请客吃饭,无论吃什么,一般都包含:点单.吃东西.买单等几个步骤,通常情况下这几个步骤的次序是:点单=>吃东西=>买单.在这3个步骤中, ...
- HBuilder 打包流程
1.运行HBuilder---百度搜索HBuilder,官网下载安装包,解压,运行HBuilder.exe.注册账号,并登陆 2.新建app---在左边右键,选择新建APP,或者,点击中间的新建app ...
- PAT1124:Raffle for Weibo Followers
1124. Raffle for Weibo Followers (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN ...
- DropZone(文件上传插件)
1. html文件 dropzone的原理是模拟表单来上传文件,html中的元素有多重形式. 可以建立一个form表单: <form id="dropz" action=&q ...
- 分布式系统之CAP理论杂记
分布式系统的CAP理论:理论首先把分布式系统中的三个特性进行了如下归纳:● 一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值.● 可用性(A):在集群中一部分节点故障后,集群整体是否 ...
- 安装Twisted
Python看到网络编程,讲到Twisted这个强大的网络框架,很有兴趣,配合 官方文档,打算研究一哈,但是一开始就碰壁了. 安装的时候 pip install Twisted报错了: 提示没有装什么 ...
- 第三章——分类(Classification)
3.1 MNIST 本章介绍分类,使用MNIST数据集.该数据集包含七万个手写数字图片.使用Scikit-Learn函数即可下载该数据集: >>> from sklearn.data ...
- Thymeleaf 3.0 专题
http://www.thymeleaf.org/doc/articles/layouts.html thymeleaf的初次使用(带参请求以及调用带参js方法) 之前对于前端框架接触较少,第一次接触 ...
- FPGA学习笔记(二)——FPGA学习路线及开发流程
###### [该随笔部分内容转载自小梅哥] ######### 一.FPGA学习路线 工具使用 -> 语法学习 -> 逻辑设计 -> IP使用 ->接口设计 -& ...