Java中的模式

世上一直有一个神话:设计可以并且应该独立于实现的细节,设计通常被看作是一个抽象的概念而实现是一个代码的具体实例。如果我们坚信"设计是一个富有创造性和目的性的活动:为某一个目标而精心制定的结构的概念,",一个结构如果不能够说明它的环境,或者不能与环境协作,那么这个结构就不适合这一目标。环境中包括目标平台--语言、工具、库、中间件(middleware),等。还有它的功能性和非功能性的单元。

我们会认为在不知道地形布局的时候设计房屋,或者在不清楚使用的道材料的时候建造摩天大厦是不合理的事情。我们将线程、分布这类概念看作为小的编码的细节的看法无疑是在设计中导致浪费精力(时间和金钱)的导火索,最终我们发现的是理论与实践的差距在实践中要比在理论中还大。虽然在一些情况下一个高层次设计的某部分可以在许多技术下保持不变,但是更多的情况是我们需要亲自来补足这个圆圈,允许(甚至鼓励)细节和实际的信息来影响并告知系统的结构。

模式(Patterns)的作用就是获取这些结构上的信息。它们可以描述--预见性的或回顾性的--设计和设计的原理,讲述从问题到解决,说明环境,获取工作的动力以及应此产生的结果。这里,我将集中讲述两个模式--Command-Query Separation和Command Method--为一个类接口中的方法分配任务,考察他们如何互相作用并影响并发的、分布的和有序的环境以及本地执行。

接口设计。顾名思义,接口提供了不同系统之间或者系统不同组件之间的界定。在软件中,接口提供了一个屏障,从而从实现中分离了目标,从具体中分离了概念,从作者中分离了用户。在Java中,有许多接口的概念:public部分为潜在的用户提供了类和方法的接口,protected部分为它的子类(subclass)以及周围的包提供了一个接口;一个包有一个公用的部分;反射(Reflection)是另外一种提供、使用对象方法接口的机制。

约束及供给。站在用户对作者的角度,一个接口建立并命名了一个目的模型的使用方法。类接口中的方法提供了一种特殊的使用方法。是这些约束--编译时的类型系统,运行是的异常机制及返回值--使得类作者的目的得以体现和加强。在这方面最简单的例子是对封装的意义的理解:私有化可以保证类用户只可以通过类的公用方法接口来操作信息和行为。

然而,对于封装来说,远不止数据私有那么简单。在设计中,封装往往会涉及到自我包含(self-containment)。一个需要你知道如何调用一个方法(e.g."在一个线程的环境中,在一个方法调用后调用另一个方法,你必须明确地同步对象")的类的封装就不如将所有这些全部包含并隐藏的类(e.g."这个类是thread-safe的")好。前一个设计存在着设计的漏洞,它的许多限定条件是模糊的而不是经过加强的。这就把责任推给了用户而不是让类提供者做这些工作来完成类的设计,并且,这是不可避免的漏洞百出。

在这种情况下,供给(affordances)描述了使用的可行性和不可行性。

术语供给(affordances)指事物的被感知的真实的属性,首先,这些属性可以决定事物的使用的可能方法。一个椅子可以用来支撑其他东西,所以,可以坐人。一个椅子照样可以搬运(carried)。玻璃可以透光,也可以被打碎……

供给提供了对事物操作的线索,板状物可以压、柄状物可以旋转,沟状物可以插入东西。球状物可以扔或者反弹。当使用了供给的优势后,用户可以只通过看便确定该做什么:没有图、没有标签也没有说明。复杂的事物可能会需要一些解释,但是简单的事物不应该这样。当简单的东西也需要用图片、标签来说明的时候,设计就是失败的。

类设计者的一个职责便是在接口中减小约束与供给之间的隔阂(gap),匹配目标以及一定程度上的自由度,尽可能减小错误使用的可能。

对环境敏感的设计。在空间或者时间上分离方法的执行--例如,线程,远程方法调用,消息队列--能够对设计的正确性和效率产生意义深远的影响。这种分离带来的结果是不可忽视的:并发引入了不确定性和环境选择的开销;分布引入了错误的和不断增加的回程的调用开销。这些是设计的问题,而不是修改bug那样简单。

无论是在何种情况下,结果都是将会阻碍所有权风格的程序设计(Property-Style Programming)--当一个接口主要由set和get方法组成的时候,每个方法都相应的直接指向私有区域。这样的类的封装很差(意思是毫无遮掩)。接口中的域访问器(Field accessors)通常是不会提供信息的:他们在对象的使用中不能通讯、简单化和抽象化,这通常会导致冗长并易出现错误的代码。所有权风格的程序设计在短时间内不是一个大的活动。分布和并行通过引入了正确性和严重的性能开销放大了这些格式上实践的问题。

透明度和bug灾难。抽象允许我们在必要的时候可以忽略细节,所以我们的设计思想可以平衡环境的因素而不是受制于它们。决定什么样的细节可以忽略便成为一个挑战。问题的严重性在重要的细节别忽略的情况下上升了。

