学习设计模式之Visitor模式(访问者模式)
首先需要感谢下网上各位同志提供的实例,呵呵,我看来是站在巨人的肩膀上开始学习的呢。。。
?
设计模式之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;}@Overridepublic 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;}@Overridepublic 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;}@Overridepublic 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);}}
?关键在于访问接口的定义以及类中加入访问者访问的方法