读《java模式》

Java模式(第二卷)
【美】Mark Grand著
亢勇  豆庆华 等译
电子工业出版社

通用职责分配软件模式(GRASP)
   控制器模式
   创建者模式
   专家模式
   得墨耳定理模式
   低耦合/强内聚模式
   单存创建模式


GUI会话模式
   单任务窗口模式
      对于用户必须实现的每个相关任务,GUI应该有一个单独的窗口。实现任务所需的所有信息应该能够从这个窗口得到。

   交互形式模式
      使GUI的交互形式与用户能力及应用需求相匹配。最常用的交互形式:
      选择模式:从列表中选择用于实现的数值或下一个操作;
      表单模式:通过填写表单中的字段来提供信息或指定任务;
      直接操作模式:提供所实现任务的可视化表示和控制任务的各种命令;
      会话式文本:允许用户以文本方式输入复杂的命令。

   可探测接口模式
      允许用户撤销操作,并返回以前决策点以避免用户失误,并设计用户界面。
      当GUI接收改变程序状态的命令,确保通过undo命令撤销最后一个命令的结果,常用于直接操作和会话式文本中;
      对于选择模式,可使用back/goback选项,返回到之前的状态;
      对话框尚含有cancel按钮;
      表单交互的目的可以是收集信息和编辑信息,对于前者:包括cancel按钮以中止交互;对于后者,包括reset按钮,以恢复至原始值。

      相关模式:命令模式-一种撤销命令造成结果或撤销任务实现的方法;
          快照模式--将程序恢复到以前状态
          会话式文本模式--接收文本形式输入命令的GUI。
      典型实现:文本输入域+菜单或工具栏形式的命令输入区+存储一系列以前键入的命令(宏或文本)。并且包括完善的自动完成提示。

   选择模式
      允许用户通过从列表中选择命令和数值与GUI进行交互。
      可以有单选/多选交互方法;平面显示(选项同时显示)/分层显示(按层次显示选项,较低层次显示与否依赖于较高层次的选择结果)方式。
      实现形式很多:下拉菜单、弹出式菜单、按钮组、列表框、单选按钮、检查框(多选按钮)等。
表单模式
      允许用户以离散信息方式向GUI输入结构化数据。常见于论坛注册过程。
      相关模式:辅助窗口模式、瞬时反馈模式、可探测接口模式、选择模式。

   直接操作模式
      允许用户通过使用GUI提供的对象表达式与对象交互。
      常见的实现机制:指向点击和拖放

   有限选择规模模式
      设计选择交互方式的表示法以避免显示超过有限的选择数量。
      建议一次同时显示的选项数为7,上下偏差为2;
      如果下拉式或弹出式菜单有太多的无关选项,考虑组合相关选项并增加分界线以隔离无关选项;保持选项组的数量和每组中选项数量没有超过限制。

   瞬时反馈模式
      给使用者提供工作状态的反馈,而不干扰正常的工作流程。
      当用户出现误操作或数据输入错误时,应提供人性且明显的提示方式反馈给用户;
      对于需要用户马上做出响应的操作,可以用模态对话框提供反馈。

   去除无关事件模式
      隐藏或者去除与当时环境无关的GUI元素。
      对于始终不可用的命令,不应显示出来;
      对于在特定情况下可用的命令,可以在不可用是灰显;
      出于商业目的,试用版中不可用的功能可以灰显,以吸引用户购买正版。

   辅助窗口模式(对话框模式)
      为用户显示一个辅助父窗口的交互窗口。
      其目的是为父窗口的交互来收集信息,并显示附加信息,或者提供父窗口的状态通知。
      对话框的设计根据显示内容的不同而不同。

   向导模式
      用GUI引导用户一步一步地完成任务。
      尽量避免用户大量地输入;
      具备返回到上一步的功能。


