我正在做一个项目,需要调用许多不同的服务,并希望尽可能多地抽象出公共逻辑。问题是我还想返回自定义对象,而不是像JSON这样的东西。当我设计了一种这样做的方法时,我得到了一个范例,它让我想起了一个策略模式,但我认为它不太合适。我想知道在我做这件事的过程中是否有任何设计缺陷或危险。
基本上,我已经创建了一个抽象类(serviceCall
),它包含调用服务的公共逻辑(拥有一个internet客户机并从所需服务获得json响应)。这都是通过公共方法调用(map
来完成的。抽象类还定义了两个抽象方法:createCustomDTo(Map
和parseresponsetoObject(String json)
。我会在一秒钟内解释这些的目的。
将使用扩展ServiceCall
并创建抽象方法实现的类创建对不同服务的每次调用。createCustomDTo
将创建一个自定义对象,该对象包含调用服务所需的所有信息(url和头)。parseresponsetoobject
将接受一个json响应,并将其转换为我稍后要在代码中使用的Java对象。
下面是我所做的一个简单实现
服务所有
public abstract class ServiceCall {
protected abstract Object parseResponseToObject(String json);
protected abstract CustomServiceDTO createDTO(Map<String, String> keys,
Map<String, String> headers);
public Object call(Map<String, String> params, Map<String, String> headers) {
// create and configure a CustomServiceDTO to call services with
CustomServiceDTO dto = createDTO(params, headers);
try {
// make the service request
String json = getServiceResponse(dto);
catch (Exception e) {
return new CustomServiceError(e);
}
// parse the response into the desired java object
Object response = parseResponseToObject(json);
return response;
}
private String getServiceResponse(CustomServiceDTO dto) {
// use common logic to call the service using the information provided
// by the dto
String dummyResponse = "{\"prop\":\"value\"}";
return dummyResponse;
}
}
采样实现
public class AddressCall extends ServiceCall {
@Override
protected Object parseResponseToObject(String json) {
return new Address(json);
}
@Override
protected CustomServiceDTO createDTO(Map<String, String> keys,
Map<String, String> headers) {
CustomServiceDTO dto = new CustomServiceDTO();
dto.setUrl("www.getMyDummyAddress.com/" + keys.get(0) + "=" + keys.get(1));
dto.setHeaders(headers);
return dto;
}
}
我看到的主要缺点是从来不直接调用createCustomdTo
和parseresponsetoObject
有点奇怪。
对我来说,它的主要优点是易于使用,并且可以将我的响应作为Java对象返回。
我真正想知道的是,这种范式还有其他的顾虑或弊端吗?它在代码中很好,但我承认它似乎有点不同于Java的正常使用方式。
这与通常使用Java的方式没有什么不同,这被称为模板方法设计模式。
除了Object的使用外,它很常见,最好用泛型类型代替。
主要内容:介绍,实现,Strategy.java,OperationAdd.java,OperationSubtract.java,OperationMultiply.java,Context.java,StrategyPatternDemo.java在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 contex
策略模式 亦称: Strategy 意图 策略模式是一种行为设计模式, 它能让你定义一系列算法, 并将每种算法分别放入独立的类中, 以使算法的对象能够相互替换。 问题 一天, 你打算为游客们创建一款导游程序。 该程序的核心功能是提供美观的地图, 以帮助用户在任何城市中快速定位。 用户期待的程序新功能是自动路线规划: 他们希望输入地址后就能在地图上看到前往目的地的最快路线。 程序的首个版本只能规划公
把不变的部分和变化的部分隔开是每个设计模式的主题。 条条大路通罗马。我们经常会遇到解决一件事情有多种方案,比如压缩文件,我们可以使用zip算法、也可以使用gzip算法。其灵活多样,我们可以采用策略模式解决。 一、定义 定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。 基于策略类模式的程序至少由两部分组成。第一个部分是一组策略类,策略类封装了具体的算法,并负责具体的计算过程。第二个部
在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。 介绍 意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。 主要解决:在有多种算法相似的情况下,使用 if...
问题 解决问题的方式有多种,但是你需要在程序运行时选择(或是转换)这些方法。 解决方案 在策略对象(Strategy objects)中封装你的算法。 例如,给定一个未排序的列表,我们可以在不同情况下改变排序算法。 基类 StringSorter = (algorithm) -> sort: (list) -> algorithm list 策略 bubbleSort = (list) -
应用场景 一个商场收银软件,营业员根据客户所购买的商品的单价和数量,向客户收费 用两个文本框来输入单价和数量,一个确定按钮来算出每种商品的费用,用个列表框来记录商品的清单,一个标签来记录总计,一个重置按钮来重新开始。 double total = 0.0d; private void btn0k_Click(object sender, EventArgs e) { double