行为设计模式:访客

行为设计模式的最后一个模式将是访客模式。

当我们希望能够在不更改类的情况下为对象结构的类定义新操作时,使用访问者模式。

想象一下执行对api的http请求的软件的情况。 大多数http api都有一定的限制,并允许每分钟执行特定数量的请求。 我们可能有不同的类来执行请求,并且还要考虑与它们交互的api有关的业务逻辑。
如果我们要检查这些呼叫并打印一些信息或将与请求相关的信息持久保存到数据库,则访问者模式可能是一个很好的选择。

我们将从访客界面开始。

 package com.gkatzioura.design.behavioural.visitor;  public interface Visitor {  } 

该接口将不指定任何方法,但是对其进行扩展的接口将包含要访问的具有特定类型的方法。 我们这样做是为了使访问者实现(甚至是基于组合的访问者)具有松散耦合。

然后,我们将实现可访问的接口。

 package com.gkatzioura.design.behavioural.visitor;  public interface Visitable { 
      void accept(T visitor);  } 

基于上述内容,我们将创建可访问的请求执行类。

 package com.gkatzioura.design.behavioural.visitor;  public class LocationRequestExecutor implements Visitable { 
     private int successfulRequests = 0 ; 
     private double requestsPerMinute = 0.0 ; 
     public void executeRequest() { 
         /** 
          * Execute the request and change the successfulRequests and requestsPerMinute value 
          */ 
     } 
     @Override 
     public void accept(LocationVisitor visitor) { 
         visitor.visit( this ); 
     } 
     public int getSuccessfulRequests() { 
         return successfulRequests; 
     } 
     public double getRequestsPerMinute() { 
         return requestsPerMinute; 
     }  } 
 package com.gkatzioura.design.behavioural.visitor;  public class RouteRequestExecutor implements Visitable { 
     private int successfulRequests = 0 ; 
     private double requestsPerMinute = 0.0 ; 
     public void executeRequest() { 
         /** 
          * Execute the request and change the successfulRequests and requestsPerMinute value 
          */ 
     } 
     @Override 
     public void accept(RouteVisitor visitor) { 
         visitor.visit( this ); 
     } 
     public int getSuccessfulRequests() { 
         return successfulRequests; 
     } 
     public double getRequestsPerMinute() { 
         return requestsPerMinute; 
     }  } 

并且我们将为这些类型的执行者添加访客接口

 package com.gkatzioura.design.behavioural.visitor;  public interface LocationVisitor extends Visitor { 
     void visit(LocationRequestExecutor locationRequestExecutor);  } 
 package com.gkatzioura.design.behavioural.visitor;  public interface RouteVisitor extends Visitor { 
     void visit(RouteRequestExecutor routeRequestExecutor);  } 

最后一步是创建一个实现上述接口的访问者。

 package com.gkatzioura.design.behavioural.visitor;  public class RequestVisitor implements LocationVisitor, RouteVisitor { 
     @Override 
     public void visit(LocationRequestExecutor locationRequestExecutor) { 
     } 
     @Override 
     public void visit(RouteRequestExecutor routeRequestExecutor) { 
     }  } 

因此,让我们将它们放在一起。

 package com.gkatzioura.design.behavioural.visitor;  public class VisitorMain { 
     public static void main(String[] args) { 
         final LocationRequestExecutor locationRequestExecutor = new LocationRequestExecutor(); 
         final RouteRequestExecutor routeRequestExecutor = new RouteRequestExecutor(); 
         final RequestVisitor requestVisitor = new RequestVisitor(); 
         locationRequestExecutor.accept(requestVisitor); 
         routeRequestExecutor.accept(requestVisitor); 
     }  } 

而已! 您可以在github上找到源代码。

翻译自: https://www.javacodegeeks.com/2019/02/behavioural-design-patterns-visitor.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值