访问者模式 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) 请分析上图中这条命令的涉及到的角色以及执行过程,一种可能的理解方式是这样子的: 涉及角色为:大狗子和大狗子他妈 过程为:大狗子他妈角色 调用 大狗子的“回家吃饭”方法 引子 ...
随机推荐
- unity3d从入门到精通要掌握什么内容
Unity3d就业方向广.游戏行业占据了65%的比例,也有虚拟现实,增强现实等方向,就业前景火爆.可以从事的岗位:游戏开发工程师.移动应用开发工程师.游戏场景设计师.游戏特效设计师.VR开发工程师.A ...
- PAT1028:List Sorting
1028. List Sorting (25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Excel ca ...
- SSM-SpringMVC-24:SpringMVC异常高级之自定义异常
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 自定义异常,大家都会,对吧,无非就是继承异常类等操作,很简单,我就不多扯皮了,但是在xml配置文件中有个不同的 ...
- 使用SimHash进行海量文本去重[转载]
阅读目录 1. SimHash与传统hash函数的区别 2. SimHash算法思想 3. SimHash流程实现 4. SimHash签名距离计算 5. SimHash存储和索引 6. SimHas ...
- 关于基线baseline及与inline-block、vertical-aline等属性的关系(完善中.......)
1. 基本含义 基线(base line):而是英文字母x的下端沿,是a,c,z,x等字母的底边线,并不是汉字文字的下端沿,.下图的红色线即为基线.凡是涉及到垂直方向的排版或者对齐的,都离不开最最基本 ...
- Tomcat9使用免费的Https证书加密网站
1.概述 Apache Tomcat是一款优秀的Java Web容器,对于各个站长来说,可以很方便的使用Tomcat将自己的网站博客放在公网的服务器上,分享自己的心得以及个人博客. 那么在公网中的访问 ...
- Nginx从听说到学会
第一章 Nginx简介 Nginx是什么 没有听过Nginx?那么一定听过它的"同行"Apache吧!Nginx同Apache一样都是一种WEB服务器.基于REST架构风格,以统一 ...
- php自带验证邮箱 url ip函数
以前用PHP验证邮箱.URL.IP是否合法都是通过自己写正则来实现,但是有时候脑子发昏,可能会写出一个不是完全正确的正则,导致验证出错,今天发现原来PHP本身自带了验证邮箱.URL.IP是否合法的函数 ...
- poj~1904
Description Once upon a time there lived a king and he had N sons. And there were N beautiful girls ...
- vue 实践记录
打包后使用相对路径 在 build/webpack.prod.conf.js 的 output 节点添加配置:publicPath: './' 打包时使用shell复制文件 在入口 build/bui ...