今年过年不收礼,收礼只收脑白金。听到这暗示性的广告词,我的脑袋突然一亮。因为最近因为要办某事,必须要给单位的领导要表示一下。到底送什么,还真让人头痛,还好有脑白金,奶奶的。。。,腐败啊,罪过!
首先要对送礼的对象进行分析,单位有两个领导,一正,一副。因此给不同的领导送的礼也是不同的(哈,收入要和产出成正比吗),好了言归正传。
1 、在这里,先把领导定义成一个接口类:
public interface Leader{
public void accept(Visitor visitor); // 主要任务 ---- 收 visitor (拜访者)的礼
}
在把拜访者定义成另一个接口类:
public interface Visitor
{
public void visitFirstHand(FirstHand first); // 拜访一把手(带的礼物)
public void visitSecondHand(SecondHand second); // 拜访二把手(带的礼物)
public void visitCollection(Collection collection); // 判断是拜访一把手还是二把手
}
2 、下面我们要对这两个接口进行实现:
A :一把手
public class FirstHand implements Leader {
private String value; // 注意此处是 String
public FirstHand (String string) {// 一把手的构造函数
value = string;
}
public String getValue() { // 获得礼物
return value;
}
// 定义 accept 的具体内容 这里是很简单的一句调用
public void accept(Visitor visitor) {
visitor.visitFirstHand (this); // 接收拜访人送的礼
}
}
B :二把手
public class SecondHand implements Leader {
private Float value; // 注意此处是 Float
public SecondHand (Float string) {// 二把手的构造函数
value = string;
}
public Float getValue() { // 获得礼物
return value;
}
// 定义 accept 的具体内容 这里是很简单的一句调用
public void accept(Visitor visitor) {
visitor.visitFirstHand (this); // 接收拜访人送的礼
}
}
C :拜访人(我)
public class visitMe implements Visitor{
public void visitCollection(Collection collection) {
Iterator iterator = collection.iterator();
while (iterator.hasNext()) {
Object o = iterator.next();
if (o instanceof Leader) // 判断要送给哪个领导
((Leader)o).accept(this); // 不同的领导进入不同的实现类
}
}
public void visitFirstHand (FirstHand first) {
System.out.println(" 送的礼是: "+ first.getValue());
}
public void visitSecondHand (SecondHand second) {
System.out.println(" 送的礼是: " + second.getValue());
}
}
3 、编写测试类:
public class test {
public static void main(String args[]){
Visitor visitor = new visitMe ();
FirstHand present = new FirstHand (" 十盒脑白金 ");
visitor.visitFirstHand (present);
Collection list = new ArrayList();
list.add(new FirstHand (" 十盒脑白金 "));
list.add(new SecondHand (new Float(" 一斤小点心 "))); // 为了说明不同,如要运行,要做类型转换。
visitor.visitCollection(list);
}
4 、说明:
A : 代码只用来学习 Visitor 模式 , 要运行的话,必须要做一点改动。
B: FirstHand , SecondHand 只是一个个具体实现,实际上还可以拓展为更多的实现,整个核心奥妙在 accept方法中,在遍历 Collection 时,通过相应的 accept 方法调用具体类型的被访问者。这一步确定了被访问者类型
C :使用访问者模式是对象群结构中 (Collection) 中的对象类型很少改变,也就是说领导很少变化。
首先要对送礼的对象进行分析,单位有两个领导,一正,一副。因此给不同的领导送的礼也是不同的(哈,收入要和产出成正比吗),好了言归正传。
public interface Leader{
public void accept(Visitor visitor); // 主要任务 ---- 收 visitor (拜访者)的礼
}
在把拜访者定义成另一个接口类:
public interface Visitor
{
public void visitFirstHand(FirstHand first); // 拜访一把手(带的礼物)
public void visitSecondHand(SecondHand second); // 拜访二把手(带的礼物)
public void visitCollection(Collection collection); // 判断是拜访一把手还是二把手
}
A :一把手
public class FirstHand implements Leader {
private String value; // 注意此处是 String
public FirstHand (String string) {// 一把手的构造函数
value = string;
}
public String getValue() { // 获得礼物
return value;
}
// 定义 accept 的具体内容 这里是很简单的一句调用
public void accept(Visitor visitor) {
visitor.visitFirstHand (this); // 接收拜访人送的礼
}
}
B :二把手
public class SecondHand implements Leader {
private Float value; // 注意此处是 Float
public SecondHand (Float string) {// 二把手的构造函数
value = string;
}
public Float getValue() { // 获得礼物
return value;
}
// 定义 accept 的具体内容 这里是很简单的一句调用
public void accept(Visitor visitor) {
visitor.visitFirstHand (this); // 接收拜访人送的礼
}
}
C :拜访人(我)
public class visitMe implements Visitor{
public void visitCollection(Collection collection) {
Iterator iterator = collection.iterator();
while (iterator.hasNext()) {
Object o = iterator.next();
if (o instanceof Leader) // 判断要送给哪个领导
((Leader)o).accept(this); // 不同的领导进入不同的实现类
}
}
public void visitFirstHand (FirstHand first) {
System.out.println(" 送的礼是: "+ first.getValue());
}
public void visitSecondHand (SecondHand second) {
System.out.println(" 送的礼是: " + second.getValue());
}
}
public class test {
public static void main(String args[]){
Visitor visitor = new visitMe ();
FirstHand present = new FirstHand (" 十盒脑白金 ");
visitor.visitFirstHand (present);
Collection list = new ArrayList();
list.add(new FirstHand (" 十盒脑白金 "));
list.add(new SecondHand (new Float(" 一斤小点心 "))); // 为了说明不同,如要运行,要做类型转换。
visitor.visitCollection(list);
}
A : 代码只用来学习 Visitor 模式 , 要运行的话,必须要做一点改动。
B: FirstHand , SecondHand 只是一个个具体实现,实际上还可以拓展为更多的实现,整个核心奥妙在 accept方法中,在遍历 Collection 时,通过相应的 accept 方法调用具体类型的被访问者。这一步确定了被访问者类型
C :使用访问者模式是对象群结构中 (Collection) 中的对象类型很少改变,也就是说领导很少变化。