访问者模式
标签:设计模式

访问者模式(Visitor)

访问者模式是行为模式之一,它分离对象的数据和行为,使用Visitor模式,可以不修改已有类的情况下,增加新的操作。

1. 访问者模式中的角色及其职责

1.1 访问者角色(Visitor)

为该对象结构中具体元素角色声明一个访问操作接口。该操作接口的名字和参数标识了发送访问请求给具体访问者的具体元素角色。这样访问者就可以通过该元素角色的特定接口直接访问它。

Visitor

package com.liuyao;

/**
 * 访问者
 *
 * @author liuyao
 * @date 2018/08/06
 */
public interface Visitor {
    public void visit(Park park);
    public void visit(ParkA parkA);
    public void visit(ParkB parkB);
}

1.2 具体访问角色(Concrete Visitor)

实现每个由访问者角色(Visitor)声明的操作

VisitorA

package com.liuyao;

/**
 * @author liuyao
 * @date 2018/08/06
 */
public class VisitorA implements Visitor {
    @Override
    public void visit(Park park) {

    }

    @Override
    public void visit(ParkA parkA) {
        System.out.println("visitorA parkA");
    }

    @Override
    public void visit(ParkB parkB) {

    }
}

VisitorB

package com.liuyao;

/**
 * @author liuyao
 * @date 2018/08/06
 */
public class VisitorB implements Visitor{
    @Override
    public void visit(Park park) {

    }

    @Override
    public void visit(ParkA parkA) {

    }

    @Override
    public void visit(ParkB parkB) {
        System.out.println("visitorB parkB");
    }
}

VisitorManager

package com.liuyao;

/**
 * @author liuyao
 * @date 2018/08/06
 */
public class VisitorManager implements Visitor {
    @Override
    public void visit(Park park) {
        System.out.println("visitorManager park");
    }

    @Override
    public void visit(ParkA parkA) {
        System.out.println("visitorManager parkA");
    }

    @Override
    public void visit(ParkB parkB) {
        System.out.println("visitorManager parkB");
    }
}

1.3 元素角色(Element)

定义一个Accept操作,它以一个访问者为参数

ParkElement

package com.liuyao;

/**
 * 公园每一部分的抽象
 *
 * @author liuyao
 * @date 2018/08/06
 */
public interface ParkElement {
    /**
     * 用来接纳访问者类
     */
    public void accept(Visitor visitor);
}

1.4 具体元素角色(Concrete Element)

实现由元素角色提供的Accept操作

ParkA

package com.liuyao;

/**
 * @author liuyao
 * @date 2018/08/06
 */
public class ParkA implements ParkElement{
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}

ParkB

package com.liuyao;

/**
 * @author liuyao
 * @date 2018/08/06
 */
public class ParkB implements ParkElement {
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}

1.5 对象结构角色(Object Structure)

这是访问者模式必备的角色。它要具备以下特征:能枚举它的元素可以提供一个高层的接口以允许该访问者访问它的元素;可以是一个组合模式或是一个集合,如一个列表或一个无序集合。

Park

package com.liuyao;

/**
 * @author liuyao
 * @date 2018/08/06
 */
public class Park implements ParkElement{
   private ParkA parkA;
   private ParkB parkB;

    public Park() {
        parkA=new ParkA();
        parkB=new ParkB();
    }

    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
        parkA.accept(visitor);
        parkB.accept(visitor);
    }
}

Main

package com.liuyao;

public class Main {

    public static void main(String[] args) {
        Park park=new Park();

        VisitorA visitorA=new VisitorA();
        park.accept(visitorA);

        System.out.println("==============================");
        VisitorB visitorB=new VisitorB();
        park.accept(visitorB);

        System.out.println("==============================");
        VisitorManager visitorManager=new VisitorManager();
        park.accept(visitorManager);
    }
}

//visitorA parkA
//==============================
//visitorB parkB
//==============================
//visitorManager park
//visitorManager parkA
//visitorManager parkB
  • 3 min read

CONTRIBUTORS


  • 3 min read