- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设有一个网站提供 API,如下所示:
GET
并POST
调用我现在拥有的看起来像这样:
public class Wrapper {
private AccessToken accessToken;
public Wrapper(...) {
//does some stuff
//gets access token:
getAccessToken(...);
}
public AccessToken getAccessToken(...) {
AccessToken result;
//gets access token, given the auth info provided as arguments
accessToken = result;
return result;
}
public ArrayList<Question> getQuestions(User user) {
//gets user's questions, using the accessToken field
//set's a user's questions field to the result and returns the result
}
public ArrayList<Answer> getAnswers(User user) {
//same as previous
}
public boolean sendMessage(User user) {
//sends a message, if current accessToken is strong
}
}
和用户类别:
class User {
private String username;
private ArrayList<Question> questions;
private ArrayList<Answer> answers;
public User(String username) {this.username=username;}
//getters and setters
}
因此,要使用它,您可以使用如下内容:
public class Main {
public static void main(String[] args) {
Wrapper wrapper = new Wrapper(...);
ArrayList<Question> questions = wrapper.getQuestions(new User("username"));
wrapper.sendMessage(new User("username2"));
}
}
我对此有疑问。
首先,User
类感觉是多余的,因为所有功能都在 Wrapper
类中。
其次,我想知道我的方法所做的是否正确 - 从设计的角度来看:在 getAccessToken
中,我两者都返回 AccessToken
并将Wrapper
的字段accessToken
设置为结果。这是正确的方法吗?或者方法应该仅返回访问 token ,然后将该结果显式分配给类的字段? getQuestions
和 getAnswers
方法也是如此:它们都获取ArrayList
,返回它们并 将用户
的字段分配给结果 - 全部在单个方法内。
我希望 User
类具有一定的意义。我想过这样做:
Wrapper wrapper = new Wrapper(...);
User user = new User("username");
user.getQuestions(wrapper.getAccessToken());
user.sendMessage(wrapper.getAccessToken());
因此,Wrapper
类只能充当获取访问 token 的位置,这感觉也不对。我可以将访问 token 功能放置在 User
类中并按如下方式使用它:
User user = new User("username", ...);
user.getQuestions();
user.sendMessage();
User
的构造函数将获取用户名和身份验证数据,获取访问 token 并将其存储在用户内部,然后在获取问题/答案或发送消息时使用它。我可以在 User
类 static
中设置 accessToken
字段,以便所有用户共享相同的 token 。
但是,网站 API 提供的某些操作与用户没有明显的联系:例如,获取网站 HitTest 门的问题。为此目的使用通用 Wrapper
类感觉是正确的,但这与之前的方法相矛盾。
我对此很陌生,只知道几种设计模式。也许有广泛的模式可用于解决此类问题?如有任何帮助/建议,我们将不胜感激。
最佳答案
您可以采取一些替代方案来解决您的问题,但可能没有一个比所有其他方案都更好。您选择的解决方案将取决于权衡以及您希望系统如何运行。以下是此类问题的两种常见解决方案。
拥有 Wrapper
生成 User
:而不是生成 User
与 Wrapper
分开的对象,您可以拥有Wrapper
生成User
目的。这允许 Wrapper
嵌入AccessToken
User
内没有任何外部客户端知道用户有 AccessToken
。例如,您可以使用以下 Wrapper
和User
定义:
public class Wrapper {
public Wrapper(...) {
// ... does some stuff, but DOES NOT get an access token ...
}
private AccessToken getAccessToken(...) {
AccessToken result;
// ... gets access token, given the auth info provided as arguments ...
return result;
}
public User findUser(String username, ...) {
return new User(username, getAccessToken(...));
}
}
class User {
private String username;
private final AccessToken token;
public User(String username, AccessToken token) {
this.user = user;
this.token = token;
}
// ... getters and setters ...
}
请注意getAccessToken
现在是private
,因为没有其他客户端需要访问此方法。 Wrapper
的所有方法继续接受User
参数,但他们现在应该通过调用 getToken
来获取访问 token 关于User
对象,而不是使用存储的 AccessToken
在Wrapper
。
另请注意 token
字段是 final
,因为访问 token 与 User
关联User
的整个生命周期中不应发生变化对象。
嵌入 Wrapper
在User
:这种技术与(1)类似,但它也嵌入了Wrapper
User
中的对象目的。这允许 User
类充当 Activity 对象,可以查询问题和答案,并可用于发送消息。由于 Wrapper
的所有方法接受User
论点,这是一个好兆头,表明这些方法应该移至 User
。下面是重构的中途点Wrapper
方法进入User
:
public class Wrapper {
public Wrapper(...) {
// ... does some stuff, but DOES NOT get an access token ...
}
private AccessToken getAccessToken(...) {
AccessToken result;
// ... gets access token, given the auth info provided as arguments ...
return result;
}
public User findUser(String username, ...) {
return new User(username, getAccessToken(...));
}
public ArrayList<Question> getQuestions(User user) {
//gets user's questions, using the accessToken field
//set's a user's questions field to the result and returns the result
}
public ArrayList<Answer> getAnswers(User user) {
//same as previous
}
public boolean sendMessage(User user) {
//sends a message, if current accessToken is strong
}
}
class User {
private String username;
private final AccessToken token;
private final Wrapper wrapper;
public User(String username, AccessToken token, Wrapper wrapper) {
this.user = user;
this.token = token;
this.wrapper = wrapper;
}
public List<Question> findQuestions() {
return wrapper.getQuestions(this);
}
public ArrayList<Answer> findAnswers() {
return wrapper.getAnswers(this);
}
public boolean sendMessage() {
return wrapper.sendMessage(this);
}
// ... getters and setters ...
}
使用这种技术,客户现在可以直接从 User
获取问题和答案。目的。请注意 findQuestions
和findAnswers
方法以 find
开头。这会提示客户端此调用可能是一个长调用(与 getQuestions
或 getAnswers
相反,这会让客户端认为它是一个简单的 getter 并且该方法将几乎立即返回)。这些方法执行远程调用的事实也应该记录在这些方法的 Java 文档中。如果调用需要很长时间,这些方法应该返回 Future
(或类似的对象)并异步制作。
如果您想全力进行重构,您可以将所有实现细节从Wrapper
移走。类到 User
类:
public class Wrapper {
public Wrapper(...) {
// ... does some stuff, but DOES NOT get an access token ...
}
private AccessToken getAccessToken(...) {
AccessToken result;
// ... gets access token, given the auth info provided as arguments ...
return result;
}
public User findUser(String username, ...) {
return new User(username, getAccessToken(...));
}
}
class User {
private String username;
private final AccessToken token;
private final Wrapper wrapper;
public User(String username, AccessToken token, Wrapper wrapper) {
this.user = user;
this.token = token;
this.wrapper = wrapper;
}
public List<Question> findQuestions() {
// ... find the questions remotely ...
}
public ArrayList<Answer> findAnswers() {
// ... find the answers remotely ...
}
public boolean sendMessage() {
// ... send message remotely ...
}
// ... getters and setters ...
}
这可能不是最好的方法,因为将访问远程 API 的详细信息保留在 Wrapper
中可能是更好的主意。类(class)。这是一个判断,取决于您的具体应用程序的性质。
您还可以使用许多其他技术,但以上两种是解决您要解决的问题的常见方法。
关于java - Java中的第三方API包装器: how to design,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55131566/
我之前让 dll 注入(inject)器变得简单,但我有 Windows 7,我用 C# 和 C++ 做了它,它工作得很好!但是现在当我在 Windows 8 中尝试相同的代码时,它似乎没有以正确的方
我正在尝试制作一个名为 core-splitter 的元素,该元素在 1.0 中已弃用,因为它在我们的项目中起着关键作用。 如果您不知道 core-splitter 的作用,我可以提供一个简短的描述。
我有几个不同的蜘蛛,想一次运行所有它们。基于 this和 this ,我可以在同一个进程中运行多个蜘蛛。但是,我不知道如何设计一个信号系统来在所有蜘蛛都完成后停止 react 器。 我试过了: cra
有没有办法在达到特定条件时停止扭曲 react 器。例如,如果一个变量被设置为某个值,那么 react 器应该停止吗? 最佳答案 理想情况下,您不会将变量设置为一个值并停止 react 器,而是调用
https://code.angularjs.org/1.0.0rc9/angular-1.0.0rc9.js 上面的链接定义了外部js文件,我不知道Angular-1.0.0rc9.js的注入(in
我正在尝试运行一个函数并将服务注入(inject)其中。我认为这可以使用 $injector 轻松完成.所以我尝试了以下(简化示例): angular.injector().invoke( [ "$q
在 google Guice 中,我可以使用函数 createInjector 创建基于多个模块的注入(inject)器。 因为我使用 GWT.create 在 GoogleGin 中实例化注入(in
我在 ASP.NET Core 1.1 解决方案中使用配置绑定(bind)。基本上,我在“ConfigureServices Startup”部分中有一些用于绑定(bind)的简单代码,如下所示: s
我在 Spring MVC 中设置 initBinder 时遇到一些问题。我有一个 ModelAttribute,它有一个有时会显示的字段。 public class Model { privat
我正在尝试通过jquery post发布knockoutjs View 模型 var $form = $('#barcodeTemplate form'); var data = ko.toJS(vm
如何为包含多态对象集合的复杂模型编写自定义模型绑定(bind)程序? 我有下一个模型结构: public class CustomAttributeValueViewModel { publi
您好,我正在尝试实现我在 this article 中找到的扩展方法对于简单的注入(inject)器,因为它不支持开箱即用的特定构造函数的注册。 根据这篇文章,我需要用一个假的委托(delegate)
你好,我想自动注册我的依赖项。 我现在拥有的是: public interface IRepository where T : class public interface IFolderReposi
我正在使用 Jasmine 测试一些 Angular.js 代码。为此,我需要一个 Angular 注入(inject)器: var injector = angular.injector(['ng'
我正在使用 Matlab 代码生成器。不可能包含代码风格指南。这就是为什么我正在寻找一个工具来“ reshape ”、重命名和重新格式化生成的代码,根据我的: 功能横幅约定 文件横幅约定 命名约定 等
这个问题在这里已经有了答案: Where and why do I have to put the "template" and "typename" keywords? (8 个答案) 关闭 8
我开发了一种工具,可以更改某些程序的外观。为此,我需要在某些进程中注入(inject)一个 dll。 现在我基本上使用这个 approach .问题通常是人们无法注入(inject) dll,因为他们
我想使用 swing、spring 和 hibernate 编写一个 java 应用程序。 我想使用数据绑定(bind)器用 bean 的值填充 gui,并且我还希望它反射(reflect) gui
我有这段代码,当两个蜘蛛完成后,程序仍在运行。 #!C:\Python27\python.exe from twisted.internet import reactor from scrapy.cr
要点是 Spring Batch (v2) 测试框架具有带有 @Autowired 注释的 JobLauncherTestUtils.setJob。我们的测试套件有多个 Job 类提供者。因为这个类不
我是一名优秀的程序员,十分优秀!