Tag: design patterns

在java中,可以创建一个流畅的可扩展类层次结构,其中的方法可以按任何顺序调用吗?

可以在java中创建一个可扩展的类层次结构,其方法流畅且可以按任何顺序调用吗? (是的!请参阅下面的答案),即使对于现有的课程,如果您无法访问源代码,只要方法是流畅的! 我正在改造现有的层次结构,并希望使用工厂或至少一个通用的构造函数和(最终)不可变的构建器模式(JB P.14)。 设置字段的方法返回void – 它们更好地返回一个通用T – 这样我们就可以获得进行方法链接的能力(它们现在都调用super )。 目标: 1. 避免在每个类中创建静态getFactory()方法。 2. 简单的方法签名。 3. 创建一个通用的工厂方法,但会在编译时捕获问题。 4. 在出错时获取编译时错误而不是运行时错误。 根据要求,非通用代码非常简单,但不起作用。 public class A { private String a = null; protected A setA(String a){ this.a = a; return this;//<== DESIRE THIS TO BE CHAINABLE } protected static A factory(){ return new A(); } } 。 public […]

DDD – 实体状态转换

考虑以下简化示例: public class Ticket { public int Id; public TicketState State; public Ticket() { // from where do I get the “New” state entity here? with its id and name State = State.New; } public void Finished() { // from where do I get the “Finished” state entity here? with its id and name State […]

OO上的JavaWorld:Getters / Setters vs Builder

背景: 我在JavaWorld上发现了这篇文章 ,其中Allen Holub解释了Getters / Setters的替代方法,它保留了隐藏对象实现的原则(他的示例代码也可以在下面找到)。 它解释了类Name / EmployeeId / Money应该有一个构造函数采用单个字符串 – 原因是如果你键入它作为int ,后来需要将它更改为long ,你将不得不修改所有用途这个模式,你没有必要。 问题1: 我想知道:这不是简单地将问题转移到解析被抛出的String参数吗? 例如,如果使用EmployeeId所有代码(从Exporter接收)将String解析为int ,并且突然开始导出long值,则需要修改完全相同的数量…并且如果您开始将其解析为很long它可能必须改为double (即使这对id没有意义)……如果你不能确定将String解析为什么,你就无法实现任何东西 。 问题2: 除了这个问题,我还有另一个问题:我意识到这篇文章已有七年多了,所以有人能指出我最近关于OO设计的一些概述,特别是关于getter / setter和实现隐藏辩论的想法吗? 清单1. Employee:Builder Context public class Employee { private Name name; private EmployeeId id; private Money salary; public interface Exporter { void addName ( String name ); void addID ( String […]

何时在Java中使用单方法接口

我在许多像Spring这样的库中看到过,它们使用了很多接口,其中包含BeanNameAware等单一方法 。 实现者类将使用单个方法实现许多接口。 在什么情况下保持单个方法接口是有意义的? 这样做是为了避免使一个单一的界面变得庞大,例如ResultSet ? 或者是否有一些设计标准主张使用这些类型的接口?

Java中的委托与回调

我对Java中的委托和回调条款有一些误解。 class MyDriver { public static void main(String[] argv){ MyObject myObj = new MyObject(); // definition of HelpCallback omitted for brevity myObj.getHelp(new HelpCallback () { @Override public void call(int result) { System.out.println(“Help Callback: “+result); } }); } } class MyObject { public void getHelp(HelpCallback callback){ //do something callback.call(OK); } } 它是回调还是委托( 委托和回调是相同还是相似? )? 如何实施另一个?

如何在Java中实现API / SPI模式?

我正在创建一个框架,公开API供开发人员使用: public interface MyAPI { public void doSomeStuff(); public int getWidgets(boolean hasRun); } 所有开发人员应该做的是根据这些API方法编写项目代码。 我还希望他们能够在运行时类路径上放置不同的“驱动程序”/“API绑定”(与JDBC或SLF4J的工作方式相同),并让API方法调用( doSomeStuff()等)在不同的第三方上运行资源(文件,服务器等)。 因此,相同的代码和API调用将映射到不同资源上的操作,具体取决于运行时类路径所看到的驱动程序/绑定(即myapi-ftp , myapi-ssh , myapi-teleportation )。 如何编写(和打包)允许这种运行时绑定的SPI,然后将MyAPI调用映射到正确的(具体)实现? 换句话说,如果myapi-ftp允许你从FTP服务器getWidgets(boolean) ,我怎么能这样做(使用API​​和SPI)? 具体的工作Java代码示例的奖励点! 提前致谢!

Java Singleton设计模式:问题

我最近接受了采访,他向我询问了Singleton Design Patterns有关它们是如何实现的,我告诉他使用静态变量和静态方法我们可以实现Singleton Design Patterns。 他似乎对答案感到满意,但我想知道 我们可以用多少种方法在Java中实现Singleton Design Pattern? Singleton Object的范围是什么?它在JVM中的实际工作方式是什么? 我知道我们总是会有一个Singleton Object的实例,但是该对象的实际范围是什么,是在JVM中还是运行多个应用程序而不是它的范围是在JVM中的每个上下文基础上,我真的很难过无法给出令人满意的解释? 最后他问是否可以使用带有Clusters的Singleton Object和解释,当我们调用Bean Factory来获取对象时,有没有办法让Spring不实现Singleton Design Pattern? 关于Singleton的任何意见都会受到高度赞赏,在处理Singletons时要记住哪些主要内容? 谢谢。

数据访问层的设计模式

我有一个使用数据库(MongoDB)来存储信息的应用程序。 在过去,我使用了一个充满静态方法的类来保存和检索数据,但我已经意识到这不是面向对象的,也不是未来的证据。 虽然我不太可能改变数据库,但我宁愿把一些东西与Mongo联系起来。 我还希望能够使用从数据库刷新缓存对象的选项来缓存结果,但这不是必需的,可以在其他地方完成。 我已经查看了数据访问对象,但它们似乎没有很好地定义,我找不到任何好的实现示例(使用Java或类似的语言)。 我还有很多一个关闭案例,例如找到用于完成制表符的用户名,这些用户名似乎不太适合,并且会使DAO变大和膨胀。 是否有任何设计模式可以帮助获取和保存对象而不会过于特定于数据库? 良好的实现示例将是有帮助的(最好是在Java中)。

java对象间通信

还在学习Java。 Swing再一次让我问这个问题,但这确实是一个普遍的OO问题。 如果我有一个主类(包含main()),它创建一个新的对象“A”,它做了一些事情,主类现在有一个对该对象的引用,对象“B”如何访问该对象的属性? 我能想到的唯一方法是让master类创建一个新对象“B”,将对象“A”作为参数传递给构造函数,我认为这是正常的,但这不会使事件处理变得困难。 例如,也许这是一个导致问题的糟糕设计。 我有一个带有程序逻辑的大师类,它创建一个标准的Swing框架,带有菜单,菜单项有动作监听器。 但是actionlistener需要与外部对象进行交互。 所以有些代码(忽略细节): 主类,包含程序逻辑以及save和load方法等: public final class TheProgramme implements WindowListener } private static final TheProgramme TP = new TheProgramme(); // Declare Class variables, instance variables etc. public static void main(String[] args) { javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShewGUI(); } }); } private static void createAndShewGUI() { TP.populateAndShew(); } […]

发现循环依赖的问题

我正在设计一个系统,其中有两个模块,一个是gestions文件,另一个是用户。 对于某些逻辑操作,他们需要彼此提供的服务。 每个模块都由一个单例表示,它实现了一个为彼此提供一些服务的接口,抽象工厂提供它们,如下所示: public class UserMain implements UserInternalService { /* * Internal interfaces */ /** * Allows interaction with the projects database. */ FilesInternaService fileSystem; /** * Constructor is private, as this is a singleton. */ protected UserMain() { } private static UserMain singleton = null; /** * Singleton factory. Returns a reference to the […]