Java Visitor Pattern(访问者模式)

来源:互联网 发布:怎么在mac上做铃声 编辑:程序博客网 时间:2024/06/16 06:44

Java Visitor Pattern(访问者模式)

在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。

关键代码:在数据基础类里面有一个方法接受访问者,将自身引用传入访问者。

优点: 1、符合单一职责原则。 2、优秀的扩展性。 3、灵活性。
缺点: 1、具体元素对访问者公布细节,违反了迪米特原则。 2、具体元素变更比较困难。 3、违反了依赖倒置原则,依赖了具体类,没有依赖抽象。

注意事项:访问者可以对功能进行统一,可以做报表、UI、拦截器与过滤器。

  1. 定义一个表示元素的接口。
/** * 1. 定义一个表示元素的接口。 * @author mazaiting */public interface ComputerPart {    public void accept(ComputerPartVisitor visitor);}
  1. 创建扩展了上述类的实体类。
/** * 2. 创建扩展了上述类的实体类。 * @author mazaiting */public class Computer implements ComputerPart{    public void accept(ComputerPartVisitor visitor) {        visitor.visit(this);            }}/** * 2. 创建扩展了上述类的实体类。 * @author mazaiting */public class Keyboard implements ComputerPart{    public void accept(ComputerPartVisitor visitor) {        visitor.visit(this);            }}/** * 2. 创建扩展了上述类的实体类。 * @author mazaiting */public class Monitor implements ComputerPart{    public void accept(ComputerPartVisitor visitor) {        visitor.visit(this);            }}/** * 2. 创建扩展了上述类的实体类。 * @author mazaiting */public class Mouse implements ComputerPart{    public void accept(ComputerPartVisitor visitor) {        visitor.visit(this);            }}
  1. 定义一个表示访问者的接口。
/** * 3. 定义一个表示访问者的接口。 * @author mazaiting */public interface ComputerPartVisitor {    /*public void visit(Computer computer);    public void visit(Mouse mouse);    public void visit(Keyboard keyboard);    public void visit(Monitor monitor);*/    public <T> void visit(T t);}
  1. 创建实现了上述类的实体访问者。
/** * 4. 创建实现了上述类的实体访问者。 * @author mazaiting */public class ComputerPartDisplayVisitor implements ComputerPartVisitor {    public <T> void visit(T t) {        System.out.println(t.getClass().getName());    }    /*public void visit(Computer computer) {        System.out.println("Displaying Computer.");    }    public void visit(Mouse mouse) {        System.out.println("Displaying Mouse.");    }    public void visit(Keyboard keyboard) {        System.out.println("Displaying Keyboard.");    }    public void visit(Monitor monitor) {        System.out.println("Displaying Monitor.");    }*/}
  1. 使用 ComputerPartDisplayVisitor 来显示 Computer 的组成部分。
/** * 5. 使用 ComputerPartDisplayVisitor 来显示  * Computer 的组成部分。 * @author mazaiting */public class Client {    public static void main(String[] args) {        ComputerPart computer = new Computer();        computer.accept(new ComputerPartDisplayVisitor());    }}
  1. 打印结果
com.mazaiting.visitor.Computer
原创粉丝点击