第二十三讲:访问者模式

访问者设计模式是最难的设计模式.

Object Structure:公园

Element:是一个抽象,可以是一个接口或者是抽象类.是公园的每一个部分的抽象.

Concrete Element:实际的元素角色.公园的A部分或者是公园的B部分.accept()接待人.

Visitor:抽象的访问者.

Concrete Visitor:清洁工A或者是清洁工B.visit()访问.


对象角色结构Object Structure:Park

Element:ParkElement.公园的每一部分的抽象.

ConcreteElement:ParkA和ParkB.

访问者:Visitor

访问者的具体实现:清洁工AVisitor和清洁工BVisitorB.
Park是用来接收访问者的,它里面没有任何输出的,是没有任何方法的实现的.

输出是由访问者实现的,访问者是如何实现的就看它里面的visit()方法是如何实现的.


public void visit(Park park) {//除了是结合你的不同的重载方法以外,还可以获得park的数据.


public class MainClass {
    public static void main(String[] args) {
        Park park =  new Park();
        park.setName("越秀公园");
        //清洁工A
        VisitorA visitorA = new VisitorA();
        
        
        
        park.accept(visitorA);
        //清洁工B
        VisitorB  visitorB = new VisitorB();
        park.accept(visitorB);
        
        VisitorManager visitorManager = new VisitorManager();
        park.accept(visitorManager);
    }

}
public class Park implements ParkElement {
    private  ParkA parkA;
    private  ParkB parkB;
    
   private String name;//假设公园是有名字的.
    
    




    public Park() {
        super();
        // TODO Auto-generated constructor stub
       this.parkA = new ParkA();
       this.parkB = new ParkB();
       parkA.setName("A");
       parkB.setName("B");
    }








    @Override
    public void accept(Visitor visitor) { 
        // TODO Auto-generated method stub
        visitor.visit(this);//把Park传入进去
        parkA.accept(visitor);
        parkB.accept(visitor);
    }








    public String getName() {
        return name;
    }








    public void setName(String name) {
        this.name = name;
    }

}
/*
 * 公园的A部分
 */
public class ParkA implements ParkElement {
    private String name;
    @Override
    public void accept(Visitor visitor) {
        // TODO Auto-generated method stub
          visitor.visit(this);//把ParkA传进去
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

}
/*
 * 公园的B部分
 * 
 */
public class ParkB implements ParkElement{
    private String name;
    @Override
    public void accept(Visitor visitor) {
        // TODO Auto-generated method stub
        visitor.visit(this);//把ParkB传进去
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

}
/*
 * 公园每一部分的抽象
 * 
 */
public interface ParkElement {
    //用来接纳访问者
    public void accept(Visitor visitor);
}
/*
 * 
 * 访问者
 */
public interface Visitor {
     public void visit(Park park);
     public void visit(ParkA parkA);
     public void visit(ParkB parkB);
}
/*
 * 清洁工A,服务parkA的卫生情况
 * 清洁工A,负责parkA的卫生情况
 */
public class VisitorA implements Visitor {

    @Override
    public void visit(Park park) {
        // TODO Auto-generated method stub

    }

    @Override
    public void visit(ParkA parkA) {
        // TODO Auto-generated method stub
        System.out.println("清洁工A:完成公园"+parkA.getName()+"的卫生");
    }

    @Override
    public void visit(ParkB parkB) {
        // TODO Auto-generated method stub

    }

}
/*
 * 清洁工B,负责公园B部分的卫生
 * 
 */
public class VisitorB implements Visitor{

    @Override
    public void visit(Park park) {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void visit(ParkA parkA) {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void visit(ParkB parkB) {
        // TODO Auto-generated method stub
        //System.out.println("清洁工B:完成公园B的卫生");
    System.out.println("清洁工B:完成公园" +  parkB.getName()+"的卫生");
    
    }

}
public class VisitorManager implements Visitor{

    @Override
    public void visit(Park park) {//除了是结合你的不同的重载方法以外,还可以获得park的数据.
        // TODO Auto-generated method stub
        //System.out.println("管理员:负责公园卫生检查");    
        System.out.println("管理员:负责"+park.getName()+"卫生检查");    
    }

    @Override
    public void visit(ParkA parkA) {
        // TODO Auto-generated method stub
        System.out.println("管理员:负责公园"+parkA.getName()+"部分卫生检查");
    }

    @Override
    public void visit(ParkB parkB) {
        // TODO Auto-generated method stub
        System.out.println("管理员:负责公园"+parkB.getName()+"部分卫生检查");
    }
     
}
原文地址:https://www.cnblogs.com/ZHONGZHENHUA/p/6750329.html