设计模式(24)--访问者模式

来源:互联网 发布:055 舰首 知乎 编辑:程序博客网 时间:2024/06/15 08:30

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

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

什么时候使用?
1、对象结构中对象对应的类很少改变,但经常需要在此对象结构上定义新的操作。 2、需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作”污染”这些对象的类,也不希望在增加新操作时修改这些类。

如何实现?

public interface  ComputerPart {    public void accept(ComputerPartVisitor computerPartVisitor);}
public class Keyboard implements  ComputerPart{    public void accept(ComputerPartVisitor computerPartVisitor) {        computerPartVisitor.visit(this);    }}
public class Monitor implements  ComputerPart{    public void accept(ComputerPartVisitor computerPartVisitor) {        computerPartVisitor.visit(this);    }}
public class Mouse implements  ComputerPart{    public void accept(ComputerPartVisitor computerPartVisitor) {        computerPartVisitor.visit(this);    }}
public class Computer implements  ComputerPart{    ComputerPart[] parts;    public Computer(){        parts = new ComputerPart[] {new Mouse(), new Keyboard(), new Monitor()};    }    public void accept(ComputerPartVisitor computerPartVisitor) {        for (int i = 0; i < parts.length; i++) {            parts[i].accept(computerPartVisitor);        }        computerPartVisitor.visit(this);    }}
public interface ComputerPartVisitor {    public void visit(Computer computer);    public void visit(Mouse mouse);    public void visit(Keyboard keyboard);    public void visit(Monitor monitor);}
public class ComputerPartDisplayVisitor implements ComputerPartVisitor {    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.");    }}
public class Client {    public static void main(String[] args) {        ComputerPart computer = new Computer();        computer.accept(new ComputerPartDisplayVisitor());    }}
原创粉丝点击