访问者模式

来源:互联网 发布:淘宝开放平台sdk下载 编辑:程序博客网 时间:2024/06/04 00:54

应用场景:

访问者模式结构:
访问者角色(Visitor): 为该对象结构中具体元素角色声明一个访问操作接口. 
具体访问者角色(Concrete Visitor): 实现每个由访问者角色(Visitor)声明的操作.
元素角色(Element): 定义一个Accept操作,它以一个访问者为参数.
具体元素角色(Concrete Element): 实现由元素角色提供的Accept操作.
对象结构角色(Object Structure): 这是使用访问者模式必备的角色. 它要具备以下特征: 能枚举它的元素; 可以提供一个高层的接口以允许该访问者访问它的元素; 可以是一个复合(组合模式)或是一个集合, 如一个列表或一个无序集合.

/**
 * 访问的接口
 * @author Administrator
 *
 */
public interface IVisitor {  
    void visit(Wheel wheel);  
    void visit(Engine engine);  
    void visit(Body body);  
    void visit(Car car);  
}  

-------------------------------------------------------------

/**
 * 具体的访问者
 * @author Administrator
 *
 */
public class PrintVisitor implements IVisitor {  
 
    @Override  
    public void visit(Wheel wheel) {  
        System.out.println("Visiting " + wheel.getName() + " wheel");  
  
    }  
  
    @Override  
    public void visit(Engine engine) {  
        System.out.println("Visiting engine");  
    }  
  
    @Override  
    public void visit(Body body) {  
        System.out.println("Visiting body");  
    }  
  
    @Override  
    public void visit(Car car) {  
        System.out.println("Visiting car");  
    }  
}  

------------------------------------------------------------------------------------------------

/**
 * 被访问的对象Body
 * @author Administrator
 *
 */
public class Body {  
    public void accept(IVisitor visitor) {  
        visitor.visit(this);  
    }  

--------------------------------------------------------------------

/**
 * 被访问的对象Engine
 * @author Administrator
 *
 */
public class Engine {  
    public  void accept(IVisitor visitor) {  
             visitor.visit(this);  
     }  

--------------------------------------------------------------------------------

/**
 * 被访问的对象Wheel
 * @author Administrator
 *
 */
public class Wheel {  
    private String name;  
    public Wheel(String name) {  
        this.name = name;  
    }  
    String getName() {  
        return this.name;  
    }  
    public  void accept(IVisitor visitor) {  
        visitor.visit(this);  
    }  

-------------------------------------------------------------------------------------------

/**
 * 被访问的对象Car
 * @author Administrator
 *
 */
public class Car {  
    private Engine  engine = new Engine();  
    private Body    body   = new Body();  
    private Wheel[] wheels   
        = { new Wheel("front left"), new Wheel("front right"),  
            new Wheel("back left") , new Wheel("back right")  };  
    public void accept(IVisitor visitor) {  
        visitor.visit(this);  
        engine.accept(visitor);  
        body.accept(visitor) ;   
        for (int i = 0; i < wheels.length; ++ i)  
            wheels[i].accept(visitor);  
    }  
}  

------------------------------------------------------------------------------------------------

public class Test {


/**
* 测试类 访问小汽车
*/
public static void main(String[] args) {
Car car = new Car();

IVisitor visitor = new PrintVisitor();

car.accept(visitor);
}
}

0 0
原创粉丝点击