访问者模式 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) 请分析上图中这条命令的涉及到的角色以及执行过程,一种可能的理解方式是这样子的: 涉及角色为:大狗子和大狗子他妈 过程为:大狗子他妈角色 调用 大狗子的“回家吃饭”方法 引子 ...
随机推荐
- python笔试题(1)
为了充实自己,小编决定上传自己见到的笔试题和面试题.可能要写好长时间,一时半会写不了多少,只能说遇到多少写多少吧,但是只要小编有时间,会持续上传(但是答案却不能保证,所以有看到错误的及 ...
- .net(C#)在Access数据库中执行sql脚本
自己写的一个工具类,主要是业务场景的需要. 主要有两个功能: ①执行包含sql语句的字符串 ②执行包含sql语句的文件 调用方式 /// <summary> /// 执行sql语句 /// ...
- RocketMQ部分数据消费不了问题排查
问题现象 今天忽然收到RocketMQ预警信息如下: 提醒有部分数据没有消费,产生堆积情况. 打开RocketMq-Console-Ng查看如下图形式: 备注:第一反应是Consumer Group内 ...
- (六)SpringBoot2.0基础篇- Redis整合(JedisCluster集群连接)
一.环境 Redis:4.0.9 SpringBoot:2.0.1 Redis安装:Linux(Redhat)安装Redis 二.SpringBoot整合Redis 1.项目基本搭建: 我们基于(五) ...
- javascript中的隐式类型转化
javascript中的隐式类型转化 #隐式转换 ## "+" 字符串和数字 如果某个操作数是字符串或者能够通过以下步骤转换为字符串的话,+将进行拼接操作. 如果其中一个操作数是对 ...
- Java并发包之同步队列SynchronousQueue理解
1 简介 SynchronousQueue是这样一种阻塞队列,其中每个put必须等待一个take,反之亦然.同步队列没有任何内部容量,甚至连一个队列的容量都没有.不能在同步队列上进行peek,因为仅在 ...
- Python Web(Django)与SQL SERVER的连接处理
(开开心心每一天~ ---虫瘾师) Python Web(Django) 与SQL SERVRE的连接----Come QQ群:607021567(里面有很多开源代码和资料,并且python的游戏也有 ...
- LeetCode Javascript实现 344. Reverse String 292. Nim Game 371. Sum of Two Integers
344. Reverse String /** * @param {string} s * @return {string} */ var reverseString = function(s) { ...
- spawn-fcgi运行fcgiwrap
http://linuxjcq.blog.51cto.com/3042600/718002 标签:休闲 spawn-fcgi fcgiwarp fcgi 职场 原创作品,允许转载,转载时请务必以超链接 ...
- Android监测手指上下左右滑动屏幕
在开发android程序时,有时会需要监测手指滑动屏幕,当手指朝上下左右不同方向滑动时做出不同的响应,那怎么去实现呢? 利用Android提供的手势监测器就可以很方便的实现,直接上代码(已测试通过) ...