【设计模式】访问者模式

1.定义

访问者模式(Visitor)表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。将数据结构与数据操作分离。

2.结构

2.1 UML类图

访问者模式

2.2 角色
  • 访问者角色(Visitor):为该对象结构中具体元素角色声明了一个访问操作接口,该操作接口的名字和参数标识了发送访问请求给具体访问者的具体元素角色,这样访问者就可以通过该元素角色的特定接口直接访问它。
  • 具体访问者角色(Concrete Visitor):实现每个由访问者角色声明的操作
  • 元素角色(Element):定义一个Accept操作,它以一个访问者为参数
  • 具体元素角色(Concrete Element):实现由元素角色提供的Accept操作
  • 对象结构角色:使用访问者模式必备的角色,它具备以下特征:能枚举它的元素,可提供一个高层的接口以允许该访问者访问它的元素,它可以是一个符合(组合模式)或是一个集合,如一个列表或一个无序集合。

3.实现

/**
 * 访问者接口
 */
interface Visitor {
    void visit(NaturalPark element);
    void visit(SeasidePark element);
}

/**
 * 清洁工A
 */
class CleanerVisitorA implements Visitor {
    @Override
    public void visit(NaturalPark element) {
        System.out.println("清洁工A 打扫自然公园");
    }

    @Override
    public void visit(SeasidePark element) {
    }
}

/**
 * 清洁工B
 */
class CleanerVisitorB implements Visitor {
    @Override
    public void visit(NaturalPark element) {
    }

    @Override
    public void visit(SeasidePark element) {
        System.out.println("清洁工B 打扫海岸公园");
    }
}

/**
 * 清洁工管理员
 */
class CleanerManager implements Visitor {
    @Override
    public void visit(NaturalPark element) {
        System.out.println("清洁工管理员 检查自然公园");
    }

    @Override
    public void visit(SeasidePark element) {
        System.out.println("清洁工管理员 检查海岸公园");
    }
}

/**
 * 公园抽象类
 */
interface ParkElement {
    void accept(Visitor visitor);
}

/**
 * 自然公园
 */
class NaturalPark implements ParkElement {
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}

/**
 * 海岸公园
 */
class SeasidePark implements ParkElement {
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}

/**
 * 所有公园
 */
class Park implements ParkElement {
    private NaturalPark naturalPark;
    private SeasidePark seasidePark;

    public Park() {
        naturalPark = new NaturalPark();
        seasidePark = new SeasidePark();
    }

    @Override
    public void accept(Visitor visitor) {
        naturalPark.accept(visitor);
        seasidePark.accept(visitor);
    }
}

public class VisitorDemo {
    public static void main(String[] args) {
        Park park = new Park();
        park.accept(new CleanerVisitorA());
        park.accept(new CleanerVisitorB());
        park.accept(new CleanerManager());
    }
}

4.优缺点

4.1 优点
  • 增加新的操作容易,即增加一个新的访问者,因为访问者模式将有关的行为集中到一个访问者对象中。
  • 使得数据结构和作用于结构上的操作解耦,使得操作集合可以独立变化。
  • 符合单一职责原则,可扩展。
4.2 缺点
  • 增加新的数据结构时变得繁琐。

本人才疏学浅,若有错,请指出,谢谢!
如果你有更好的建议,可以留言我们一起讨论,共同进步!
衷心的感谢您能耐心的读完本篇博文!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值