Java设计模式之访问者模式

来源:互联网 发布:安卓市场源码 编辑:程序博客网 时间:2024/05/16 10:27

访问者模式(visitor)

概念:
分离对象的数据和行为,可以实现不修改已有类的情况下,增加新的操作[访问者]。

适用:
1一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实施一些依赖于其具体类的操作。
2 需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而你想避免让这些操作“污染”这些对象的类。Visitor使得你可以将相关的操作集中起来定义在一个类中。
3 当该对象结构被很多应用共享时,用Visitor模式让每个应用仅包含需要用到的操作。
4 定义对象结构的类很少改变,但经常需要在此结构上定义新的操作。改变对象结构类需要重定义对所有访问者的接口,这可能需要很大的代价。如果对象结构类经常 改变,那么可能还是在这些类中定义这些操作较好。

代码示例:

Visitor.java
/** * 具体访问者 * 实现每个由Visitor声明的操作,每个操作实现算法的一部分,而该算法片段是应对于结构中对象的类 */public class VisitorA implements Visitor {    public void visit(Park park) {}    public void visit(ParkB parkB) {}    public void visit(ParkA parkA) {        System.out.println("清洁工A完成公园A部分的卫生");    }}
/** * 具体访问者 * 实现每个由Visitor声明的操作,每个操作实现算法的一部分,而该算法片段是应对于结构中对象的类 */public class VisitorB implements Visitor {    public void visit(Park park) {}    public void visit(ParkA parkA) {}    public void visit(ParkB parkB) {        System.out.println("清洁工B完成公园B部分的卫生");    }}
/** * 具体访问者 * 实现每个由Visitor声明的操作,每个操作实现算法的一部分,而该算法片段是应对于结构中对象的类 */public class VisitorManager implements Visitor {    public void visit(Park park) {        System.out.println("管理员负责公园卫生检查");    }    public void visit(ParkA parkA) {        System.out.println("管理员负责公园A部分卫生检查");    }    public void visit(ParkB parkB) {        System.out.println("管理员负责公园B部分卫生检查");    }}
/** * 公园每一部分的抽象 * 定义一个accept操作,接收访问者 */public interface ParkElement {    public void accept(Visitor visitor);}
public class Park implements ParkElement {    private ParkA parkA;    private ParkB parkB;    public Park(){        this.parkA = new ParkA();        this.parkB = new ParkB();    }    public void accept(Visitor visitor) {        visitor.visit(this);        parkA.accept(visitor);        parkB.accept(visitor);    }}
/** * 公园的A部分 */public class ParkA implements ParkElement {    public void accept(Visitor visitor) {        visitor.visit(this);    }}
/** * 公园的B部分 */public class ParkB implements ParkElement {    public void accept(Visitor visitor) {        visitor.visit(this);    }}
/** * 访问者模式的测试 * 访问者模式分离对象的数据和行为,可以实现不修改已有类的情况下,增加新的操作 */public class Test {    public static void main(String[] args) {        Park park = new Park();        VisitorA visitorA = new VisitorA();        park.accept(visitorA);        VisitorB visitorB = new VisitorB();        park.accept(visitorB);        VisitorManager visitorManager = new VisitorManager();        park.accept(visitorManager);    }}
原创粉丝点击