设计模式-访问者模式
1.定义
当外部需要访问一个组合系统中所有对象的状态时,可以定义一个访问者类,通过访问者类访问组合系统中所有对象的状态,外部系统只需要对接访问者类即可获取到组合系统中所有对象的状态
2.使用场景及设计
2.1.使用场景
- 对象结构中对象对应的类很少改变,但经常需要在此对象结构上定义新的操作。
- 需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作"污染"这些对象的类,也不希望在增加新操作时修改这些类.
2.2.设计
定义一个访问者接口Visitor和实现类ConcreteVisitor,定义一个Computer对象,其中有Keyboard类、Monitor类、Mouse类等组件,且都继承Part接口。
类图如下:
3.测试代码
入口代码
package com.glt.designpattern.visitor;
public class InitMain {
public static void main(String[] args) {
Computer computer = new Computer();
Visitor v = new ConcreteVisitor();
computer.accept(v);
}
}
访问者接口
package com.glt.designpattern.visitor;
public interface Visitor {
public void visitor(Computer computer);
public void visitor(Keyboard keyboard);
public void visitor(Mouse mouse);
public void visitor(Monitor monitor);
}
访问者类
package com.glt.designpattern.visitor;
public class ConcreteVisitor implements Visitor {
@Override
public void visitor(Computer computer) {
System.out.println(" this is computer");
}
@Override
public void visitor(Keyboard keyboard) {
System.out.println(" this is keyboard");
}
@Override
public void visitor(Mouse mouse) {
System.out.println(" this is mouse");
}
@Override
public void visitor(Monitor monitor) {
System.out.println(" this is monitor");
}
}
Computer 类
package com.glt.designpattern.visitor;
public class Computer implements Part {
private Part[] parts;
public Computer() {
parts = new Part[]{new Keyboard(), new Monitor(), new Mouse()};
}
@Override
public void accept(Visitor visitor) {
for (Part part: parts) {
part.accept(visitor);
}
visitor.visitor(this);
}
}
组件类
package com.glt.designpattern.visitor;
public class Keyboard implements Part{
public void accept(Visitor visitor){
visitor.visitor(this);
}
}
package com.glt.designpattern.visitor;
public class Monitor implements Part{
public void accept(Visitor visitor){
visitor.visitor(this);
}
}
package com.glt.designpattern.visitor;
public class Mouse implements Part{
public void accept(Visitor visitor){
visitor.visitor(this);
}
}
组件接口类
package com.glt.designpattern.visitor;
public interface Part {
public void accept(Visitor visitor);
}
输入如下:
this is keyboard
this is monitor
this is mouse
this is computer
4.总结
优点:
- 允许对组合结构中加入新的操作,无需修改结构本身
- 想要加入新操作比较容易
- 访问者所进行的操作代码集中在一起,方便管理
缺点:
访问者会打破组合的封装