`
wdt1988520
  • 浏览: 14361 次
社区版块
存档分类
最新评论

访问者模式(Visitor)

 
阅读更多

GOF定义:表示一个作用于某对象结构中的各元素的操作用,它是你可以在不改变各元素的前提下定义作用于这些元素的新操作。

 

访问者模式是21中设计模式中最难理解的一个设计模式。


 

 

角色分析:

   抽象访问者:

        抽象类或者接口,声明访问者可以访问哪些元素,具体的程序中就是visit方法中的参数定义。

   访问者:

        实现抽象访问者所声明的方法,及访问元素的后做的操作。

   抽象元素类:

        接口或者抽象类,声明接受哪一类访问者访问,程序中定义accept方法的参数定义。

   元素类:实现抽象元素类所声明的accept方法,及一般的class.。基本实现:visitor.visit(this);

 

 

 

具体例子实现:

   

/**
 * 抽象访问者角色
 * @author wdt
 *
 */
interface IVisitor {  
    public void visit(Element1 el1);  
    public void visit(ConcreteElement2 el2);  
}  


/**
 * 
 * @author wdt
 * 具体访问者角色
 * 实现抽象访问者的方法
 */
class Visitor implements IVisitor {  
	  
	/**
	 * el1为被访问的对象
	 */
    public void visit(ConcreteElement1 el1) {  
        ---这里还可以做点什么?
        el1.doSomething();  
    }  
      
    public void visit(ConcreteElement2 el2) {  
        el2.doSomething();  
    }  
}  
  

 

/**
 * 抽象访问者角色
 * @author wdt
 *
 */
interface Element{  
    public void visit(IVisitor v);        
} 


/**
 * 具体元素对象 实现抽象元素对象的方法
 * @author wdt
 *
 */
class ConcreteElement1 extends Element {  
    public void doSomething(){  
        System.out.println("这是元素1");  
    }  
      
    public void accept(IVisitor visitor) {  
        visitor.visit(this);  
    }  
}  
  
class ConcreteElement2 extends Element {  
    public void doSomething(){  
        System.out.println("这是元素2");  
    }  
      
    public void accept(IVisitor visitor) {  
        visitor.visit(this);  
    }  
}  

 

    

public class Client {  
    public static void main(String[] args){  
        List<Element> list = new ArrayList<Element>();  
        list.add(new ConcreteElement1());
        list.add(new ConcreteElement2());
        for(Element e: list){  
            e.accept(new Visitor());  //接见访问者
        }  
    }  
}  

 

 

使用场景:

     1、一些对象关系比较弱的行为,可以使用访问者模式,将这些弱关系行为放在访问者中。

     

  • 大小: 19.7 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics