摘要: 这是一个创建型设计模式。意图: 保证一个类仅有一个实例,并提供一个访问它的全局访问点。动机: 对于一些类来说,只有一个实例是很重要的。虽然系统中可以有许多打印机,但却只能有一个打印假脱机,只应该有一个文件系统和一个窗口管理器。一个数字滤波器只能有一个A/D转换器,一个会计系统只能专用于一个公司。 我们怎么样才能保证一个类只有一个实例并且这个实例易于被访问呢?一个全局变量使得一个对象可以被访问,但它不能防止你实例化多个对象。 一个更好的办法是让类自己负责追踪它的唯一实例。这个类可以保证没有其他的实例可以被创建(通过截断创建新实例的请求),而且提供一种访问这个唯一实例的方法。实现: 有一个类Ma. 阅读全文
posted @ 2013-08-27 11:25 free_thinker 阅读(274) 评论(0) 推荐(0) 编辑
摘要: 设计模式分为三类,每个设计模式都属于这三类模式中的一种:创建型,处理对象创建中的相关问题;结构型,为组织系统中的类与对象提供方法;行为型,为设计系统中对象间的协作提供策略。 体系结构设计模式,帮助设计者将功能分配给系统中各个子系统的设计模式。设计模式使得开发人员可以设计系统的具体部分,比如讲对象实例化抽象或将类聚集成更大的结构。设计模式还促进了对象之间的松散耦合。体系结构模式促进了系统之间的松散耦合。这些模式规定了系统中的所有子系统,以及彼此交互的方式。这里讨论流行的模型--视图--控制器MVC和层次体系结构模式。MVC 考虑一个简单的文本编辑器的设计。在这个程序中,用户从键盘输入文本,使.. 阅读全文
posted @ 2013-08-26 15:53 free_thinker 阅读(1062) 评论(0) 推荐(0) 编辑
摘要: 设计人员使用数据结构(如:数组、链表、哈希表)来组织程序中的数据。迭代器设计模式可以在不了解数据结构行为(如遍历数据结构、或者删除数据结构中的元素)或者数据结构如何保存数据的情况下,就可以允许对象访问数据结构中的对象。遍历数据结构与访问它的元素的命令保存在一个名叫迭代器的单个对象中。每个数据结构都能建立一个迭代器,每个迭代器实现共同接口的方法:遍历数据结构和访问它的数据。一个对象可以用相同的方式遍历两个不同结构的数据结构,如链表和哈希表,这是因为两个数据结构包含着属于同一个类的迭代器对象,而这个类实现共同的接口。Java在java.util包中提供了接口Iterator. 意图: 提供一种.. 阅读全文
posted @ 2013-08-26 12:24 free_thinker 阅读(572) 评论(0) 推荐(0) 编辑
摘要: 模板方法也涉及了算法。策略设计模式允许若干个对象包含各不同的算法,但模板方法设计模式要求所有的对象共享由超类定义的单一算法。 比如说,我们在策略设计模式中讨论过,TextDisplay、BarGraphDisplay和PieChartDisplay等类的对象运用相同的基础算法来获取和显示数据----从BankStatementData对象那里获取所有的对账单,分析对账单并显示数据。模板方法设计模式允许我们创建一个叫做BankStatementDisplay的超类,提供用来显示数据的中心算法。在这个例子中,这个算法包含了抽象方法getData、parseData和displayData。类Te. 阅读全文
posted @ 2013-08-24 11:05 free_thinker 阅读(550) 评论(0) 推荐(0) 编辑
摘要: 策略设计模式与状态设计模式相类似。我们提到过,状态设计模式包含一个状态对象,该对象封装一个上下文对象的状态。策略设计模式包含一个策略对象、该对象与状态设计模式的状态对象相类似。它们之间的关键不同在于:策略对象封装算法而不是状态信息。 比如说,java.awt.Container组件实现了策略设计模式,它将LayoutManager设计成策略对象。在包java.awt中,类FlowLayout、BorderLayout、GridLayout实现接口LayoutManager。每一个类通过使用方法addLayoutComponent而将GUI组件添加到Container对象中----但每一个方.. 阅读全文
posted @ 2013-08-23 11:37 free_thinker 阅读(1002) 评论(0) 推荐(0) 编辑
摘要: 这是一个行为型设计模式,是MVC体系结构的基础。 Java API 包含了运用观察器设计模式的类。类java.util.Observable代表一个主题。类Observable提供了方法addObserver,该方法带有一个java.util.Observer参数。接口Observer允许Observable对象在其发生状态改变时向Observer发出通知。这个Observer可以是任何一个实现接口Observer的类的实例。因为Observable对象调用在接口Observer中定义的方法,这些对象仍然保持松散耦合关系。如果开发人员改变了一个具体Observer响应Observable... 阅读全文
posted @ 2013-08-22 12:02 free_thinker 阅读(480) 评论(0) 推荐(0) 编辑
摘要: 这是一个行为型设计模式。若干个Java AWT GUI 组件使用责任链设计模式来处理特定的事件。比如说,类java.awt.Button 覆盖了java.awt.Component类的processEvent方法,来处理AWTEvent对象。方法processEvent试图在作为一个参数接收到AWTEvent事件时处理它。如果方法processEvent判断AWTEvent是一个ActionEvent(即,这个Button已经被按下),该方法通过调用方法processActionEvent(该方法通知所有的相关ActionListener,该Button已经被按下)来处理该事件。如果方法pr. 阅读全文
posted @ 2013-08-21 13:23 free_thinker 阅读(381) 评论(0) 推荐(0) 编辑
摘要: 在阅读nutch源码的时候发现经常会在使用this调用。this调用的作用是调用类本身的已经存在的其它的构造函数。它与super不同,super调用的父类的构造函数。看如下ntuch中CrawlDatum所有构造函数源码: public CrawlDatum() { } public CrawlDatum(int status, int fetchInterval) { this(); /*this调用的作用是调用上面的无参构造函数*/ this.status = (byte)status; this.fetchInterval = fetchInterval; } ... 阅读全文
posted @ 2013-08-20 17:49 free_thinker 阅读(3204) 评论(0) 推荐(0) 编辑
摘要: Java GUI组件使用了组合设计模式。考虑Swing组件类JPanel,它扩展了类JComponent。类JComponent扩展了类java.awt.Container,而java.awt.Container 又扩展了类java.awt.Component。类Container提供方法add,该方法将一个Component对象(或Component子类对象)添加到该Container对象上。因此,JPanel对象可以被添加到任意一个Component子类对象(Container对象或其子类对象),任何一个Component子类对象也可以被添加到JPanel对象上。JPanel对象可以包.. 阅读全文
posted @ 2013-08-20 16:03 free_thinker 阅读(1830) 评论(0) 推荐(0) 编辑
摘要: 简介: 在java.awt.event. java.swing.event包中,java提供了使用适配器设计模式的若干个类。这些类的对象充当产生特定事件的对象和那些处理这些事件的对象之间的适配器。比如说,MouseAdapter使得一个产生MouseEvent的对象适应于一个处理该事件的对象。 适配器设计模式为对象提供一个适应于其它对象接口的新接口,允许两个对象之间彼此进行协作。 适配器与电子设备上的插头转接器相类似----欧洲生产的电子插座与美国生产的不同,因此需要转接器来将美国设备插接到欧洲产的电子插座上。意图: 将一个类的接口转换成客户期望的另一个类的接口。使得原本由于接口不兼容而不能. 阅读全文
posted @ 2013-08-19 20:33 free_thinker 阅读(663) 评论(0) 推荐(0) 编辑