访问者模式 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) 请分析上图中这条命令的涉及到的角色以及执行过程,一种可能的理解方式是这样子的: 涉及角色为:大狗子和大狗子他妈 过程为:大狗子他妈角色 调用 大狗子的“回家吃饭”方法 引子 ...
随机推荐
- 连接Access数据遇到的问题总览!
由于要访问一个厂商的access数据,所以要写一个对于access的demo,相对于mysql.sqlserver来说,连接access花费了不少精力,现在将遇到的问题分享出来,以后大家遇到类似问题时 ...
- 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 使用FairyGUI (二)
上次讲解了FairyGUI的最简单的热更新办法,并对其中一个Demo进行了修改并做成了热更新的方式. 这次我们来一个更加复杂一些的情况:Emoji. FairyGUI的 Example 04 - ...
- ubuntu18.04安装搜狗拼音
1.下载好搜狗安装包http://pinyin.sogou.com/linux/ ,注意位数! 2.打开终端安装依赖 sudo apt install libfcitx-qt0 3.提取下载好的 ...
- JAVA中写时复制(Copy-On-Write)Map实现
1,什么是写时复制(Copy-On-Write)容器? 写时复制是指:在并发访问的情景下,当需要修改JAVA中Containers的元素时,不直接修改该容器,而是先复制一份副本,在副本上进行修改.修改 ...
- redis Web服务器
redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set ...
- 【Lua】特性和一些基础语法
在Lua中,你可以使用单行注释和多行注释. 单行注释中,连续两个减号"--"表示注释的开始,一直延续到行末为止.相当于C++语言中的"//". 多行注释中,由& ...
- jenkins在windows下的最快安装方法
jenkins在windows下的安装 2016年04月21日 13:00:09 阅读数:22828 在初步了解了jenkins是什么?jenkins的特点.基本结构,及大概的功能介绍后,就开始对je ...
- ASP.NET后台中调用前台Javascript函数的几种方法
做web开发,用的技术是aspx.net,可是由于比较习惯于ASP现在做起来,觉得非常别扭,原因在于有很多功能其实在前台可以处理的,但是因为用到了很多webcontrol,导致不断postback.如 ...
- aliyun TableStore相关操作汇总
总结:这个东西本身可能技术还不成熟,使用的人少,有问题很验证解决 遇到的问题:(1)没有一个GUI工具,使用门槛高(2)查询的GetRange不方便,把查询出来的数据使用System.out.prin ...
- 7-25 :active :after :before :disabled
1:<list,<datalist>,required,<select>,<option>,title,draggable,hidden 2:data-*和命 ...