首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

学习设计方式之Visitor模式(访问者模式)

2012-10-18 
学习设计模式之Visitor模式(访问者模式)首先需要感谢下网上各位同志提供的实例,呵呵,我看来是站在巨人的肩

学习设计模式之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);}}

?关键在于访问接口的定义以及类中加入访问者访问的方法

热点排行