从抽象返回具体结果的软件模式

问题描述

因此,我正在尝试找出如何(或什至有可能)将具有某些非常规要求的特定软件体系结构组合在一起。该体系结构具有服务层以及可能使用该服务层的多个客户端层。

我想让服务层接受一个抽象,并以客户机层定义的具体实现返回一个抽象,使得客户机可以在服务层不了解的情况下获得所需的任何特定结果。所需的输出类型。

我可以使用泛型或标记接口和直接转换结果来解决此问题,但是这两者对于我的目标而言都不是最理想的,我希望这里的人会缺少我的灵感。

这是正在运行的抽象的总体结构的粗略示例,但是如果有合适的解决方案需要,则可以进行修订:

interface IServiceResult {
    // No idea what methods this should have yet
}

interface IServiceHandler {
    IServiceResult CouldNotFindFile();
    IServiceResult CouldNotReadFile();
    IServiceResult ServiceSuccessful();
}

interface IService {
    IServiceResult PerformService(IServiceHandler outcomes);
}

// Console Client Code:
IService service = new Service();
IServiceHandler handler = new ConsoleServiceHandler();
IServiceResult result = service.PerformService(handler);
/* Some process to convert IServiceResult to text to display in the console */

// API Endpoint Client Code:
IService service = new Service();
IServiceHandler handler = new ApiServiceHandler();
IServiceResult result = service.PerformService(handler);
/* Some process to convert IServiceResult to Http Status Code to return to client */

我的直觉是使用IServiceResult进行某种双重调度,但是从那时起,我无法解决/如何最终获得所需的结果。任何见解将不胜感激。

解决方法

您要执行的操作的问题是resulthandler的具体类型需要对应,并且语言的类型系统中没有一种表达这种约束的方法。如果您尝试使用双重调度,那么最终会得到一个接口,该接口具有每种具体类型的方法,并且很难维护。

首先使用不需要该约束的设计会更好。

您可以完全放弃IServiceResult来简化界面并避免此问题

interface IServiceResponder {
    void CouldNotFindFile();
    void CouldNotReadFile();
    void ServiceSuccessful();
}

interface IService {
    void PerformService(IServiceResponder responseTarget);
}

// Console Client Code:
IService service = new Service();
// this will print the response to the console when it is set
IServiceResponder responder = new ConsoleServiceResponder();
service.PerformService(responder);

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...