Java 访问者设计模式


前言:

     访问者模式,是行为型设计模式之一。访问者模式是一种将数据操作与数据结构分离的设计模式,它可以算是 23 中设计模式中最复杂的一个,但它的使用频率并不是很高,大多数情况下,你并不需要使用访问者模式,但是当你一旦需要使用它时,那你就是需要使用它了。

     当我们想要在不改变类的情况下为对象结构的类定义新操作时,我们使用访问者模式。想象一下,对API执行HTTP请求的软件场景。大多数HTTP API都有一定的限制,允许每分钟执行一定数量的请求。我们可能有一个不同的类来执行请求,并且还考虑了与它们交互的API的业务逻辑。

如果我们想要检查这些调用并打印一些信息或将请求相关信息保存到数据库,那么访问者模式可能非常合适。

访问接口:

public interface Visitor {
}

这个接口不会指定任何方法; 但扩展它的接口将包含访问特定类型的方法。我们这样做是为了能够实现松散耦合的访问者实现(甚至是基于组合的访问者)。然后我们将实现可访问的接口。


public interface Visitable<T extends Visitor> {
     void accept(T visitor);
}

请求执行类:

public class LocationRequestExecutor implements Visitable<LocationVisitor> {
    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;
    }
}

public class RouteRequestExecutor implements Visitable<RouteVisitor> {
    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;
    }
}

我们将为这些类型的执行程序添加访问者接口:


public interface LocationVisitor extends Visitor {
    void visit(LocationRequestExecutor locationRequestExecutor);
}

public interface RouteVisitor extends Visitor {
    void visit(RouteRequestExecutor routeRequestExecutor);
}

创建一个实现上述接口的访问者:


public class RequestVisitor implements LocationVisitor, RouteVisitor {
    @Override
    public void visit(LocationRequestExecutor locationRequestExecutor) {
    }
    @Override
    public void visit(RouteRequestExecutor routeRequestExecutor) {
    }
}

exec:


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);
    }
}

原文地址:https://dzone.com/articles/behavioural-design-patterns-visitor


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值