使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。
优点: 1、符合单一职责原则。2、优秀的扩展性。 3、灵活性。
缺点:1、具体元素对访问者公布细节,违反了迪米特原则。 2、具体元素变更比较困难。 3、违反了依赖倒置原则,依赖了具体类,没有依赖抽象。
应用:
对象结构中对象对应的类很少改变,但经常需要在此对象结构上定义新的操作。
/**
* @ClassName IComputerPart
* @Description 元素接口
* @author llyilo
* @Date 2018年3月23日 上午10:22:02
* @version 1.0.0
*/
public interface IComputerPart {
public void accept(IComputerPartVisitor computerPartVisitor);
}
public class KeyboardImpl implements IComputerPart {
@Override
public void accept(IComputerPartVisitor computerPartVisitor) {
computerPartVisitor.visit(this);
}
}
public class MonitorImpl implements IComputerPart {
@Override
public void accept(IComputerPartVisitor computerPartVisitor) {
System.out.println("monitor");
computerPartVisitor.visit(this);
}
}
public class MouseImpl implements IComputerPart{
@Override
public void accept(IComputerPartVisitor computerPartVisitor) {
computerPartVisitor.visit(this);
}
public String toString(){
return "mouse";
}
}
public class ComputerImpl implements IComputerPart {
IComputerPart[] parts;
public ComputerImpl() {
parts = new IComputerPart[] { new MouseImpl(), new KeyboardImpl(), new MonitorImpl() };
}
@Override
public void accept(IComputerPartVisitor computerPartVisitor) {
for (int i = 0; i < parts.length; i++) {
parts[i].accept(computerPartVisitor);
}
computerPartVisitor.visit(this);
}
}
/**
* @ClassName IComputerPartVisitor
* @Description 访问者接口
* @author llyilo
* @Date 2018年3月23日 上午10:08:35
* @version 1.0.0
*/
public interface IComputerPartVisitor {
public void visit(ComputerImpl computer);
public void visit(MouseImpl mouse);
public void visit(KeyboardImpl keyboard);
public void visit(MonitorImpl monitor);
}
/**
* @ClassName ComputerPartDisplayVisitorImpl
* @Description 访问者实体类
* @author llyilo
* @Date 2018年3月23日 上午10:09:17
* @version 1.0.0
*/
public class ComputerPartDisplayVisitorImpl implements IComputerPartVisitor {
@Override
public void visit(ComputerImpl computer) {
System.out.println("Displaying Computer.");
}
@Override
public void visit(MouseImpl mouse) {
String s = mouse.toString();
System.out.println("Displaying Mouse." + s);
}
@Override
public void visit(KeyboardImpl keyboard) {
// TODO Auto-generated method stub
System.out.println("Displaying Keyboard.");
}
@Override
public void visit(MonitorImpl monitor) {
// TODO Auto-generated method stub
System.out.println("Displaying Monitor.");
}
}
public class Test {
public static void main(String[] args) {
IComputerPart computer = new ComputerImpl();
computer.accept(new ComputerPartDisplayVisitorImpl());
}
}