Tag: design patterns

Spring环境中的域驱动设计和事务

我曾经围绕贫血领域模型设计我的应用程序,因此我有许多存储库对象,这些对象被注入到大的,胖的,事务感知服务层。 此模式称为事务脚本。 它不是一个好的做法,因为它会导致程序代码,所以我想继续前进到域驱动设计。 在网上阅读了几篇文章后,听了Chris Richardson关于Parleys的演讲并阅读了POJO in Action的DDD章节,我想我得到了全局。 问题是,我不知道,如何在我的应用程序中组织事务。 Chis Richardson在他的书中指出: 表示层通过直接或间接通过façade调用域模型来处理来自用户浏览器的HTTP请求,正如我在前一章中描述的那样,它是POJO或EJB。 好到目前为止,但InfoQ上的Srini Penchikala 文章指出: 一些开发人员更喜欢在DAO类中管理事务,这是一种糟糕的设计。 这导致过于细粒度的事务控制,这不能提供管理事务跨越多个域对象的用例的灵活性。 服务类应该处理事务; 这种方式即使事务跨越多个域对象,服务类也可以管理事务,因为在大多数用例中,Service类处理控制流。 好的,所以如果我理解正确的话,存储库类不应该是事务性的,服务层(现在更薄)是事务性的(因为它曾经是在事务脚本模式中)。 但是如果域对象直接被表示层调用呢? 这是否意味着我的域对象应该具有事务行为? 以及如何在Spring或EJB环境中实现它? 这对我来说似乎有些奇怪,所以如果有人澄清这一点,我会很高兴。 谢谢。

如何在java中为不同的数据库创建多个数据库连接

我有一个应用程序,它使用不同地理位置的四个数据库。 所有数据库都包含相同的表,并且只有数据库名称根据位置而不同。 我必须在我的应用程序中创建一些使用每个数据库中的数据的报告。 从java应用程序创建这些数据库连接的正确方法是什么?是否有适合我可以使用的任务的设计模式?

如何避免使用域驱动设计的非常大的对象

我们正在关注领域驱动设计以实现大型网站。 但是,通过将行为放在域对象上,我们最终得到了一些非常大的类。 例如,在我们的WebsiteUser对象上,我们有许多方法 – 例如处理密码,订单历史记录,退款,客户细分。 所有这些方法都与用户直接相关。 其中许多方法内部委托给其他子对象但是 这仍然导致一些非常大的类。 我很想避免暴露很多子对象,例如user.getOrderHistory()。getLatestOrder()。 还有什么其他策略可以避免这个问题?

如何实现一般分页

