访客模式 无痕模式 区别
行为设计模式的最后一个模式将是访客模式。
当我们希望能够在不更改类的情况下为对象结构的类定义新操作时,使用访问者模式。
想象一下执行对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
访客模式 无痕模式 区别