首先需要感谢下网上各位同志提供的实例,呵呵,我看来是站在巨人的肩膀上开始学习的呢。。。
设计模式之Visitor模式:(访问者模式)
定义:让代码用户能够在不修改现有类层次结构的情况下,定义该类层次结构的操作。
说实话,没看明白意思 - -|||感觉就是加入了访问接口,更方便添加外部应用于现有的结构上。。。
看例子吧,网上挖的:
如一个公司里有老板,经理,员工三种角色,每个角色都继续Human这个类,对于Human这个类,我们定义为抽象的,一个一个类介绍吧:
1.基类Human.java(抽像类,方法可以不实现)
package com.xuyi.visitor;
import java.util.ArrayList;
import java.util.List;
public abstract class Human {
protected int id;
// 该人物所管理的人员,如果是老板那么那就可管理经理
protected List<? extends Human> list = new ArrayList<Human>();
public List<? extends Human> getList() {
return list;
}
public void setList(List<? extends Human> list) {
this.list = list;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public void accept(Visitor visitor) {
}
}
2.子类有3个:
Boss.java
package com.xuyi.visitor;
public class Boss extends Human {
public Boss(int id){
this.id = id;
}
@Override
public void accept(Visitor visitor) {
//访问者访问
visitor.visit(this);
}
public String toString(){
return new StringBuffer("Manager the id:"+id).toString();
}
}
Employee.java
package com.xuyi.visitor;
public class Employee extends Human{
public Employee(int id){
this.id = id;
}
@Override
public void accept(Visitor visitor) {
//访问者访问
visitor.visit(this);
}
public String toString(){
return new StringBuffer("Employee the id:"+id).toString();
}
}
Manager.java
package com.xuyi.visitor;
public class Manager extends Human {
public Manager(int id){
this.id = id;
}
@Override
public void accept(Visitor visitor) {
//访问者访问
visitor.visit(this);
}
public String toString(){
return new StringBuffer("Manager the id:"+id).toString();
}
}
3.访问者接口
interface Visitor
package com.xuyi.visitor;
/**
* 访问员工接口
*
*/
public interface Visitor {
public void visit(Human human);
}
4.访问者接口实现
FindVisitor.java
package com.xuyi.visitor;
import java.util.List;
public class FindVisitor implements Visitor{
private int soughtId;
private Human found;
public void visit(Human human) {
if(found==null&&human.getId()==soughtId){
found=human;
return;
}
List<? extends Human> list = human.getList();
for(Human e:list){
if(found==null)
e.accept(this);
}
}
public Human find(Human mc,int id){
found = null;
soughtId = id;
mc.accept(this);
return found;
}
}
5.测试
Test.java
package com.xuyi.visitor;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
Boss boss = new Boss(1);
List<Manager> managers = new ArrayList<Manager>();
for(int i =2;i<10;i++){
Manager manager = new Manager(i);
List<Employee> employees = new ArrayList<Employee>();
int k = i*10;
for(int j = k;j<k+8;j++){
employees.add(new Employee(j));
}
manager.setList(employees);
managers.add(manager);
}
boss.setList(managers);
FindVisitor fv =new FindVisitor();
Human human = fv.find(boss, 20);
System.out.println("find:"+ human);
}
}
关键在于访问接口的定义以及类中加入访问者访问的方法