访问者模式

《java与模式》中是这样描述访问者模式作用的:

访问者模式是对象的行为模式。访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变。

下图简单的描述了访问者模式的结构:


image

类图及代码实现

未进行抽象封装的简单实现

image
/*
 * 图书馆(被访问者)
 */
public class Library {
    
    /*
     * 访问权限,调用该方法时,访问者才能访问自己
     */
    public void accept(Visitor v) {
        v.visit(this);
    }
    /*
     *展示自己
     */
    public void display() {
        System.out.print("访问成功!");
    }

}

/*
 * 访问者
 */
public class Visitor {
    
    /*
     * 调用用此方法可以进行访问
     */
    public void visit(Library l) {
        l.display();
    }
}
/*
 * 客户端
 */
public class Client {

    public static void main(String[] args) {
        //创建访问者对象
        Visitor visitor = new Visitor();
        //创建被访问者对象
        Library library = new Library();
        
        //被访问者允许访问者访问自己(主动)
        library.accept(visitor);
    }

}

抽象封装

image
/*
 * 被访问者具体类 Article
 */
class Article implements Library{

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

    @Override
    public void display() {
        /*
         * do some things
         */
        System.out.println("访问成功!");
    }
    
}

/*
 * 访问者类的接口
 */
public interface Visitor {
    void visit(Library li);
}
class ConcreteVisitor implements Visitor{

    @Override
    public void visit(Library li) {
        li.display();
    }
    
}

/*
 * 访问者进行访问的代理,将访问者所有想访问的被访问者对象聚集到这里。
 */
public class Maneger {
    //保存所有请求访问者对象的集合
    private List list = new ArrayList();
    
    //添加被访问者对象
    public void add(Library l) {
        list.add(l);
    }
    
    //执行访问操作
    public void action(Visitor v) {
        for(Library i: list) {
            i.accept(v);
        }
    }
}
/*
 * 客户端
 */
public class Client {
    public static void main(String[] args) {
        //创建一个访问者对象
        Visitor v = new ConcreteVisitor();
        //创建两个要访问的对象
        Library book = new Book();
        Library article = new Article();
        //创建一个访问者代理
        Maneger m = new Maneger();
        //添加要访问的对象到代理中
        m.add(article);
        m.add(book);
        
        //进行访问
        m.action(v);
    }
}

你可能感兴趣的:(访问者模式)