代码编制模式

   存取器方法命名模式
      使用名称和签名可以使得JavaBeans说明更规范并容易阅读。
      一般属性,用set/get方法;
      布尔值以isXXX形式返回,设置仍用setter;
      对于集合,用add/remove实现添加/删除元素。

   匿名适配器模式
      使用内隐类来处理事件,简化代码并允许相同事件使用相同的代码。
      符号常量命名模式
      为常量使用符号名称。
      所有字母大写,使用下划线分隔单词;
      声明为static、final(、private)。
      在接口中定义常量模式
      不要用类的名称来限定符号常量的名称。在接口中定义符号常量,这样任何实现接口的类都可以无限制地使用符号名称(不必使用接口名来限定常量)。

   Switch语句模式
      根据给出的多项可选的int数值,选择一条switch语句来执行。

   扩展超类模式
      通过调用超类的方法来实现修改超类的行为。
      扩展超类的方法,即在超类方法功能基础上增加新的功能,常用在override中,且通过关键字super来调用超类方法。

   意图展示方法模式
      如果调用通用方法的意图不是很明显,可以定义一个具有含义名称的方法来调用通用方法,即重新包装被调用方法。

   复合方法模式
      将太大的、不易理解的方法改编成小的方法(private)。
      对于方法的代码长度,没有确定的标准,有一个常用的规则:方法代码足够小,以便在编辑窗口中可以立刻看到(纵向规则),如果方法中的嵌套结构层导致了缩排时的换行或者超出了编辑窗口的宽度(横向规则),可以考虑把嵌套曾分割为独立的方法。

   条件编译模式
      用来控制编译器是包含设计语句生成的字节代码还是忽略。
      为方便测试,通常的做法是在类中插入代码来跟踪程序的流程或者检查断言。一种好的办法就是定义一个变量来体现测试代码的结果,可以仅仅通过改变变量的值来决定是否进行测试。
检测到的和未检测到的异常模式
      通过throw抛出的异常称为检测到的异常。若方法抛出的异常在合约之外,类似指明内部错误的异常或者对测试有帮助的异常都称为为检测到的异常。
      除了RuntimeException,Error及其子类实例外,所有的异常都是检测到的异常;
      方法调用者需要对检测到的异常做处理或通过throw往外抛;

   转换异常模式
      转换异常类。
      方法体内抛出(throw)的异常未在方法异常声明(throws)中时,应该将该异常包装成异常声明列表中的某个异常。

   服务器SOCKET模式
      编写代码来管理服务器中基于socket的网络连接。
      通过基于socket的连接来相互通信的程序在建立连接时扮演下面两个角色中的一个:
      客户端:启动与服务器连接的接口;
      服务器:等待程序来启动与他们连接的接口。
      该模式其实就是介绍了socket通信程序服务器端的结构。

   客户端SOCKET模式
      同上。
      该模式其实就是介绍了socket通信程序服务器端的结构。

代码优化模式
   散列适配器对象模式
    当需要根据不同参数,创建不同对象时,为避免使用多个if语句或switch语句,可以使用该模式。
其原理如下:存在一个对象创建器(creator)工厂,其主要职责是在一个hashtable中查找与特定参数相匹配的创建器(如果已经在hashtable,则直接返回;如果没有,则新创建一个,存入该hashtable中)。该创建器负责创建与此相关的特定对象,有统一的接口。

   松散初始化模式
    将待初始化的变量声明为静态私有变量,职能通过存取器方法使用。在通过getter方法返回该变量时,首先检查该变量是否已经被初始化;如果没有,则用new初始化一个新对象;否则,返回已经存在的对象;

   双重检查锁定模式
    相当于Gof中的singleton模式。可以实现为:
