`
jsczxy2
  • 浏览: 1259971 次
  • 性别: Icon_minigender_1
  • 来自: 常州
文章分类
社区版块
存档分类
最新评论

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

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics