Tag: design patterns

在哪些情况下使用工厂类而不是静态函数是有意义的?

目前我已经创建了一个ABCFactory类,它有一个创建ABC对象的方法。 现在我想起来了,也许不是有工厂,我可以在我的ABC方法中制作一个静态方法。 进行此项更改的专业人士和合作伙伴是什么? 它不会导致相同吗? 我没有预见到其他类会inheritanceABC,但是我从来不知道! 谢谢

使用ActiveMQ,Camel和Spring实现Request-Reply模式

我正在尝试实现以下function: 然后逐行读取CSV文件: 根据该行包含的值构建请求 将请求发送到消息队列 其他组件需要接收消息,处理请求并将响应发送到另一个消息队列(生产者已知,因此生产者可以获取响应)。 我相信请求 – 回复模式适合该法案。 我安装了ActiveMQ,下载了camel并尝试使用他们的jms项目。 配置组件,队列和测试连接(工作)后,我试图弄清楚实际上如何实现请求 – 回复? 我没有找到任何好的例子 我有一个RouteBuilder RouteBuilder public class MyRouteBuilder extends RouteBuilder { public static void main(String[] args) throws Exception { new Main().run(args); } public void configure() { from(“file:src/data?noop=true”) .to(“activemq:RequestQ”); from(“activemq:RequestQ?exchangePattern=InOut&timeToLive=5000”) .inOut(“activemq:RequestQ”, “bean:myBean?method=someMethod”); } } 骆驼的context.xml org.apache.camel.example.spring 问题: 如何读取文件逐行构造并根据行内容发布消息? 如何配置路由以及如何配置邮件头以便在获取响应后将被删除的临时队列中获取响应? 您可以推荐哪些快速入门指南? 编辑 我得到了下面的代码。 现在让我们说在处理器中我创建响应。 我该如何寄回? 我该如何使用响应? public […]

理解单一责任原则

我很困惑如何确定单个方法是否有一个责任,就像清洁代码一书中的以下代码一样 public Money calculatePay(Employee e) throws InvalidEmployeeType { switch (e.type) { case COMMISSIONED: return calculateCommissionedPay(e); case HOURLY: return calculateHourlyPay(e); case SALARIED: return calculateSalariedPay(e); default: throw new InvalidEmployeeType(e.type); } } 正如作者在这段代码中所说:“…… 显然不止一件事。第三,它违反了单一责任原则(SRP),因为改变它的原因不止一个。 ” 乍一看我的代码我在想这个方法如何违反SRP,因为如果代码发生了变化,那么只有当有一个添加的员工类型但是我试图理解方法时才会成为switch语句我进一步想出了为什么它违反了上述原则。 我的假设是,由于方法的名称是calculatePay(Employee e) ,因此该方法的唯一责任是支付计算,因为方法的名称建议但是因为在方法内部有一个filter过滤Employee的类型这个过滤现在是一个不同的或另一个责任,因此违反了SRP。 我不知道我是否做对了。

Struts中的控制器

什么是MVC中的控制器? 是struts.xml还是Servlet (Action Class)? 我们的应用程序中可以有多个Controller吗? 拥有多个控制器是一种好习惯吗?

Java Pattern类没有公共构造函数,为什么?

我一直在审查Java Regex Library,感到惊讶的是Pattern类没有我多年来认为理所当然的公共构造函数。 我怀疑静态compile方法被用于支持构造函数的一个原因可能是构造函数总是返回一个新对象,而静态方法可能返回一个先前创建的(和缓存的)对象,前提是模式字符串是相同的。 但是,如下所示,情况并非如此。 public class PatternCompiler { public static void main(String[] args) { Pattern first = Pattern.compile(“.”); Pattern second = Pattern.compile(“.”); if (first == second) { System.out.println(“The same object has been reused!”); } else { System.out.println(“Why not just use constructor?”); } } } 使用静态方法而不是构造函数的任何其他强有力的理由? 编辑 :我在这里找到了一个相关的问题 。 那里的答案都没有说服我。 通过阅读所有答案,我感觉静态方法相对于公共构造函数在创建对象方面具有相当多的优势,而不是相反。 真的吗? 如果是这样,我将为我的每个类创建这样的静态方法,并安全地假设它更具可读性和灵活性。

如何在将数据发送到另一个应用程序时实施重试策略?

我正在处理我的应用程序,它将数据发送到zeromq 。 以下是我的应用程序: 我有一个SendToZeroMQ类, SendToZeroMQ数据发送到zeromq。 将相同的数据添加到同一个类中的retryQueue ,以便以后可以在未收到确认的情况下重试。 它使用带有maximumSize限制的guava缓存。 有一个单独的线程从zeromq接收先前发送的数据的确认,如果没有收到确认,则SendToZeroMQ将重试发送相同的数据。 如果收到确认,那么我们将从retryQueue删除它,以便不能再次重试。 想法非常简单,我必须确保我的重试策略正常工作,这样我就不会丢失数据。 这是非常罕见的,但如果我们没有收到acknolwedgements。 我正在考虑构建两种类型的RetryPolicies但我无法理解如何在这里构建与我的程序相对应的: RetryNTimes:在此期间,它将在每次重试之间以特定睡眠重试N次,之后,它将删除记录。 ExponentialBackoffRetry:在此它将指数级地继续重试。 我们可以设置一些最大重试限制,然后它将不会重试并将丢弃记录。 下面是我的SendToZeroMQ类,它将数据发送到zeromq,也从后台线程每30秒重试一次,并启动可持续运行的ResponsePoller runnable: public class SendToZeroMQ { private final ScheduledExecutorService executorService = Executors.newScheduledThreadPool(5); private final Cache retryQueue = CacheBuilder .newBuilder() .maximumSize(10000000) .concurrencyLevel(200) .removalListener( RemovalListeners.asynchronous(new CustomListener(), executorService)).build(); private static class Holder { private static final SendToZeroMQ INSTANCE = new SendToZeroMQ(); } […]

在Spring中实现CrudRepository。 我应该遵循的最佳设计是什么?

我有来自CrudRepository的User Repository扩展,如下所示 public interface UserRepository extends CrudRepository, DatatablesCriteriasRepository DatatablesCriteriasRepository有一个函数需要单独为不同的存储库实现。 所以我创建了这样的存储库实现类。 在impl包中。 public class UserRepositoryImpl implements DatatablesCriteriasRepository 请注意,这只是为了实现DatatablesCriteriasRepository的函数。 我不想覆盖框架中CrudRepository提供的默认function。 但是,如果我这样做,它将更适合代码设计,因为UserRepositoryImpl实际上实现了UserRepository ,顾名思义。 public class UserRepositoryImpl implements UserRepository 但是这又会迫使我扩展UserRepository接口中的所有函数。 如何通过良好的代码设计解决这个问题? UserRepositoryImpl在实现DatatablesCriteriasRepository是否具有此名称?

使用RXJava进行缓存处理

我正在尝试用rxJava实现这个工作流程,但我确定我是在滥用还是做错了。 用户要求登录 如果loginResult在缓存中可用,则“发出”缓存的LoginResult 实际上,如果一切都成功,则实际执行对Web服务的请求并缓存结果 如果发生错误,则最多重试3次,如果有第4次,则清除缓存。 这是我完整的代码片段。 public class LoginTask extends BaseBackground { private static CachedLoginResult cachedLoginResult = new CachedLoginResult(); private XMLRPCClient xmlrpcClient; private UserCredentialsHolder userCredentialsHolder; @Inject public LoginTask(XMLRPCClient client, UserCredentialsHolder userCredentialsHolder) { this.xmlrpcClient = client; this.userCredentialsHolder = userCredentialsHolder; } @Override public LoginResult performRequest() throws Exception { return UserApi.login( xmlrpcClient, userCredentialsHolder.getUserName(), userCredentialsHolder.getPlainPassword()); } @Override public Observable […]

Java可扩展枚举

有没有办法编写可以扩展的枚举。 我有几种方法可以随时提供给我的枚举。 例如,我对我的数据库字段使用枚举。 我在数据库中包含实际的字段名称。 public enum ORDERFIELDS { OrderID(“Order_ID”); private String FieldName; private ORDERFIELDS(String fname) { this.FieldName = fname; } public String getFieldName() { return FieldName; } }

在spring mvc控制器中使用Services和DAO

我正在构建一个Web应用程序,主要构成来自后端/数据库的数据的CRUD操作。 在某些情况下,我必须编写业务逻辑(我确信随着我们深入开发,我们将构建更多业务逻辑)。 目前,我创建的每个UI屏幕都创建了一个模型类,Service类,DAO类,一个控制器(本质上是它的servlet)和一堆jsp页面。 在大多数情况下,服务类只是从DAO调用方法来传递模型对象。 基本上我们使用模型类来映射UI屏幕中的数据。 因此,控制器将在提交表单时填充模型对象。 我已经开始使用服务类来保持从Web层到DAO层的分离层。 但有时我觉得服务类只是添加不必要的API调用级别,我认为我可以将DAO注入Controller并更快地完成任务。 我想仅在需要执行其他业务逻辑时才使用服务类。 如果你必须设计一个应用程序,你考虑使用控制器 – > DAO vs controller-> Service-> DAO控制流程?