設計模式22——Visitor設計模式

Visitor訪問者設計模式是在不修改已有程序結構的前提下,經過添加額外的「訪問者」來完成對已有代碼功能的提高。 java

 Visitor訪問者設計模式的角色:
(1) 訪問者角色(Visitor):聲明一個訪問接口。接口的名稱和方法的參數標識了向訪問者發送請求的元素角色。這樣訪問者就能夠經過該元素角色的特定接口直接訪問它。
(2) 具體訪問者角色(Concrete Visitor):實現訪問者角色(Visitor)接口 設計模式

(3)元素角色(Element):定義一個Accept操做,它以一個訪問者爲參數。
(4) 具體元素角色(Concrete Element):實現元素角色(Element)接口。
(5) 對象結構角色(Object Structure):具體元素的集合,提供一個高層的接口容許訪問者角色訪問它的元素。 this

Visitor訪問者設計模式結構以下: spa

Visitor訪問者設計模式例子代碼以下: 設計

//抽象元素
interface IElement{
    public void accept(IVisitor visitor);
}


//具體元素
class ElementA implements IElement{
    public void accept(IVisitor visitor){
        visitor.visit(this);
    }

    public void operationA(){
        System.out.println(「ElementA do operationA()……」);
    }
}


class ElementB implements IElement{
    public void accept(IVisitor visitor){
        visitor.visit(this);
    }

    public void operationB(){
        System.out.println(「ElementB do operationB()……」);
    }
}


class ElementC implements IElement{
    public void accept(IVisitor visitor){
        visitor.visit(this);
    }

    public void operationC(){
        System.out.println(「ElementC do operationC()……」);
    }
}


//抽象訪問者
interface IVisitor{
    public void visit(ElementA element);
    public void visit(ElementB element);
    public void visit(ElementC element);
}


//具體訪問者
class MyVisitor implements IVisitor{
    public void visit(ElementA element){
        element.operationA();
    }

    public void visit(ElementB element){
        element.operationB();
    }

    public void visit(ElementC element){
        element.operationC();
    }
} 


Public class VisitorDemo{
    public static void main(String[] args){
        IElement[] list = {new ElementA(), new ElementB(), new ElementC()};
        IVisitor visitor = new MyVisitor();
        for(int i = 0; i < list.length; i++){
            list[i].accept(visitor);
        }	
    }
}


Visitor訪問者設計模式有如下兩個特色: code

(1).對元素的訪問不是訪問者主動發起的,而是經過元素接收訪問者來訪問本身。 對象

(2).對元素的操做不是元素本身主動調用,而是經過訪問者的訪問方法來操做元素。 接口

JDK中訪問者模式的應用: element

javax.lang.model.element.Element和javax.lang.model.element.ElementVisitor
javax.lang.model.type.TypeMirror和javax.lang.model.type.TypeVisitor
javax.lang.model.element.AnnotationValue和javax.lang.model.element.AnnotationValueVisitor
相關文章
相關標籤/搜索