设计模式之访问者模式

2017-06-14  本文已影响9人  老羊_肖恩

访问者模式的定义

访问者模式(Visitor Pattern)是一个相对简单的模式,其定义如下:Represent an operation to be performed on the elements of an object structure. Visitor lets you define a new operation without changing the classes of the elements on which it operates. 即:封装一些作用于某些数据结构的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。
访问者模式的通用类图如下:


Visitor.jpg

接下来我们分析一下访问者模式中的角色:

import java.util.Random;

//抽象访问者
public interface IVisitor{
    //可以访问哪些对象
    public void visit(ConcreteElement1 element);
    public void visit(ConcreteElement2 element);
}

//具体访问者
public class Visitor implements IVisitor{

    @Override
    public void visit(ConcreteElement1 element) {
        element.doSomething();
    }

    @Override
    public void visit(ConcreteElement2 element) {
        element.doSomething();
    }
    
}


//抽象元素
public abstract class Element{
    //定义业务逻辑
    public abstract void doSomething();
    
    //允许谁来访问
    public abstract void accept(Visitor visitor);
}

//具体元素类1
public class ConcreteElement1 extends Element{

    @Override
    public void doSomething() {
        System.out.println("Element 1 doSomething...");
    }

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

//具体元素类2
public class ConcreteElement2 extends Element{
    
    @Override
    public void doSomething() {
        System.out.println("Element 2 doSomething...");
    }
    
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
    
}

//结构对象
public class ObjectStructure{
    //对象生成器,这里通过一个工厂方法模式模拟
    public static Element createElement(){
        Random rand = new Random();
        if(rand.nextInt(100) > 50){
            return new ConcreteElement1();
        }
        return new ConcreteElement2();
    }
}

//客户端
public class VisitorClient{
    public static void main(String[] args) {
        for(int i=0; i<5; i++){
            Element el = ObjectStructure.createElement();
            el.accept(new Visitor());
        }
    }
}

代码运行结果如下:

Element 1 doSomething...
Element 2 doSomething...
Element 2 doSomething...
Element 2 doSomething...
Element 1 doSomething...

访问者模式的应用

访问者模式的优点

访问者模式的缺点

访问者模式的适用场景

《注》以上内容总结自秦小波-《设计模式之禅》,仅为个人学习笔记

上一篇 下一篇

猜你喜欢

热点阅读