学習設計モードのVisitorモード(ビジターモード)


まずネット上の各位の同志の提供する実例に感谢する必要があって、ほほほ、私は巨人の肩の上で学习を始めたようです.の
 
設計モードのVisitorモード:(ビジターモード)
定義:コード・ユーザーが既存のクラス階層を変更せずに、そのクラス階層の操作を定義できるようにします.
正直に言うと、意味がわかりませんでした--|||アクセスインタフェースが入っていて、既存の構造に外部アプリケーションを追加するのが便利だと感じました.
 
例を見てみましょう.ネットで掘ったのです.
1つの会社に社長、マネージャー、従業員の3つの役割があるように、各役割はHumanというクラスを続けています.Humanというクラスについては、抽象的に定義し、1つのクラスを紹介しましょう.
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);
		
		
	}
}

重要なのは、アクセスインタフェースの定義とクラスにアクセス者アクセスを追加する方法です.