設計模式之---訪問者模式

package visitor;

public interface IVisitor {
	void visit(Element element);  
}
package visitor;

public abstract class Element {
	public abstract void accept(IVisitor visitor);  
    public abstract void doSomething();
}
package visitor;

public class Visitor implements IVisitor {

	@Override
	public void visit(Element element) {
		// TODO Auto-generated method stub
		System.out.println("對element中的數據進行操作");
		element.doSomething();
	}

}
package visitor;

public class ConcreteElement0 extends Element {

	@Override
	public void accept(IVisitor visitor) {
		// TODO Auto-generated method stub
		visitor.visit(this); //這是關鍵 利用雙分派技術實現處理與數據結構的分離
	}

	@Override
	public void doSomething() {
		// TODO Auto-generated method stub
		System.out.println("這是元素0的方法");
	}

}
package visitor;

public class ConcreteElement1 extends Element {

	@Override
	public void accept(IVisitor visitor) {
		// TODO Auto-generated method stub
		visitor.visit(this); //這是關鍵 利用雙分派技術實現處理與數據結構的分離
	}

	@Override
	public void doSomething() {
		// TODO Auto-generated method stub
		System.out.println("這是元素1的方法");
	}

}
package visitor;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class ObjectStruture {
	public static List<Element> getList(){  
        List<Element> list = new ArrayList<Element>();  
        Random ran = new Random();  
        for(int i=0; i<10; i++){  
            int a = ran.nextInt(100);  
            if(a>50){  
                list.add(new ConcreteElement0());
            }else{  
                list.add(new ConcreteElement1());  
            }  
        }  
        return list;  
    }  
}
package visitor;

import java.util.List;

public class Client {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		List<Element> list = ObjectStruture.getList();  
        for(Element e: list){  
            e.accept(new Visitor());  
        }  
	}

}
簡單說一下單分派和多分派

訪問者模式的優點

訪問者模式的適用場景

最後還是強調一點,不要爲了用設計模式而用設計模式。當真正需要時才用,這纔是運用設計模式的正確姿勢。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章