Visitor模式定義:
          表示一個作用于某對象結構中各元素的操作。它可以使你不修改各元素類的前提下定義作用于這些元素的新操作,也就是動態(tài)的增加新的方法。
          Visitor模式結構圖:
           
          Visitor模式中主要角色:
          1) 訪問者角色(Visitor):為該對象結構(ObjectStructure)中的具體元素提供一個訪問操作接口。該操作接口的名字和參數標識了要訪問的具體元素角色。這樣訪問者就可以通過該元素角色的特定接口直接訪問它。
          2) 具體訪問者角色(ConcreteVisitor):實現Vistor接口的操作。
          3)元素角色(Element):該接口定義一個accept操作接受具體的訪問者。
          4) 具體元素角色(ConcreteElement):實現Element的accept操作。
          5) 對象結構角色(ObjectStructure):這是使用訪問者模式必備的角色。它要具備以下特征:能枚舉它的元素;可以提供一個高層的接口以允許該訪問者訪問它的元素;可以是一個復合(組合模式)或是一個集合,如一個列表或一個無序集合。
          Visitor模式的一個例子
          由于本人閱歷不足,實在想不出好的例子,這個例子基本是按結構圖所寫,不過已經加上了注釋。
          import java.util.ArrayList;
          import java.util.Collection;

          interface Visitor{
           public void visitElementA(ConcreteElementA elementA);//針對具體元素A的新方法
           public void visitElementB(ConcreteElementB elementB);//針對具體元素B的新方法
          }
          interface Element{
           public void accept(Visitor visitor);
          }
          class ConcreteVisitor implements Visitor{//具體的訪問者

           public void visitElementA(ConcreteElementA elementA) {
            System.out.println(elementA.getName()+" visited by ConcreteVisitor ");
            
           }
           public void visitElementB(ConcreteElementB elementB) {
            System.out.println(elementB.getName()+" visited by ConcreteVisitor ");
            
           }
          }
          class ConcreteElementA implements Element{//具體元素A
           private String name;
           public ConcreteElementA(String name){
            this.name=name;
           }
            
           public void accept(Visitor visitor) {//接受訪問者調用它針對該元素的新方法
            visitor.visitElementA(this);
            
           }
           public String getName() {
            return name;
           }
           
           
          }
          class ConcreteElementB implements Element{//具體元素B
           private String name;
           public ConcreteElementB(String name){
            this.name=name;
           }
           public String getName() {
            return name;
           }
           public void accept(Visitor visitor) {//接受訪問者調用它針對該元素的新方法
            visitor.visitElementB(this);
            
           }
           
          }
          class ObjectStructure{//對象結構即元素的集合
           private Collection<Element> collection=new ArrayList<Element>();
           public void attach(Element element){
            collection.add(element);
           }
           public void detach(Element element){
            collection.remove(element);
           }
           public void accept(Visitor visitor )
             {
               for(Element element:collection){
                element.accept(visitor);
               }
             }

          }
          public class Client {
           public static void main(String args[]){
            Element elementA=new ConcreteElementA("ElementA");
            Element elementB=new ConcreteElementB("ElementB");
            Visitor visitor=new ConcreteVisitor();
            
            ObjectStructure os=new ObjectStructure();
            os.attach(elementA);
            os.attach(elementB);
            os.accept(visitor);
            
            }
           
          }
          Visitor模式優(yōu)缺點:
          1) 優(yōu)點:不用修改具體的元素類,就可以增加新的操作。主要是通過元素類的accept方法來接受一個visitor對象來實現的。
          2) 缺點:不易頻繁增加元素類,沒增加一個元素類,就要在Visitor接口中寫一個針對該元素的方法,而且還要修改Visitor的子類。

           

          posts - 146, comments - 143, trackbacks - 0, articles - 0

          Copyright © flustar

          主站蜘蛛池模板: 葵青区| 来凤县| 阜阳市| 舞阳县| 澳门| 枣强县| 景谷| 武清区| 呼玛县| 萨嘎县| 朝阳区| 浙江省| 马山县| 永川市| 望奎县| 普兰店市| 望江县| 蒙城县| 开鲁县| 丰镇市| 萨迦县| 兰坪| 江达县| 吉安县| 察哈| 苏尼特右旗| 黎川县| 孝义市| 朝阳区| 榕江县| 奉化市| 阿克陶县| 昌都县| 永嘉县| 剑阁县| 米脂县| 定襄县| 项城市| 德江县| 普格县| 通州市|