我不是在寻找Hibernate / JPA / JDBC实现,而是寻找一般的设计模式。 谷歌搜索“分页”给了我大量的信息,许多有趣的文章,解释如何在UI上实现分页和各种实现或多或少相同。 由于我使用的是Spring 3.0.5,我偶然发现了这篇很好的参考文章如何在Spring MVC 3中实现分页 。 简单的豆子: public class Person{ private String personName; private int age; // … } 一个简单的DAO接口: public interface PersonDAO{ Set getAllPersons(int start, int limit,String orderBy); Set findPersonsByName(String name, int start, int limit,String orderBy); } 和hibernate实现 @Repository public class PersonDAOImpl implements PersonDAO { @Autowired(required = true) private […]

在JTable中显示数据库中的数据

我正在使用jdbc编写一个程序,它将成为数据库的接口(像CRUD应用程序一样)。 我假设我必须编写一个类(例如DBCLass ),它将对数据库执行所有操作( select, update, insert, delete以及可能还原为这些操作的其他一些逻辑)。 用户界面由一组表和几个按钮组成。 要使用Jtable,我需要实现一个类(例如Model ),它是AbstractTableModel的子类。 所以这个类会向用户显示我的数据。 我需要为我的数据库模式中的所有表实现这样的模型。 我不想在向用户显示数据的类中编写逻辑,我认为在这些类中编写逻辑代码并不是一件好事。 但是将db表中的所有数据加载到内存(例如ArrayList)并将其显示在Model也是不正确的。 所以,我想要一个建议,这是解决这个问题的最佳方法。 编辑:一个小例子: Statement stmt = ….; ResaultSet rs = stmt.executeQuery(“SELECT * FROM table1”); javadoc说executeQuery方法返回一个ResultSet对象,该对象包含给定查询生成的数据。 因此,如果我们有大量数据(大小超过我们的虚拟机的大小),我们的程序将失败。 所以我的问题仍然有用

不可变对象和不可修改的集合

使用不可变对象,将包含的集合包装为不可修改的位置是正确的? 我看到3个选项: 在不可变对象的工厂中: public class ImmutableFactory { public Immutable build(){ List values = new ArrayList(); values.add(1); values.add(2); values.add(3); return new Immutable(Collections.unmodifiableList(values), “hello”); } } 在immutable的构造函数中 public class Immutable { private final List values; private final String hello; public Immutable(List values, String hello) { this.values = Collections.unmodifiableList(values); this.hello = hello; } public List getValues() { return […]

麻烦制造多态失败那些开关/案例陈述

继续前面的问题( 这里和这里 ),我实现了一个基本的命令模式,创建了我的命令类并编码到一个接口,所以当使用任何命令时,调用execute()方法。 但是,我仍然发现自己无法动摇这些案例陈述:我正在读取主/决定字符串中的每个字符,字符串由随机的,重复的字符A,B,C或D组成,然后我检索相关的实现来自地图的命令并调用其execute方法。 我的设计是这样的: public interface Command { void execute(); } public class CommandA implements Command{ //implements execute() method } private Map myMap= new HashMap(); myMap.put(“A”, new CommandA); myMap.put(“B”, new CommandB); myMap.put(“C”, new CommandC); myMap.put(“D”, new CommandD); 但是,当我阅读每条指令时,我再次诉诸案例陈述: switch(instructionFromString){ case ‘A’:{myMap.get(“A”).execute(); break;} case ‘B’:{myMap.get(“B”).execute(); break;} case ‘C’:{myMap.get(“C”).execute(); break;} case ‘D’:{myMap.get(“D”).execute(); break;} 显然,在某种程度上我设法击败了多态性对案例陈述的优势。 它可能是我选择存储命令的那种数据结构吗? 它很可能是一个永久的数据结构,只需从中提取这些命令。 […]

Command模式如何将发送方与接收方分离?

Command模式有一个IReceiver接口,只有很少的方法,并且对应每个方法都有具体的Command对象(用execute()方法实现接口ICommand )。 我已经读过客户端知道具体的接收器和具体的命令,通常客户端在具体的命令对象中设置接收器对象。 那为什么说它解耦了发送者和接收者呢? 当客户端已经知道具体接收器时,我觉得这不是松散耦合,并且在这种情况下客户端也可以直接调用接收器对象上的API(方法)。

简单工厂和工厂方法模式的动机

我知道有很多关于不同工厂模式的差异的问题,但答案是如此不同和令人困惑。 我读过的书籍使用不清楚和(简化)简化的例子。 即使在阅读了维基百科的解释之后,我也有很多问题,以及关于它们的大量在线解释,包括所有这些网站上的解释。 我正在阅读的这本书是Head First Design Patterns。 在Simple Factory中,客户端使用单独的类(Creator)和工厂方法(可以是静态的)来返回Products。 在工厂方法模式中,创建者和客户端是相同的东西,他们在同一个类中使用抽象方法来创建新的产品,它们在同一个类中运行。 当然,造物主(或客户)是抽象的,因此关于制作混凝土产品的决定被推迟到子类。 我的理解是否正确(例如,FMP中的客户端和创建者是相同的,我从未在FMP图中看到客户端)? 在Factory Method Pattern中,它表明create方法不能在Creator之外重用,所以它只能在创建一个新的Creator时重用? 有什么情况我可以选择一个而不是另一个? (PS请不要将此标记为重复,我想在此网站上明确这一点)

用Java观察

我正在尝试理解Observer和Observable。 这是我想要弄清楚的一个例子: public class IntegerDataBag extends Observable implements Iterable { private ArrayList list= new ArrayList(); public void add(Integer i){ list.add(i); setChanged(); notifyObservers(); } public Iterator iterator(){ return list.iterator(); } public Integer remove (int index){ if (index< list.size()){ Integer i = list.remove(index); setChanged(); notifyObservers(); return i; } return null; } } public class IntegerAdder implements Observer […]