设计往往会尽量使环境因素尽可能的透明。透明能够成为一个诱人的主意:也许它可以让线程和远程对象通讯完全透明,这样用户在进行对象通讯的时候什么也不会觉察到。Proxy模式支持一定程度上的透明度。这加强了RMI和COBRA的基础。本地的代理的对象和使用远程的对象在使用中具有相同的接口,并且编组上的细节允许调用着使用熟悉的方法来调用模型。然而,这种分布透明并不完全:失误和潜在的影响,不能被完全隐藏并且需要考虑。毕竟透明不是毛巾。

时间: 2024-09-24 12:24:36

Java中的模式的相关文章

精解Java中代理模式的实现

简介摘要: 代理模式是GOF设计模式中的一种,常用于权限模块的架构设计,其根本的原理是通过将一个代理对象交给调用者,使得调用者不能直接使用相应的功能模块,所 有的调用被传递给代理对象,代理对象负责对真实模块完成调用,在调用者与被调用者之间建立了一个隔离带,我们可以使 代理模式是GOF设计模式中的一种,常用于权限模块的架构设计,其根本的原理是通过将一个代理对象交给调用者,使得调用者不能直接使用相应的功能模块,所有的调用被传递给代理对象,代理对象负责对真实模块完成调用,在调用者与被调用者[bei t

java中策略模式深入分析及示例

策略模式(Strategy Pattern)中体现了两个非常基本的面向对象设计的原则 –封装变化的概念 –编程中使用接口,而不是对接口的实现 策略模式的定义 –定义一组算法,将每个算法都封装起来,并且使它们之间可以互换. –策略模式使这些算法在客户端调用它们的时候能够互不影响地变化 策略模式的编写步骤 –1.对策略对象定义一个公共接口. –2.编写策略类,该类实现了上面的公共接口 –3.在使用策略对象的类中保存一个对策略对 象的引用. –4.在使用策略对象的类中,实现对策略对象 的set和get

Java的代理模式

前几天一个网友指出了我的文章中一些有失偏颇之处,那些文章都是我在阅读Java Core的时候做的总结,顺便加上我个人的一些理解.因为看的e文版,理解上有些地方可能还欠妥.下面谈一下对Java中代理模式(Proxy)的认识. 代理,想必大家都应该知道是什么冬冬了,一般的手机产商都有代理商,歌星们都有自己的经纪人,如此这些都可以看作是一种代理模式.下面我选择如下的一种情景来进行讲述:某董事长出差,但是此时公司有个聚会,董事长买单,但是由他的秘书去结帐.我们就权且把这个看作一个代理行为,^_^. 首先

java中Class.forName的作用浅谈_java

Class.forName(xxx.xx.xx) 返回的是一个类 一.首先你要明白在java里面任何class都要装载在虚拟机上才能运行. 1. forName这句话就是装载类用的(new是根据加载到内存中的类创建一个实例,要分清楚).   至于什么时候用,可以考虑一下这个问题,给你一个字符串变量,它代表一个类的包名和类名,你怎么实例化它?     A a = (A)Class.forName("pacage.A").newInstance();        这和          

Java中单例模式的7种写法_java

第一种(懒汉,线程不安全): public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } 这种写法lazy loading很明显,但是致命的是在多线程不能正常工作.

Java中单例模式详解_java

单例模式概念: java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例.饿汉式单例.登记式单例三种. 单例模式有一下特点: 1.单例类只能有一个实例. 2.单例类必须自己自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例.在计算机系统中,线程池.缓存.日志对象.对话框.打印机.显卡的驱动程序对象常被设计成单例.这些应用都或多或少具有资源管理器的功能.每台计算机可以有若干个打印机,但只能有一个Pr

Java中的常量:如何避免反模式

在应用中,我们往往需要一个常量文件,用于存储被多个地方引用的共享常量.在设计应用时,我也遇到了类似的情况,很多地方都需要各种各样的常量. 我确定需要一个单独的文件来存储这些静态公共常量.但是我不是特别确定是应该用接口还是类(枚举不满足我的需求).我有两种选择: 使用接口,如: package one; public interface Constants { String NAME="name1"; int MAX_VAL=25; } 或 package two; public cla

Active Object并发模式在Java中的应用

简介:Active Object 是并发编程实践中典型的设计模式,Active Object 模式的核心是通过解耦合 方法的调用与执行来提高程序的并发度.本文将从典型 Active Object 设计模式入手,从一个新的视角 来探讨 Active Object 并发模式在 Java 中的应用. 本文主要从以下两个方面进行阐述: 使用 C++ 语言,来描述 Active Object 设计模式. Java 类库对于这样一个典型的模式做了很好的类库层面的封装,因此对于 Java 的开发者来说,很多

Java中的策略模式实例教程

策略模式是一种行为模式.用于某一个具体的项目有多个可供选择的算法策略,客户端在其运行时根据不同需求决定使用某一具体算法策略. 策略模式也被称作政策模式.实现过程为,首先定义不同的算法策略,然后客户端把算法策略作为它的一个参数.使用这种模式最好的例子是Collection.sort()方法了,它使用Comparator对象作为参数.根据Comparator接口不同实现,对象会被不同的方法排序.详细介绍请看java中的排序对象. 本文例子是,完成一个简单地购物车,两种付款策略可供选择,一为信用卡,另