设计模式--访问者模式

简介

访问者模式,是行为型设计模式之一。访问者模式是一种将数据操作与数据结构分离的设计模式,它可以算是 23种设计模式中最复杂的一个,但它的使用频率并不是很高。
访问者模式的基本想法是,软件系统中拥有一个由许多对象构成的、比较稳定的对象结构,这些对象的类都拥有一个 accept 方法用来接受访问者对象的访问。访问者是一个接口,它拥有一个 visit 方法,这个方法对访问到的对象结构中不同类型的元素做出不同的处理。在对象结构的一次访问过程中,我们遍历整个对象结构,对每一个元素都实施 accept 方法,在每一个元素的 accept 方法中会调用访问者的 visit 方法,从而使访问者得以处理对象结构的每一个元素,我们可以针对对象结构设计不同的访问者类来完成不同的操作,达到区别对待的效果。

访问者模式结构图:
在这里插入图片描述

角色

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

简单示例

1.创建访问者角色(Visitor)

public interface Visitor {
    public void visit(NodeA nodeA);
    public void visit(NodeB nodeB);
    public void visit(NodeC nodeC);
    public void visitCollection(Collection collection);
}

2.创建具体访问者角色(Concrete Visitor)

public class VisitorA implements Visitor {
    @Override
    public void visit(NodeA nodeA) {
        System.out.println("Execute visitNodeA method!");
    }

    @Override
    public void visit(NodeB nodeB) {
        System.out.println("Execute visitNodeB method!");
    }

    @Override
    public void visit(NodeC nodeC) {
        System.out.println("Execute visitNodeC method!");
    }

    @Override
    public void visitCollection(Collection collection) {
        Iterator iterator = collection.iterator();
        while (iterator.hasNext()) {
            Object o = iterator.next();
            if (o instanceof Visitable)
                ((Visitable) o).accept(this);
        }
    }
}

3.创建元素角色(Element)

public interface Visitable {
    public void accept(Visitor visitor);
}

4.具体元素角色(Concrete Element)

public class NodeA implements Visitable {
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}
public class NodeB implements Visitable {
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}
public class NodeC implements Visitable {
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}

5.Client(Main验证)

public class VisitorMain {
    public static void main(String[] args) {
        NodeA nodeA = new NodeA();
        NodeB nodeB = new NodeB();
        NodeC nodeC = new NodeC();
        VisitorA visitorA = new VisitorA();
        visitorA.visit(nodeA);
        visitorA.visit(nodeB);
        visitorA.visit(nodeC);
        List<Visitable> list = new ArrayList<Visitable>();
        list.add(nodeA);
        list.add(nodeB);
        list.add(nodeC);
        visitorA.visitCollection(list);
    }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值