当前位置: 首页 > 后端技术 > Java

访问者模式

时间:2023-04-01 19:25:33 Java

在类内部结构不变的情况下,不同的访问者访问这个对象会有不同的效果。访问者模式有以下几个角色元素类:它是一个抽象类或接口,它定义了一个接受访问者的抽象方法,使得每个元素都可以被访问者访问到。具体元素:继承或实现元素类,实现接收方法。Visitor:一般是一个抽象类,里面包含了可以访问每个具体元素的方法,让访问者访问每个具体元素(一般有几个具体元素,就会有几个这样的方法,这些方法的方法名就是相同而参数不同,参数都是具体元素,所以一般来说,具体元素的类型应该是相对固定的)。Specificvisitor:访问者的具体实现。比如我们把景区定义为一个元素类,把西湖、长城定义为一个具体的元素类,游客就是游客的抽象。那么游客A和游客B就是特定游客。景区类中的接收方法参数之一是游客类型。由于多态的特点,我们可以传入旅游者A、旅游者B等子类。Tourist类中会有多个访问方法,方法名相同,参数不同,分别是具体的元素类,如西湖、长城。具体景区-西湖会在父类中实现接收抽象方法,然后在方法中调用传入游客对象的访问方法,参数设置为this,即西湖类的对象,相当于调用了参数为西湖的Tourist类中的access方法。具体的类图如下。下面使用了一个类似的例子。国家领导人进行国际访问,实现代码实现元素类——countrypublicabstractclassCountry{privateStringcapital;公共国家(字符串资本){this.capital=capital;}publicStringgetCapital(){返还资本;}abstractvoidaccept(NationalLeaderleader);}具体元素类——美国、日本publicclassAmericaextendsCountry{publicAmerica(Stringcapital){super(capital);}@Overridepublicvoidaccept(NationalLeaderleader){leader.visit(this);}}publicclassJapanextendsCountry{publicJapan(Stringcapital){super(capital);}@Overridepublicvoidaccept(NationalLeaderleader){leader.visit(this);}访客-国家领导人公共界面NationalLeader{voidvisit(Americaamerica);无效访问(日本日本);//也可以访问中国,巴西,法国,英国.....访问的一般是固定不变的,访问者可以是任何人,相对灵活}具体访问者-普京公共类普京实现NationalLeader{@覆盖公共无效访问(美国美国){System.out.println("普京抵达美国首都"+america.getCapital());}@Overridepublicvoidvisit(Japanjapan){System.out.println("普京抵达日本首都"+japan.getCapital());}}测试公共类VisitorTest{@Testpublicvoidtest(){Countryamerica=newAmerica("Washington");america.accept(新普京());国家日本=新日本(“东京”);日本。接受(新普京());}}=====结果=====普京到达美国首都华盛顿普京到达日本首都东京优点:制作数据结构(元素类)和结构上的操作(visitor)解耦,使得操作集可以独立变化,方便灵活添加操作(访问者)。将对单个元素的一组操作集中到单个访问者类中。可以跨越类层次结构,访问不同层次的元素类,并进行相应的操作。缺点:添加新元素可能非常困难。实现起来比较复杂,会增加系统的复杂度。打破封装,如果将访问行为放在每个元素中,可能不会暴露元素的内部结构和状态,但是在使用访问者模式时,为了让访问者获得他关心的信息,元素类必须公开一些内部状态和结构,如收入和支出类,必须提供访问列表的金额和项目的方法。适用:数据结构稳定,对数据结构的操作频繁变化时。当一些元素类需要负责一个数据结构中不相关的操作时,为了分离这些操作,减少这些元素类的职责,可以使用访问者模式。有时在对数据结构的元素进行操作时,需要区分具体的类型。这时候使用访问者模式可以针对不同的类型在访问者类中定义不同的操作,从而去掉类型判断。