Tag: 设计模式

在Java中实现类适配器模式

在阅读Head First Design Patterns中的类适配器模式时 ,我遇到了这句话: 类适配器…因为你需要多个inheritance来实现它,这在Java中是不可能的 只是为了试验,我尝试了以下方法: interface MyNeededInterface{ public void operationOne(MyNeededInterface other); public MyNeededInterface operationTwo(); } public class ThirdPartyLibraryClass{ public void thirdPartyOp(); } 假设我创建: class ThirdPartyWrapper extends ThirdPartyLibraryClass implements MyNeededInterface{ @Override public void operationOne(ThirdPartyWrapper other){ this.thirdPartyOp(); dosomeExtra(); } @Override public ThirdPartyWrapper operationTwo(){ int somevalue = doSomeThingElse(); return new ThirdPartyWrapper(somevalue); } } 在我的代码中,我可以使用: MyNeededInterface myclass […]

Java中的flyweight字符串何时有用?

我理解java的字符串实习的基本思想 ,但我想弄清楚它发生在哪些情况,以及我需要做哪些自己的轻量级。 有点相关: Java字符串:“String s = new String(”傻“);” Java中String flyweight实现的最佳替代方法从未得到过回答 他们一起告诉我, String s = “foo”是好的, String s = new String(“foo”)很糟糕,但没有提到任何其他情况。 特别是,如果我解析一个有很多重复值的文件(比如一个csv),Java的字符串实习会覆盖我还是我需要自己做一些事情? 关于字符串实习是否适用于我的其他问题 ,我得到了相互矛盾的建议 完整的答案有几个片段,所以我在这里总结一下: 默认情况下,java仅实现编译时已知的字符串。 String.intern(String)可以在运行时使用,但它执行得不是很好,所以它只适用于你确定会重复很多次数较少的String 。 对于较大的Strings系列,它是拯救的番石榴(参见ColinD的答案)。

桥接模式是否将抽象与实现分离?

我从不同的文章中学习了Bridge模式,并根据我的理解实现了它。 令我困惑的一件事是桥模式说 BridgePattern将抽象与其实现分离,以便两者可以独立变化 这句话是什么意思? 实现是在单独的jar中吗? 什么是独立声明的含义? 考虑提供的journaldev文章,详细说明答案。 任何帮助是极大的赞赏。

Java的。 用于实现侦听器的正确模式

通常情况下,我遇到的情况是给定的对象需要有很多侦听器。 例如,我可能有 class Elephant { public void addListener( ElephantListener listener ) { … } } 但我会遇到很多这样的情况。 也就是说,我还将拥有一个具有TigerListener的Tiger对象。 现在, TigerListener和ElephantListener是完全不同的: interface TigerListener { void listenForGrowl( Growl qrowl ); void listenForMeow( Meow meow ); } 而 interface ElephantListener { void listenForStomp( String location, double intensity ); } 我发现我总是必须在每个动物类中继续重新实现广播机制,并且实现总是相同的。 有首选模式吗?

单身模式(Bill Pugh的解决方案)

我正在阅读关于单身模式的维基,我不确定我是否理解这一点: https : //en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom正确部分。 为了简单起见 : 为什么Bill Pugh的解决方案比上面的例子更好? 是因为VM在实际使用之前没有加载静态类或类似的东西,所以在转向getInstance()方法之前我们不创建对象? 那个方法线程安全只是在初始化对象的程度吗?

Java集合协方差问题

假设我们有一个包含这些类的程序: public interface AbstractItem { } public SharpItem implements AbstractItem { } public BluntItem implements AbstractItem { } public interface AbstractToolbox { //well the problem starts here… public List getItems(); } public ExpensiveToolbox implements AbstractToolbox { private List items = new ArrayList(); public List getItems() { return this.items; } } public CheapTooblox implements AbstractToolbox { […]

Java中的RAII ……资源处理总是那么难看?

我刚刚玩了Java文件系统API,并提供了以下函数,用于复制二进制文件。 最初的源代码来自Web,但我添加了try / catch / finally子句,以确保在退出函数之前,如果发生错误,将关闭缓冲区流(因此,我的操作系统资源被释放)。 我减少了function以显示模式: public static void copyFile(FileOutputStream oDStream, FileInputStream oSStream) throw etc… { BufferedInputStream oSBuffer = new BufferedInputStream(oSStream, 4096); BufferedOutputStream oDBuffer = new BufferedOutputStream(oDStream, 4096); try { try { int c; while((c = oSBuffer.read()) != -1) // could throw a IOException { oDBuffer.write(c); // could throw a IOException } } finally […]

具有数据模型对象的Demeter定律

昨天我从休假回来工作,在我们的日常站立中,我的队友们提到他们正在重构我们的java代码中的所有模型对象以删除所有的getter和setter,并使模型字段成为所有公共对象,调用Law of Law德米特之所以这样做是因为 为了方便我们遵守得墨忒耳定律:模块不应该知道它操纵的“物体”的内部。 由于数据结构不包含任何行为,因此它们自然会暴露其内部结构。 因此,在这种情况下,德米特不适用。 我承认我必须了解我对LoD的了解,但对于我的生活,我找不到任何迹象表明这符合法律的精神。 我们模型中的getter / setter都不包含任何业务逻辑,这是他这样做的理由,因此这些对象的客户端无需了解是否在get / set方法中执行了某些业务逻辑。 我认为这是对需要“对象结构的内部知识”意味着什么的误解,或者至少在字面意义上并且在这个过程中打破了一个非常标准的约定。 所以我的问题是,直接暴露模型对象内部结构而不是通过LoD名称中的getter / setter实际上是否有意义?

java如何在引擎盖下实现字符串的flyweight模式?

如果你有两个String实例,并且它们是相同的,那么在Java中它们将共享相同的内存。 这是如何实现的? 编辑:我的应用程序使用大量的String对象,其中许多是相同的。 使用Java String常量池的最佳方法是什么,以避免创建自定义flyweight实现?

Java接口 – 实现对

是否有为接口方法创建默认实现的首选方法或样式? 假设我有一个常用的界面,在90%的情况下我想要的function是相同的。 我的第一直觉是用静态方法创建一个具体的类。 然后,当我想要默认function时,我会将function委托给静态方法。 这是一个简单的例子: 接口 public interface StuffDoer{ public abstract void doStuff(); } 具体实施方法 public class ConcreteStuffDoer{ public static void doStuff(){ dosomestuff… } } 使用默认function的具体实现 public class MyClass implements StuffDoer{ public void doStuff(){ ConcreteSuffDoer.doStuff(); } } 这里有更好的方法吗? 编辑 在看到一些提议的解决方案后,我想我应该更清楚我的意图。 本质上我试图解决Java不允许多重inheritance。 另外要明确我不是要声明Java是否应该允许多重inheritance。 我只是在寻找为实现接口的类创建默认方法实现的最佳方法。