设计模式:访问者模式
- 访问者模式简介
- 访问者模式中,我们使用一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。属于行为型模式
- 意图: 将数据结构和数据操作分离
- 主要解决:稳定的数据结构和一遍的操作耦合问题。
- 使用场景:
- 对象结构中的对象对应的类很少改变,但经常需要在此对象结构上定义新的操作
- 需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作污染对象的类,也不希望在增加新操作时候修改这些类
- 访问者模式成分
- 数据结构接口:定义接受访问者的方法
- 访问者接口:定义接受不同数据结构的访问方法
- 数据结构的实现类
- 访问者接口实现类,实现不同访问策略
- 访问者模式优缺点
- 优点:
- 符合单一职责原则
- 优秀的扩展性
- 灵活性
- 缺点:
- 具体元素对访问者公布细节,违反了迪米特原则
- 具体元素变更比较困难
- 违反了依赖倒置原则,依赖了具体类,没有依赖抽象
- 优点:
- 访问者模式实现
- 数据结构接口:
/** * 数据结构接口,抽象接受访问者的方法 */ public interface ComputerPart { public void accept(ComputerPartVisitor computerPartVisitor); }
- 访问者接口
package com.fg.java.Visitor; /** * 访问者抽象类,重载方法,根据不同的数据结构实现不同的访问策略 */ public interface ComputerPartVisitor { public void visit(Computer computer); public void visit(Mouse mouse); public void visit(Keyboard keywords); public void visit(Monitor monitor); }
- 数据接口的实现类
package com.fg.java.Visitor; /** * 定义数据结构 */ public class Computer implements ComputerPart{ ComputerPart parts []; public Computer( ) { this.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); } }
package com.fg.java.Visitor; public class Keyboard implements ComputerPart { public Keyboard() { } public void accept(ComputerPartVisitor computerPartVisitor) { computerPartVisitor.visit(this); } }
package com.fg.java.Visitor; public class Monitor implements ComputerPart{ public void accept(ComputerPartVisitor computerPartVisitor) { computerPartVisitor.visit(this); } }
package com.fg.java.Visitor; public class Mouse implements ComputerPart { public void accept(ComputerPartVisitor computerPartVisitor) { computerPartVisitor.visit(this); } }
- 访问者接口实现类
package com.fg.java.Visitor; /** * 访问者实现方法,实现不同的访问策略 */ public class ComputerPartDisplayVisitor implements ComputerPartVisitor { public void visit(Computer computer) { System.out.println("computer"); } public void visit(Mouse mouse) { System.out.println("mouse"); } public void visit(Keyboard keywords) { System.out.println("keywords"); } public void visit(Monitor monitor) { System.out.println("monitor"); } }
- 数据结构接口:
- 个人介绍:
- 访问者模式让我们可以根据不同的数据结构实现不同的访问策略