设计模式:Visitor--访问者模式

    xiaoxiao2022-07-13  180

    访问者模式

    访问者模式把数据结构和作用于结构上的操作解耦合,使得操作集合可相对自由地演化。访问者模式适用于数据结构相对稳定算法又易变化的系统。因为访问者模式使得算法操作增加变得容易。访问者模式的优点是增加操作很容易,因为增加操作意味着增加新的访问者。

    简单来说,访问者模式就是一种分离对象数据结构与行为的方法,通过这种分离,可达到为一个被访问者动态添加新的操作而无需做其它的修改的效果。简单关系图:

     

    实例代码一:

    //访问者 public interface Visitor { public void visit(Subject subject); } ****************************************************************** public class MyVisitor implements Visitor { @Override public void visit(Subject subject) { System.out.println("visitor the Subject:"+subject.getSubject()); } } ****************************************************************** /** * 被访问者 */ public interface Subject { public void accept(Visitor visitor); public String getSubject(); } ****************************************************************** public class MySubject implements Subject{ @Override public void accept(Visitor visitor) { visitor.visit(this); } @Override public String getSubject() { return "shanshan"; } } ****************************************************************** /** *访问者模式 * 该模式适用场景:如果我们想为一个现有的类增加新功能,不得不考虑几个事情: * 1、新功能会不会与现有功能出现兼容性问题? * 2、以后会不会再需要添加? * 3、如果类不允许修改代码怎么办? * 面对这些问题,最好的解决方法就是使用访问者模式,访问者模式适用于数据结构相对稳定的系统,把数据结构和算法解耦, */ public class MainClass { public static void main(String[] args) { MySubject subject = new MySubject(); MyVisitor visitor = new MyVisitor(); //访问者visitor开始访问被访问者subject subject.accept(visitor); } } ****************************************************************** 测试结果: visitor the Subject:shanshan

     

    实例代码二: 

    public interface Visitor { public void visit(Park park); public void visit(ParkA parkA); public void visit(ParkB parkB); } ******************************************************** public class VisitorA implements Visitor{ @Override public void visit(Park park) { } @Override public void visit(ParkA parkA) { System.out.println("负责公园A区域卫生"); } @Override public void visit(ParkB parkB) { } } ******************************************************** public class VisitorB implements Visitor { @Override public void visit(Park park) { } @Override public void visit(ParkA parkA) { } @Override public void visit(ParkB parkB) { System.out.println("负责公园B区域卫生"); } } ******************************************************** public class VisitorManager implements Visitor { @Override public void visit(Park park) { System.out.println("管理员:负责公园卫生检查"); } @Override public void visit(ParkA parkA) { System.out.println("管理员:负责公园A区域卫生检查"); } @Override public void visit(ParkB parkB) { System.out.println("管理员:负责公园B区域卫生检查"); } } ******************************************************** /** * 公园每一部分的抽象 */ public interface ParkElement { //用来接纳访问者 public void accept(Visitor visitor); } ******************************************************** /** * 公园A */ public class ParkA implements ParkElement{ @Override public void accept(Visitor visitor) { visitor.visit(this); } } ******************************************************** public class ParkB implements ParkElement { @Override public void accept(Visitor visitor) { visitor.visit(this); } } ******************************************************** public class Park implements ParkElement{ private ParkA parkA; private ParkB parkB; @Override public void accept(Visitor visitor) { visitor.visit(this); visitor.visit(parkA); visitor.visit(parkB); } } ******************************************************** public class MainClass { public static void main(String[] args) { Park p = new Park(); Visitor visitorA = new VisitorA(); p.accept(visitorA); Visitor visitorB = new VisitorB(); p.accept(visitorB); Visitor visitorM = new VisitorManager(); p.accept(visitorM); } } ******************************************************** 测试结果: 负责公园A区域卫生 负责公园B区域卫生 管理员:负责公园卫生检查 管理员:负责公园A区域卫生检查 管理员:负责公园B区域卫生检查

     

    最新回复(0)