直接将getter方法声明为synchronized
在该getter方法内部,通过判断语句+synchronized来实现,如:
private CabinetAssistantIF assistant = null;
...
CabinetAssistantIF getCabinetAssistant(){
    if(assistant == null){
        synchronized(this){
            if(assistant == null){
          ...}}}

   循环展开模式
     通过逐步增加每次重复实现的工作量来减少一个循环控制循环逻辑的系统消耗,使它可以在少量的重复中实现等量的工作。这个模式以内存换取速度。比如有一个4000次的循环,用for循环语句来实现。替代实现方案是:将原来的循环步长1增至100,这样,原来循环体内的一个操作变成现在的100次操作。从而使每次循环所作的工作比原来增加了99倍。其缺点是使代码行增加了很多。

   查找表模式
    通过预先计算结果,并把结果放在查找表中来节省由复杂代码消耗的内存和代码执行的时间。

代码健壮模式
   断言测试模式
在正式执行任务之前,检查某些参数的先决条件是否满足要求;
在任务执行完毕之后,检查某些结果的后置条件是否满足要求;
在任务执行过程中,检查应为永真的某些参数是否满足条件;
如果这些判断未满足条件,考虑是否通过异常抛出语句来退出执行任务.

   担保清除模式
当操作不能够完成正常工作时,确保内置数据处于相容的状态;
当操作能实现正常工作时,确保外置设备处于一个一致的状态;
在java中可以通过finally来实现;

   最大私有化模式
将类的成分尽可能私有化;如尽量将成员变量声明为私有,且职能通过getter、setter来读取或更改这些变量;

   从存取器方法返回新对象模式
getter方法返回的是该类成员变量的拷贝;主要用于返回的变量可能在其它方法中修改;

   复制可变参数模式
传给某个方法的参数是某个对象的拷贝;主要用于该方法可能改变该变量的值,但这并不是编程人员期望的结果;

测试模式
   黑盒测试模式
通过设计符合独立需求的测试来保证软件符合要求,测试不必基于所实现的方式;即不用关心内部的实现方法;

   白盒测试模式
测试软件的所有必要情况,根据软件的内在结构来确定这些必要情况。一个完整的测试将测试软件所有可能经过的路径。一般由开发人员完成。

   单元测试模式
将程序中的一个单独的类从其它类中隔离出来进行测试;如果该类依赖其它类,可以设计这些类的虚拟版本,即只包括枝节状的类方法;

   集合测试模式
将单独开发好的类集合到一起进行的测试;可能也会去设计一些类的虚拟版本辅助测试;

   系统测试模式
将程序当成一个完整的版本,在一个与它运行的环境相似的环境中测试,确保它符合规范。

   回归测试模式
用一套测试随时跟踪软件测试的结果,允许用户监控译码的完成过程,可以象程序员一样处理增加的变化。允许用户判定一个程序的变化是否导致了新的故障;

   验收测试模式
为确保发布的软件符合用户的需求,一般由用户实现测试用例。它按照某个计划来实现,其目的是为了确保软件的开发者和使用者都共同认证软件的用途是完善的和准备充分的。

   静室测试模式
软件的设计人员与软件的测试人员不讨论他们的设计规范或实现过程。

发表于2004-8-21 9:26:33

整理于2005-07-01 17:01

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java设计模式练习是指通过实际编码实现,学习和掌握各种设计模式的使用方法和场景。Java设计模式是一套被广泛应用于软件开发中的经典模式,它们提供了一种解决常见问题的标准化方案,并能够提高代码的可性、可维护性和可扩展性。 在Java设计模式练习中,我们可以选择一些常用的设计模式,如单例模式、工厂模式、观察者模式等进行实践。通过实际编写代码,我们可以更好地理解各种设计模式的实现原理和使用方法。 在练习过程中,我们可以使用一些简单的场景进行模拟,例如创建一个线程池管理类来实现单例模式,或者使用工厂模式创建图形对象,然后通过观察者模式来实现图形的更新通知。 通过这些练习,我们可以学习到设计模式的思想和原则,并能够将其应用于实际开发中。这不仅可以提高我们的编码能力,还能够培养我们的设计思维和解决问题的能力。 值得一提的是,设计模式并不是一成不变的,它们可以根据实际需求进行灵活地应用和调整。因此,在练习过程中,我们也应该注重模式的灵活运用,根据具体情况选择适合的设计模式,并善于组合多种模式进行代码的优化和重构。 总之,Java设计模式练习是一种提高编码能力和设计思维的有效方式,通过实践我们能够更好地掌握各种设计模式的使用方法和场景,从而写出更加可、可维护和可扩展的代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值