Tag: 设计模式

如何将Java API的内部结构隐藏到世界其他地方

我正在开发一个Java Api来做事情(秘密,呃嗯;)。 有没有办法隐藏类,以及我的API的内部结构? 我到现在才发现: 使用内部类(丑陋的方式,我不想把所有内容放在类文件中) 一个包中的所有类,以便我可以使用“包”-visibilty(也丑,我需要更多的包) 例: — package net.my.app; //this is the Public Access class MyPublicClass{ public void somePublicFunction(){ //access to not visibil classes } } — package net.my.app.notvisible: //this is what i want to hide class MyNOTPublicClass{ … } — 有任何想法吗? 谢谢!

为什么我们需要装饰器设计模式中的装饰器?

假设我有一个名为A的类,我想使用装饰器设计模式。 如果我错了,请纠正我,但为了工作,我们需要创建一个装饰器类,比如ADecorator ,它将保存对A实例的引用,所有其他装饰器将扩展它以添加function。 我不明白为什么我们必须创建一个装饰器类,而不是使用A实例?

db连接应该是单例吗?

Java中创建单例的最佳方法是什么? 数据库连接应该是单例(单例是否自动是线程安全的)? 因为理论上DB不能被许多用户同时访问。

为什么Java允许增加子类中受保护方法的可见性?

abstract class Base{ protected abstract void a(); } class Child extends Base{ @Override public void a(){ //why is this valid } } 为什么我们不能降低能见度但可以增加它? 此外,我需要实现模板模式 ,其中公共方法可见只能是基类。 例: abstract class Base{ public void callA(){ //do some important stuff a(); } protected abstract void a(); } class Child extends Base{ @Override public void a(){ //why is this valid […]

这种“instanceof”运算符的使用是否被认为是错误的设计?

在我的一个项目中,我有两个“数据传输对象”RecordType1和RecordType2,它们inheritance自RecordType的抽象类。 我希望两个RecordType对象在“process”方法中由同一个RecordProcessor类处理。 我的第一个想法是创建一个通用的流程方法,该方法委托给两个特定的流程方法,如下所示: public RecordType process(RecordType record){ if (record instanceof RecordType1) return process((RecordType1) record); else if (record instanceof RecordType2) return process((RecordType2) record); throw new IllegalArgumentException(record); } public RecordType1 process(RecordType1 record){ // Specific processing for Record Type 1 } public RecordType2 process(RecordType2 record){ // Specific processing for Record Type 2 } 我读过Scott Meyers在Effective C ++中写了以下内容: “任何时候你发现你自己编写的forms代码’如果对象是T1类型,那么做一些事情,但如果它是T2类型,那么做点其他事情,’打自己吧。” […]

方法链的优点和缺点以及由对象本身替换所有void返回参数的可能性

我最感兴趣的是Java,但我认为这是一个普遍的问题。 最近我一直在使用Arquillian框架( ShrinkWrap ),它使用了很多方法链接。 方法链接的其他示例是StringBuilder , StringBuffer中的方法。 使用这种方法有明显的好处:减少详细程度就是其中之一。 现在我想知道,为什么并非所有将void返回参数实现为可链接的方法? 链接必然存在一些明显和客观的缺点。 因为如果所有方法都是可链接的,我仍然可以选择不使用它。 我不是要求改变Java中的现有代码,这可能会破坏某些地方的某些东西,但解释为什么不使用它也会很好。 我更多地要求从未来的框架(用Java编写)设计视角。 我发现了一个类似的问题,但原来的提问者实际上想知道为什么它被认为是一种好的做法: 方法链 – 为什么这是一个好的做法,或不是? 虽然有一些答案可供使用,但我仍然不确定链接的所有优点和缺点是什么,以及将所有void方法链接起来是否有用会被认为是有用的。

用模式替换if else语句

我有一个if else声明可能在不久的将来增长。 public void decide(String someCondition){ if(someCondition.equals(“conditionOne”)){ // someMethod(“someParameter”); }else if(someCondition.equals(“conditionTwo”)){ // someMethod(“anotherParameter”); } . . else{ someMethod(“elseParameter”); } } 因为,这已经看起来很混乱,我认为如果我可以在这里应用任何设计模式会更好。 我查看了策略模式,但我不确定这是否会减少if else条件。 有什么建议么?

Java JSON序列化 – 最佳实践

我需要为某些对象实现JSON序列化,并且在与generics集合集成时遇到了问题。 所有可序列化的类都实现了这个接口(JSONObject来自这个库): interface JSONSerializable{ public JSONObject dump() throws JSONException //serializes object public void load(JSONObject obj) throws JSONException //deserializes object } 基于java.util.list的我的集合代码看起来或多或少是这样的: class AwesomeList implements JSONSerializable{ private LinkedList items = new LinkedList(); … … public JSONObject dump() throws JSONException { JSONObject result = new JSONObject(); JSONArray a = new JSONArray(); for(T i : items){ a.put(i.dump()); } […]

在视图模式中打开会话

鉴于我选择的JPA(Hibernate实现),Spring和,我问这个问题。 我一直在考虑我的实体层中的关系 – 例如我有一个订单实体,它有许多订单行。 我已经设置了我的应用程序,因此它急切地为每个订单加载订单行。 如果我将获取策略设置为false,你认为这是一种懒惰的方法来解决我会遇到的延迟初始化问题吗? 我看到它的方式,在检索实体及其关联时,我有以下备选方案: 使用Open Session In View模式为每个请求创建会话,并在返回响应之前提交事务。 实现DTO(数据传输对象)层,以便我执行的每个DAO查询都返回正确初始化的DTO以用于我的目的。 我真的不太喜欢这个选项,因为根据我的经验,我发现它创建了许多样板复制代码并且变得很难维护。 不要映射JPA中的任何关联,以便我执行的每个查询都只返回我感兴趣的实体 – 这可能要求我无论如何都要使用DTO,这将是一个难以维护的问题,我认为无法实现ORM的目的首先。 急切地获取所有(或大多数关联) – 在上面的示例中,总是在检索订单时获取所有订单行。 所以我的问题是,你何时以及在什么情况下会使用哪些选项? 你总是坚持一种做法吗? 我会问一位同事,但我认为,如果我甚至提到“开放式会议”这一术语,我会受到一片空白的欢迎:(我真正想要的是来自资深或经验丰富的开发人员的一些建议。 多谢你们!

单身设计模式:陷阱

目前我对这种“设计模式”非常感兴趣。 我不确定是否有使用这种严格的全局状态实施的垮台。 那么,你认为什么时候不在应用程序中练习单例?