精华内容
下载资源
问答
  • 以花为元素的设计说明
    万次阅读
    2018-08-13 16:41:28

    第16条提醒我们,对于不是为了继承而设计,并且没有文档说明的“外来”类进行子类化是多么危险。那么对于专门为了继承而设计并具有良好文档说明的类而言,这有意味着什么呢?

    该类的文档必须精确的描述覆盖每个方法所带来的影响。(java.util.AbstractCollection)

     /**
         * Removes a single instance of the specified element from this collection, 
         * if it is present (optional operation).  
         * More formally, removes an element e such that (o==null:o.equals(e)), 
         * if this collection contains one or more such elements. 
         * Returns true if this collection contained the specified element (or
         * equivalently, if this collection changed as a result of the call).
         * 
         * This implementation inerates over the collection looking for the specified element.
         * If it finds the element,it removes the element from the collection using the iterator's remove method.
         * Note that this implementation throws an UnsupportedOperationException 
         * if the iterator removed by this collection's iterator method does not implement the remove method.
         */
        boolean remove(Object o);

    该文档很明确的说明了,覆盖iterator 方法将会影响remove方法的行为。而且,它确切的描述了iterator方法返回的Iterator的行为将会影响remove方法的行为。

    好的API应该描述一个给定的方法做了什么工作,而不是描述他是如何做到的。上面的API违反了这句话,这正式继承破坏了封装性所带来的不幸后果。

    为了继承而进行的设计不仅仅涉及自用模式的文档设计。为了是程序员能够编写出更加有效的子类,而无需承受不必要的痛苦,类必须通过某种形式提供适当的钩子,以便能够进入到它的内部工作流程中,这种形式可以是精心选择的受保护的方法,也可以是受保护的域。(java.util.AbstractList):

         /**
         * Removes from this list all of the elements whose index is between
         * {@code fromIndex}, inclusive, and {@code toIndex}, exclusive.
         * Shifts any succeeding elements to the left (reduces their index).
         * This call shortens the list by {@code (toIndex - fromIndex)} elements.
         * (If {@code toIndex==fromIndex}, this operation has no effect.)
         *
         * <p>This method is called by the {@code clear} operation on this list
         * and its subLists.  Overriding this method to take advantage of
         * the internals of the list implementation can <i>substantially</i>
         * improve the performance of the {@code clear} operation on this list
         * and its subLists.
         *
         * <p>This implementation gets a list iterator positioned before
         * {@code fromIndex}, and repeatedly calls {@code ListIterator.next}
         * followed by {@code ListIterator.remove} until the entire range has
         * been removed.  <b>Note: if {@code ListIterator.remove} requires linear
         * time, this implementation requires quadratic time.</b>
         *
         * @param fromIndex index of first element to be removed
         * @param toIndex index after last element to be removed
         */
        protected void removeRange(int fromIndex, int toIndex) ;
    参数: 
    fromIndex 要移除的第一个元素的索引。
    toIndex 要移除的最后一个元素的索引。
    

    这个方法对于List实现的最终用户没有意义。提供该方法的唯一目的在于,使子类更容易提供针对子列表的快速clear方法。如果没有removeRange方法,当在子列表上调用clear方法,子类将不得不用平方级的时间来完成他的工作。否则,就得重新编写真个subList机制,这可不是件容易的事情!

    因此,当你为了继承而设计的类的时候,如何决定应该暴露那些受保护的方法或者域呢?遗憾的是,并没有神奇的法则可供你使用。唯一的方法就是测试。

    对于为了继承而设计的类,唯一的测试方法就是编写子类。经验表明,3个子类通常就足可以测试一个可扩展的类。

    为了允许继承,类还必须遵守其他的一些约束。构造器绝不能调用可被覆盖的方法,无论是直接调用还是间接调用。
    例如:

        public class Super{
            //Broken - constructor invokes an overridable method
            public Super{
                overrideMe();
            }
    
            public void overrideMe(){
            }
        }
    

    下面的子类覆盖了方法overrideMe,Super唯一的构造器就错误的调用了这个方法:

    public final class Sub extends Super{
            private final Date date;//Blank final,set by constructor
    
            Sub(){
                date=new Date();
            }
    
            //Overriding method invoked by superclass constructor
            @Override
            public void overrideMe(){
                Systen.out.println(date);
            }
    
            public static void main(String[] args){
                Sub sub=new Sub();
                sub.overrideMe();
            }
        }

    你可能会期待这个程序会打印出日期俩次,但是它第一次打印出的是null,因为overrideMe方法被Super构造器调用的时候,构造器Sub还没有机会初始化Date域。

    在为了继承而设计的类的时候,Cloneable和Serializable接口出现了特殊的困难。如果类是为了继承而被设计的,无论实现这其中的那个接口通常都不是一个好主意,因为他们它一下实质性的负担转嫁到扩展这个类的程序员的身上。

    如果你决定在一个为了继承而设计的类中实现Cloneable或者Serializable接口,就应该意识到,因为clone和readObject方法在行为上非常类似于构造器,所以类似的限制规则也是使用的:无论是clone还是readObject,都不可以调用可覆盖的方法,不管是以直接还是间接的方式。

    如果你决定在一个为了继承而设计的类中实现Serializable,并且该类有一个readResolve或者writeReplace方法,就必须使readResolve或者writeReplace成为受保护的方法,而不是私有的方法。

    更多相关内容
  • 一、软件需求说明书 1引言 2 1.1编写目的 2 1.2背景 2 1.3定义 2 1.4参考资料 2 2任务概述 2 2.1目标 2 2.2用户的特点 3 2.3假定和约束 3 3需求规定 3 3.1对功能的规定 3 3.2对性能的规定 3 3.2.1精度 ...

    转自:https://www.cnblogs.com/peizhe123/p/5511505.html

    一、软件需求说明书
    1引言 2
    1.1编写目的 2
    1.2背景 2
    1.3定义 2
    1.4参考资料 2
    2任务概述 2
    2.1目标 2
    2.2用户的特点 3
    2.3假定和约束 3
    3需求规定 3
    3.1对功能的规定 3
    3.2对性能的规定 3
    3.2.1精度 3
    3.2.2时间特性要求 3
    3.2.3灵活性 4
    3.3输人输出要求 4
    3.4数据管理能力要求 4
    3.5故障处理要求 4
    3.6其他专门要求 5
    4运行环境规定 5
    4.1设备 5
    4.2支持软件 5
    4.3接口 5
    4.4控制 5
     
    软件需求说明书的编写提示
    1引言
    1.1编写目的
    说明编写这份软件需求说明书的目的,指出预期的读者。
    1.2背景
    说明:
    a. 待开发的软件系统的名称;
    b. 本项目的任务提出者、开发者、用户及实现该软件的计算中心或计算机网络;
    c. 该软件系统同其他系统或其他机构的基本的相互来往关系。 
    1.3定义
    列出本文件中用到的专门术语的定义和外文首字母组词的原词组。
    1.4参考资料
    列出用得着的参考资料,如:
    a. 本项目的经核准的计划任务书或合同、上级机关的批文;
    b. 属于本项目的其他已发表的文件;
    c. 本文件中各处引用的文件、资料、包括所要用到的软件开发标准。 列出这些文件资料的标题、文件编号、发表日期和出版单位,说明能够得到这些文件资料的来源。
    2任务概述
    2.1目标
    叙述该项软件开发的意图、应用目标、作用范围以及其他应向读者说明的有关该软件开发的背景材料。解释被开发软件与其他有关软件之间的关系。如果本软件产品是一项独立的软件,而且全部内容自含,则说明这一点。如果所定义的产品是一个更大的系统的一个组成部分,则应说明本产品与该系统中其他各组成部分之间的关系,为此可使用一张方框图来说明该系统的组成和本产品同其他各部分的联系和接口。|
    2.2用户的特点
    列出本软件的最终用户的特点,充分说明操作人员、维护人员的教育水平和技术专长,以及本软件的预期使甩频度。这些是软件设计工作的重要约束
    2.3假定和约束
    列出进行本软件开发工作的假定和约束,例如经费限制、开发期限等。
    3需求规定 
    3.1对功能的规定
    用列表的方式(例如IPO表即输入、处理、输出表的形式),逐项定量和定性地叙述对软件所提出的功能要求,说明输入什么量、经怎样的处理、得到什么输出,说明软件应支持的终端数和应支持的并行操作的用户数。
    3.2对性能的规定
    3.2.1精度
    说明对该软件的输入、输出数据精度的要求,可能包括传输过程中的精度。
    3.2.2时间特性要求
    说明对于该软件的时间特性要求,如对:
    a. 响应时间;
    b. 更新处理时间;
    c. 数据的转换和传送时间;
    d. 解题时间;等的要求。
    3.2.3灵活性
    说明对该软件的灵活性的要求,即当需求发生某些变化时,该软件对这些变化的适应能力,如:
    a. 操作方式上的变化;
    b. 运行环境的变化;
    c. 同其他软件的接口的变化;
    d. 精度和有效时限的变化;
    e. 计划的变化或改进。
    对于为了提供这些灵活性而进行的专门设计的部分应该加以标明。
    3.3输人输出要求
    解释各输入输出数据类型,并逐项说明其媒体、格式、数值范围、精度等。对软件的数据输出及必须标明的控制输出量进行解释并举例,包括对硬拷贝报告(正常结果输出、状态输出及异常输出)以及图形或显示报告的描述。
    3.4数据管理能力要求
    说明需要管理的文卷和记录的个数、表和文卷的大小规模,要按可预见的增长对数据及其分量的存储要求作出估算。
    3.5故障处理要求
    列出可能的软件、硬件故障以及对各项性能而言所产生的后果和对故障处理的要求。
    3.6其他专门要求
    如用户单位对安全保密的要求,对使用方便的要求,对可维护性、可补充性、易读性、可靠性、运行环境可转换性的特殊要求等。
    4运行环境规定
    4.1设备
    列出运行该软件所需要的硬设备。说明其中的新型设备及其专门功能,包括:
    a. 处理器型号及内存容量;
    b. 外存容量、联机或脱机、媒体及其存储格式,设备的型号及数量;
    c. 输入及输出设备的型号和数量,联机或脱机;
    d. 数据通信设备的型号和数量;
    e. 功能键及其他专用硬件
    4.2支持软件
    列出支持软件,包括要用到的操作系统、编译(或汇编)程序、测试支持软件等。
    4.3接口
    说明该软件同其他软件之间的接口、数据通信协议等。
    4.4控制
    说明控制该软件的运行的方法和控制信号,并说明这些控制信号的来源。


     
    二、概要设计说明书
    1引言 2
    1.1编写目的 2
    1.2背景 2
    1.3定义 2
    1.4参考资料 2
    2总体设计 2
    2.1需求规定 2
    2.2运行环境 2
    2.3基本设计概念和处理流程 3
    2.4结构 3
    2.5功能器求与程序的关系 3
    2.6人工处理过程 3
    2.7尚未问决的问题 3
    3接口设计 3
    3.1用户接口 3
    3.2外部接口 3
    3.3内部接口 4
    4运行设计 4
    4.1运行模块组合 4
    4.2运行控制 4
    4.3运行时间 4
    5系统数据结构设计 4
    5.1逻辑结构设计要点 4
    5.2物理结构设计要点 4
    5.3数据结构与程序的关系 4
    6系统出错处理设计 5
    6.1出错信息 5
    6.2补救措施 5
    6.3系统维护设计 5
     
    概要设计说明书
    1引言
    1.1编写目的
    说明编写这份概要设计说明书的目的,指出预期的读者。
    1.2背景
    说明:
    a. 待开发软件系统的名称;
    b. 列出此项目的任务提出者、开发者、用户以及将运行该软件的计算站(中心)。
    1.3定义
    列出本文件中用到的专门术语的定义和外文首字母组词的原词组。
    1.4参考资料
    列出有关的参考文件,如:
    a. 本项目的经核准的计划任务书或合同,上级机关的批文;
    b. 属于本项目的其他已发表文件;
    c. 本文件中各处引用的文件、资料,包括所要用到的软件开发标准。列出这些文件的标题、文件编号、发表日期和出版单位,说明能够得到这些文件资料的来源。
    2总体设计
    2.1需求规定
    说明对本系统的主要的输入输出项目、处理的功能性能要求,详细的说明可参见附录C。
    2.2运行环境
    简要地说明对本系统的运行环境(包括硬件环境和支持环境)的规定,详细说明参见附录C。
    2.3基本设计概念和处理流程
    说明本系统的基本设计概念和处理流程,尽量使用图表的形式。
    2.4结构
    用一览表及框图的形式说明本系统的系统元素(各层模块、子程序、公用程序等)的划分,扼要说明每个系统元素的标识符和功能,分层次地给出各元素之间的控制与被控制关系.
    2.5功能器求与程序的关系
    本条用一张如下的矩阵图说明各项功能需求的实现同各块程序的分配关系:
     程序1 程序2 …… 程序n
    功能需求1 √   
    功能需求2  √  
    ……    
    功能需求n  √  √
    2.6人工处理过程
    说明在本软件系统的工作过程中不得不包含的人工处理过程(如果有的话)。
    2.7尚未问决的问题
    说明在概要设计过程中尚未解决而设计者认为在系统完成之前必须解决的各个问题。
    3接口设计
    3.1用户接口
    说明将向用户提供的命令和它们的语法结构,以及软件的回答信息。
    3.2外部接口
    说明本系统同外界的所有接口的安排包括软件与硬件之间的接口、本系统与各支持软件之间的接口关系。
    3.3内部接口
    说明本系统之内的各个系统元素之间的接口的安排。
    4运行设计
    4.1运行模块组合
    说明对系统施加不同的外界运行控制时所引起的各种不同的运行模块组合,说明每种运行所历经的内部模块和支持软件。
    4.2运行控制
    说明每一种外界的运行控制的方式方法和操作步骤。
    4.3运行时间
    说明每种运行模块组合将占用各种资源的时间。
    5系统数据结构设计
    5.1逻辑结构设计要点
    给出本系统内所使用的每个数据结构的名称、标识符以及它们之中每个数据项、记录、文卷和系的标识、定义、长度及它们之间的层次的或表格的相互关系。
    5.2物理结构设计要点
    给出本系统内所使用的每个数据结构中的每个数据项的存储要求,访问方法、存取单位、存取的物理关系(索引、设备、存储区域)、设计考虑和保密条件。
    5.3数据结构与程序的关系
    说明各个数据结构与访问这些数据结构的形式:
    6系统出错处理设计
    6.1出错信息
    用一览表的方式说朗每种可能的出错或故障情况出现时,系统输出信息的形式、含意及处理方法。
    6.2补救措施
    说明故障出现后可能采取的变通措施,包括:
    a. 后备技术说明准备采用的后备技术,当原始系统数据万一丢失时启用的副本的建立和启动的技术,例如周期性地把磁盘信息记录到磁带上去就是对于磁盘媒体的一种后备技术;
    b. 降效技术说明准备采用的后备技术,使用另一个效率稍低的系统或方法来求得所需结果的某些部分,例如一个自动系统的降效技术可以是手工操作和数据的人工记录;
    c. 恢复及再启动技术说明将使用的恢复再启动技术,使软件从故障点恢复执行或使软件从头开始重新运行的方法。
    6.3系统维护设计
    说明为了系统维护的方便而在程序内部设计中作出的安排,包括在程序中专门安排用于系统的检查与维护的检测点和专用模块。 各个程序之间的对应关系,可采用如下的矩阵图的形式;


    三、项目开发计划
    1引言 1
    1.1编写目的 1
    1.2 背景 1
    1.3定义 1
    1.4参考资料 1
    2项目概述 1
    2.1工作内容 1
    2.2主要参加人员 1
    2.3产品 2
    2.3.1程序 2
    2.3.2文件 2
    2.3.3服务 2
    2.3.4非移交的产品 2
    2.4验收标准 2
    2.5完成项目的最迟期限 2
    2.6本计划的批准者和批准日期 2
    3实施计划 2
    3.1工作任务的分解与人员分工 2
    3.2接口人员 3
    3.3进度 3
    3.4预算 3
    3.5关键问题 3
    4支持条件 3
    4.1计算机系统支持 3
    4.2需由用户承担的工作 3
    4.3由外单位提供的条件 4
    5专题计划要点 4
     
    项目开发计划(GB856T——88)
    1引言
    1.1编写目的
    说明:编写这份软件项目开发计划的目的,并指出预期的读者。
    1.2 背景
     说明:
    a. 待开发的软件系统的名称;
    b. 本项目的任务提出者、开发者、用户及实现该软件的计算中心或计算机网络;
    c. 该软件系统同其他系统或其他机构的基本的相互来往关系。
    1.3定义
     列出本文件中用到的专门术语的定义和外文的首字母组词的原词组。
    1.4参考资料
     列出用得着的参考资料,如:
    a. 本项目的经核准的计划任务书和合同、上级机关的批文;
    b. 属于本项目的其他已发表的文件;
    c. 本文件中各处引用的文件、资料,包括所要用到的软件开发标准。列出这些文件资料的标题、文件编号、发表日期和出版单位,说明能够得到这些文件资料的来源。
    2项目概述
    2.1工作内容
     简要地说明在本项目的开发中须进行的各项主要工作。
    2.2主要参加人员
     扼要说明参加本项目开发的主要人员的情况,包括他们的技术水平。
    2.3产品
    2.3.1程序
     列出须移交给用户的程序的名称、所用地编程语言及存储程序的媒体形式,并通过引用相关文件,逐项说明其功能和能力。
    2.3.2文件
     列出须移交用户的每种文件的名称及内容要点。
    2.3.3服务
     列出需向用户提供的各项服务,如培训安装、维护和运行支持等,应逐项规定开始日期、所提供支持的级别和服务的期限。
    2.3.4非移交的产品
     说明开发集体应向本单位交出但不必向用户移交的产品(文件甚至某些程序)。
    2.4验收标准
     对于上述这些应交出的产品和服务,逐项说明或引用资料说明验收标准。
    2.5完成项目的最迟期限
    2.6本计划的批准者和批准日期
    3实施计划
    3.1工作任务的分解与人员分工
     对于项目开发中需要完成的各项工作,从需求分析、设计、实现、测试直到维护,包括文件的编制、审批、打印、分发工作,用户培训工作,软件安装工作等,按层次进行分解,指明每项任务的负责人和参加人员。
    3.2接口人员
     说明负责接口工作的人员及他们的职责,包括:
    a. 负责本项目同用户的接口人员;
    b. 负责本项目同本单位各管理机构,如合同计划管理部门、财务部门、质量管理部门等的接口人员;
    c. 负责本项目同个份合同负责单位的接口人员等。
    3.3进度
     对于需求分析、设计、编码实现、测试、移交、培训和安装等工作,给出每项工作任务的预定开始日期、完成日期及所需资源,规定各项工作任务完成的先后顺序以及表征每项工作任务完成的标志性事件(即所谓“里程碑)。
    3.4预算
     逐项列出本开发项目所需要的劳务(包括人员的数量和时间)以及经费的预算(包括办公费、差旅费、机时费、资料费、通讯设备和专用设备的租金等)和来源。
    3.5关键问题
     逐项列出能够影响整个项目成败的关键问题、技术难点和风险,指出这些问题对项目的影响。
    4支持条件
     说明为支持本项目的开发所需要的各种条件和设施。
    4.1计算机系统支持
     逐项列出开发中和运行时所需的计算机系统支持,包括计算机、外围设备、通讯设备、模拟器、编译(或汇编)程序、操作系统、数据管理程序包、数据存储能力和测试支持能力等,逐项给出有关到货日期、使用时间的要求。
    4.2需由用户承担的工作
     逐项列出需要用户承担的工作和完成期限。包括需由用户提供的条件及提供时间。
    4.3由外单位提供的条件
     逐项列出需要外单位分合同承包者承担的工作和完成的时间,包括需要由外单位提供的条件和提供的时间。
    5专题计划要点
     说明本项目开发中需制定的各个专题计划(如分合同计划、开发人员培训计划、测试计划、安全保密计划、质量保证计划、配置管理计划、用户培训计划、系统安装计划等)的要点。

    四、详细设计说明书
    1引言 2
    1.1编写目的 2
    1.2背景 2
    1.3定义 2
    1.4参考资料 2
    2程序系统的结构 2
    3程序1(标识符)设计说明 2
    3.1程序描述 3
    3.2功能 3
    3.3性能 3
    3.4输人项 3
    3.5输出项 3
    3.6算法 3
    3.7流程逻辑 3
    3.8接口 3
    3.9存储分配 4
    3.10注释设计 4
    3.11限制条件 4
    3.12测试计划 4
    3.13尚未解决的问题 4
    4程序2(标识符)设计说明 4
     
    详细设计说明书
    1引言
    1.1编写目的
    说明编写这份详细设计说明书的目的,指出预期的读者。
    1.2背景
    说明:
    a. 待开发软件系统的名称;
    b. 本项目的任务提出者、开发者、用户和运行该程序系统的计算中心。
    1.3定义
    列出本文件中用到专门术语的定义和外文首字母组词的原词组。
    1.4参考资料
    列出有关的参考资料,如:
    a. 本项目的经核准的计划任务书或合同、上级机关的批文;
    b. 属于本项目的其他已发表的文件;
    c. 本文件中各处引用到的文件资料,包括所要用到的软件开发标准。列出这些文件的标题、文件编号、发表日期和出版单位,说明能够取得这些文件的来源。
    2程序系统的结构
    用一系列图表列出本程序系统内的每个程序(包括每个模块和子程序)的名称、标识符和它们之间 的层次结构关系。
    3程序1(标识符)设计说明
    从本章开始,逐个地给出各个层次中的每个程序的设计考虑。以下给出的提纲是针对一般情况的。对于一个具体的模块,尤其是层次比较低的模块或子程序,其很多条目的内容往往与它所隶属的上一层 模块的对应条目的内容相同,在这种情况下,只要简单地说明这一点即可。
    3.1程序描述
    给出对该程序的简要描述,主要说明安排设计本程序的目的意义,并且,还要说明本程序的特点(如 是常驻内存还是非常驻?是否子程序?是可重人的还是不可重人的?有无覆盖要求?是顺序处理还是并发处理等)。
    3.2功能
    说明该程序应具有的功能,可采用IPO图(即输入一处理一输出图)的形式。
    3.3性能
    说明对该程序的全部性能要求,包括对精度、灵活性和时间特性的要求。
    3.4输人项
    给出对每一个输入项的特性,包括名称、标识、数据的类型和格式、数据值的有效范围、输入的方式。数量和频度、输入媒体、输入数据的来源和安全保密条件等等。
    3.5输出项
    给出对每一个输出项的特性,包括名称、标识、数据的类型和格式,数据值的有效范围,输出的形式、数量和频度,输出媒体、对输出图形及符号的说明、安全保密条件等等。
    3.6算法
    详细说明本程序所选用的算法,具体的计算公式和计算步骤。
    3.7流程逻辑
    用图表(例如流程图、判定表等)辅以必要的说明来表示本程序的逻辑流程。
    3.8接口
    用图的形式说明本程序所隶属的上一层模块及隶属于本程序的下一层模块、子程序,说明参数赋值和调用方式,说明与本程序相直接关联的数据结构(数据库、数据文卷)。
    3.9存储分配
    根据需要,说明本程序的存储分配。
    3.10注释设计
    说明准备在本程序中安排的注释,如:
    a. 加在模块首部的注释;
    b. 加在各分枝点处的注释;
    c. 对各变量的功能、范围、缺省条件等所加的注释;
    d. 对使用的逻辑所加的注释等等。
    3.11限制条件
    说明本程序运行中所受到的限制条件。
    3.12测试计划
    说明对本程序进行单体测试的计划,包括对测试的技术要求、输入数据、预期结果、进度安排、人员职责、设备条件驱动程序及桩模块等的规定。
    3.13尚未解决的问题
    说明在本程序的设计中尚未解决而设计者认为在软件完成之前应解决的问题。
    4程序2(标识符)设计说明
    用类似F.3的方式,说明第2个程序乃至第N个程序的设计考虑。
    ......

    展开全文
  • 转自:https://www.cnblogs.com/peizhe123/p/5511505.html 一、软件需求说明...

    一、软件需求说明书
    1引言 2
    1.1编写目的 2
    1.2背景 2
    1.3定义 2
    1.4参考资料 2
    2任务概述 2
    2.1目标 2
    2.2用户的特点 3
    2.3假定和约束 3
    3需求规定 3
    3.1对功能的规定 3
    3.2对性能的规定 3
    3.2.1精度 3
    3.2.2时间特性要求 3
    3.2.3灵活性 4
    3.3输人输出要求 4
    3.4数据管理能力要求 4
    3.5故障处理要求 4
    3.6其他专门要求 5
    4运行环境规定 5
    4.1设备 5
    4.2支持软件 5
    4.3接口 5
    4.4控制 5
     
    软件需求说明书的编写提示
    1引言
    1.1编写目的
    说明编写这份软件需求说明书的目的,指出预期的读者。
    1.2背景
    说明:
    a. 待开发的软件系统的名称;
    b. 本项目的任务提出者、开发者、用户及实现该软件的计算中心或计算机网络;
    c. 该软件系统同其他系统或其他机构的基本的相互来往关系。 
    1.3定义
    列出本文件中用到的专门术语的定义和外文首字母组词的原词组。
    1.4参考资料
    列出用得着的参考资料,如:
    a. 本项目的经核准的计划任务书或合同、上级机关的批文;
    b. 属于本项目的其他已发表的文件;
    c. 本文件中各处引用的文件、资料、包括所要用到的软件开发标准。 列出这些文件资料的标题、文件编号、发表日期和出版单位,说明能够得到这些文件资料的来源。
    2任务概述
    2.1目标
    叙述该项软件开发的意图、应用目标、作用范围以及其他应向读者说明的有关该软件开发的背景材料。解释被开发软件与其他有关软件之间的关系。如果本软件产品是一项独立的软件,而且全部内容自含,则说明这一点。如果所定义的产品是一个更大的系统的一个组成部分,则应说明本产品与该系统中其他各组成部分之间的关系,为此可使用一张方框图来说明该系统的组成和本产品同其他各部分的联系和接口。|
    2.2用户的特点
    列出本软件的最终用户的特点,充分说明操作人员、维护人员的教育水平和技术专长,以及本软件的预期使甩频度。这些是软件设计工作的重要约束
    2.3假定和约束
    列出进行本软件开发工作的假定和约束,例如经费限制、开发期限等。
    3需求规定 
    3.1对功能的规定
    用列表的方式(例如IPO表即输入、处理、输出表的形式),逐项定量和定性地叙述对软件所提出的功能要求,说明输入什么量、经怎样的处理、得到什么输出,说明软件应支持的终端数和应支持的并行操作的用户数。
    3.2对性能的规定
    3.2.1精度
    说明对该软件的输入、输出数据精度的要求,可能包括传输过程中的精度。
    3.2.2时间特性要求
    说明对于该软件的时间特性要求,如对:
    a. 响应时间;
    b. 更新处理时间;
    c. 数据的转换和传送时间;
    d. 解题时间;等的要求。
    3.2.3灵活性
    说明对该软件的灵活性的要求,即当需求发生某些变化时,该软件对这些变化的适应能力,如:
    a. 操作方式上的变化;
    b. 运行环境的变化;
    c. 同其他软件的接口的变化;
    d. 精度和有效时限的变化;
    e. 计划的变化或改进。
    对于为了提供这些灵活性而进行的专门设计的部分应该加以标明。
    3.3输人输出要求
    解释各输入输出数据类型,并逐项说明其媒体、格式、数值范围、精度等。对软件的数据输出及必须标明的控制输出量进行解释并举例,包括对硬拷贝报告(正常结果输出、状态输出及异常输出)以及图形或显示报告的描述。
    3.4数据管理能力要求
    说明需要管理的文卷和记录的个数、表和文卷的大小规模,要按可预见的增长对数据及其分量的存储要求作出估算。
    3.5故障处理要求
    列出可能的软件、硬件故障以及对各项性能而言所产生的后果和对故障处理的要求。
    3.6其他专门要求
    如用户单位对安全保密的要求,对使用方便的要求,对可维护性、可补充性、易读性、可靠性、运行环境可转换性的特殊要求等。
    4运行环境规定
    4.1设备
    列出运行该软件所需要的硬设备。说明其中的新型设备及其专门功能,包括:
    a. 处理器型号及内存容量;
    b. 外存容量、联机或脱机、媒体及其存储格式,设备的型号及数量;
    c. 输入及输出设备的型号和数量,联机或脱机;
    d. 数据通信设备的型号和数量;
    e. 功能键及其他专用硬件
    4.2支持软件
    列出支持软件,包括要用到的操作系统、编译(或汇编)程序、测试支持软件等。
    4.3接口
    说明该软件同其他软件之间的接口、数据通信协议等。
    4.4控制
    说明控制该软件的运行的方法和控制信号,并说明这些控制信号的来源。


     
    二、概要设计说明书
    1引言 2
    1.1编写目的 2
    1.2背景 2
    1.3定义 2
    1.4参考资料 2
    2总体设计 2
    2.1需求规定 2
    2.2运行环境 2
    2.3基本设计概念和处理流程 3
    2.4结构 3
    2.5功能器求与程序的关系 3
    2.6人工处理过程 3
    2.7尚未问决的问题 3
    3接口设计 3
    3.1用户接口 3
    3.2外部接口 3
    3.3内部接口 4
    4运行设计 4
    4.1运行模块组合 4
    4.2运行控制 4
    4.3运行时间 4
    5系统数据结构设计 4
    5.1逻辑结构设计要点 4
    5.2物理结构设计要点 4
    5.3数据结构与程序的关系 4
    6系统出错处理设计 5
    6.1出错信息 5
    6.2补救措施 5
    6.3系统维护设计 5
     
    概要设计说明书
    1引言
    1.1编写目的
    说明编写这份概要设计说明书的目的,指出预期的读者。
    1.2背景
    说明:
    a. 待开发软件系统的名称;
    b. 列出此项目的任务提出者、开发者、用户以及将运行该软件的计算站(中心)。
    1.3定义
    列出本文件中用到的专门术语的定义和外文首字母组词的原词组。
    1.4参考资料
    列出有关的参考文件,如:
    a. 本项目的经核准的计划任务书或合同,上级机关的批文;
    b. 属于本项目的其他已发表文件;
    c. 本文件中各处引用的文件、资料,包括所要用到的软件开发标准。列出这些文件的标题、文件编号、发表日期和出版单位,说明能够得到这些文件资料的来源。
    2总体设计
    2.1需求规定
    说明对本系统的主要的输入输出项目、处理的功能性能要求,详细的说明可参见附录C。
    2.2运行环境
    简要地说明对本系统的运行环境(包括硬件环境和支持环境)的规定,详细说明参见附录C。
    2.3基本设计概念和处理流程
    说明本系统的基本设计概念和处理流程,尽量使用图表的形式。
    2.4结构
    用一览表及框图的形式说明本系统的系统元素(各层模块、子程序、公用程序等)的划分,扼要说明每个系统元素的标识符和功能,分层次地给出各元素之间的控制与被控制关系.
    2.5功能器求与程序的关系
    本条用一张如下的矩阵图说明各项功能需求的实现同各块程序的分配关系:
     程序1 程序2 …… 程序n
    功能需求1 √   
    功能需求2  √  
    ……    
    功能需求n  √  √
    2.6人工处理过程
    说明在本软件系统的工作过程中不得不包含的人工处理过程(如果有的话)。
    2.7尚未问决的问题
    说明在概要设计过程中尚未解决而设计者认为在系统完成之前必须解决的各个问题。
    3接口设计
    3.1用户接口
    说明将向用户提供的命令和它们的语法结构,以及软件的回答信息。
    3.2外部接口
    说明本系统同外界的所有接口的安排包括软件与硬件之间的接口、本系统与各支持软件之间的接口关系。
    3.3内部接口
    说明本系统之内的各个系统元素之间的接口的安排。
    4运行设计
    4.1运行模块组合
    说明对系统施加不同的外界运行控制时所引起的各种不同的运行模块组合,说明每种运行所历经的内部模块和支持软件。
    4.2运行控制
    说明每一种外界的运行控制的方式方法和操作步骤。
    4.3运行时间
    说明每种运行模块组合将占用各种资源的时间。
    5系统数据结构设计
    5.1逻辑结构设计要点
    给出本系统内所使用的每个数据结构的名称、标识符以及它们之中每个数据项、记录、文卷和系的标识、定义、长度及它们之间的层次的或表格的相互关系。
    5.2物理结构设计要点
    给出本系统内所使用的每个数据结构中的每个数据项的存储要求,访问方法、存取单位、存取的物理关系(索引、设备、存储区域)、设计考虑和保密条件。
    5.3数据结构与程序的关系
    说明各个数据结构与访问这些数据结构的形式:
    6系统出错处理设计
    6.1出错信息
    用一览表的方式说朗每种可能的出错或故障情况出现时,系统输出信息的形式、含意及处理方法。
    6.2补救措施
    说明故障出现后可能采取的变通措施,包括:
    a. 后备技术说明准备采用的后备技术,当原始系统数据万一丢失时启用的副本的建立和启动的技术,例如周期性地把磁盘信息记录到磁带上去就是对于磁盘媒体的一种后备技术;
    b. 降效技术说明准备采用的后备技术,使用另一个效率稍低的系统或方法来求得所需结果的某些部分,例如一个自动系统的降效技术可以是手工操作和数据的人工记录;
    c. 恢复及再启动技术说明将使用的恢复再启动技术,使软件从故障点恢复执行或使软件从头开始重新运行的方法。
    6.3系统维护设计
    说明为了系统维护的方便而在程序内部设计中作出的安排,包括在程序中专门安排用于系统的检查与维护的检测点和专用模块。 各个程序之间的对应关系,可采用如下的矩阵图的形式;


    三、项目开发计划
    1引言 1
    1.1编写目的 1
    1.2 背景 1
    1.3定义 1
    1.4参考资料 1
    2项目概述 1
    2.1工作内容 1
    2.2主要参加人员 1
    2.3产品 2
    2.3.1程序 2
    2.3.2文件 2
    2.3.3服务 2
    2.3.4非移交的产品 2
    2.4验收标准 2
    2.5完成项目的最迟期限 2
    2.6本计划的批准者和批准日期 2
    3实施计划 2
    3.1工作任务的分解与人员分工 2
    3.2接口人员 3
    3.3进度 3
    3.4预算 3
    3.5关键问题 3
    4支持条件 3
    4.1计算机系统支持 3
    4.2需由用户承担的工作 3
    4.3由外单位提供的条件 4
    5专题计划要点 4
     
    项目开发计划(GB856T——88)
    1引言
    1.1编写目的
    说明:编写这份软件项目开发计划的目的,并指出预期的读者。
    1.2 背景
     说明:
    a. 待开发的软件系统的名称;
    b. 本项目的任务提出者、开发者、用户及实现该软件的计算中心或计算机网络;
    c. 该软件系统同其他系统或其他机构的基本的相互来往关系。
    1.3定义
     列出本文件中用到的专门术语的定义和外文的首字母组词的原词组。
    1.4参考资料
     列出用得着的参考资料,如:
    a. 本项目的经核准的计划任务书和合同、上级机关的批文;
    b. 属于本项目的其他已发表的文件;
    c. 本文件中各处引用的文件、资料,包括所要用到的软件开发标准。列出这些文件资料的标题、文件编号、发表日期和出版单位,说明能够得到这些文件资料的来源。
    2项目概述
    2.1工作内容
     简要地说明在本项目的开发中须进行的各项主要工作。
    2.2主要参加人员
     扼要说明参加本项目开发的主要人员的情况,包括他们的技术水平。
    2.3产品
    2.3.1程序
     列出须移交给用户的程序的名称、所用地编程语言及存储程序的媒体形式,并通过引用相关文件,逐项说明其功能和能力。
    2.3.2文件
     列出须移交用户的每种文件的名称及内容要点。
    2.3.3服务
     列出需向用户提供的各项服务,如培训安装、维护和运行支持等,应逐项规定开始日期、所提供支持的级别和服务的期限。
    2.3.4非移交的产品
     说明开发集体应向本单位交出但不必向用户移交的产品(文件甚至某些程序)。
    2.4验收标准
     对于上述这些应交出的产品和服务,逐项说明或引用资料说明验收标准。
    2.5完成项目的最迟期限
    2.6本计划的批准者和批准日期
    3实施计划
    3.1工作任务的分解与人员分工
     对于项目开发中需要完成的各项工作,从需求分析、设计、实现、测试直到维护,包括文件的编制、审批、打印、分发工作,用户培训工作,软件安装工作等,按层次进行分解,指明每项任务的负责人和参加人员。
    3.2接口人员
     说明负责接口工作的人员及他们的职责,包括:
    a. 负责本项目同用户的接口人员;
    b. 负责本项目同本单位各管理机构,如合同计划管理部门、财务部门、质量管理部门等的接口人员;
    c. 负责本项目同个份合同负责单位的接口人员等。
    3.3进度
     对于需求分析、设计、编码实现、测试、移交、培训和安装等工作,给出每项工作任务的预定开始日期、完成日期及所需资源,规定各项工作任务完成的先后顺序以及表征每项工作任务完成的标志性事件(即所谓“里程碑)。
    3.4预算
     逐项列出本开发项目所需要的劳务(包括人员的数量和时间)以及经费的预算(包括办公费、差旅费、机时费、资料费、通讯设备和专用设备的租金等)和来源。
    3.5关键问题
     逐项列出能够影响整个项目成败的关键问题、技术难点和风险,指出这些问题对项目的影响。
    4支持条件
     说明为支持本项目的开发所需要的各种条件和设施。
    4.1计算机系统支持
     逐项列出开发中和运行时所需的计算机系统支持,包括计算机、外围设备、通讯设备、模拟器、编译(或汇编)程序、操作系统、数据管理程序包、数据存储能力和测试支持能力等,逐项给出有关到货日期、使用时间的要求。
    4.2需由用户承担的工作
     逐项列出需要用户承担的工作和完成期限。包括需由用户提供的条件及提供时间。
    4.3由外单位提供的条件
     逐项列出需要外单位分合同承包者承担的工作和完成的时间,包括需要由外单位提供的条件和提供的时间。
    5专题计划要点
     说明本项目开发中需制定的各个专题计划(如分合同计划、开发人员培训计划、测试计划、安全保密计划、质量保证计划、配置管理计划、用户培训计划、系统安装计划等)的要点。

    四、详细设计说明书
    1引言 2
    1.1编写目的 2
    1.2背景 2
    1.3定义 2
    1.4参考资料 2
    2程序系统的结构 2
    3程序1(标识符)设计说明 2
    3.1程序描述 3
    3.2功能 3
    3.3性能 3
    3.4输人项 3
    3.5输出项 3
    3.6算法 3
    3.7流程逻辑 3
    3.8接口 3
    3.9存储分配 4
    3.10注释设计 4
    3.11限制条件 4
    3.12测试计划 4
    3.13尚未解决的问题 4
    4程序2(标识符)设计说明 4
     
    详细设计说明书
    1引言
    1.1编写目的
    说明编写这份详细设计说明书的目的,指出预期的读者。
    1.2背景
    说明:
    a. 待开发软件系统的名称;
    b. 本项目的任务提出者、开发者、用户和运行该程序系统的计算中心。
    1.3定义
    列出本文件中用到专门术语的定义和外文首字母组词的原词组。
    1.4参考资料
    列出有关的参考资料,如:
    a. 本项目的经核准的计划任务书或合同、上级机关的批文;
    b. 属于本项目的其他已发表的文件;
    c. 本文件中各处引用到的文件资料,包括所要用到的软件开发标准。列出这些文件的标题、文件编号、发表日期和出版单位,说明能够取得这些文件的来源。
    2程序系统的结构
    用一系列图表列出本程序系统内的每个程序(包括每个模块和子程序)的名称、标识符和它们之间 的层次结构关系。
    3程序1(标识符)设计说明
    从本章开始,逐个地给出各个层次中的每个程序的设计考虑。以下给出的提纲是针对一般情况的。对于一个具体的模块,尤其是层次比较低的模块或子程序,其很多条目的内容往往与它所隶属的上一层 模块的对应条目的内容相同,在这种情况下,只要简单地说明这一点即可。
    3.1程序描述
    给出对该程序的简要描述,主要说明安排设计本程序的目的意义,并且,还要说明本程序的特点(如 是常驻内存还是非常驻?是否子程序?是可重人的还是不可重人的?有无覆盖要求?是顺序处理还是并发处理等)。
    3.2功能
    说明该程序应具有的功能,可采用IPO图(即输入一处理一输出图)的形式。
    3.3性能
    说明对该程序的全部性能要求,包括对精度、灵活性和时间特性的要求。
    3.4输人项
    给出对每一个输入项的特性,包括名称、标识、数据的类型和格式、数据值的有效范围、输入的方式。数量和频度、输入媒体、输入数据的来源和安全保密条件等等。
    3.5输出项
    给出对每一个输出项的特性,包括名称、标识、数据的类型和格式,数据值的有效范围,输出的形式、数量和频度,输出媒体、对输出图形及符号的说明、安全保密条件等等。
    3.6算法
    详细说明本程序所选用的算法,具体的计算公式和计算步骤。
    3.7流程逻辑
    用图表(例如流程图、判定表等)辅以必要的说明来表示本程序的逻辑流程。
    3.8接口
    用图的形式说明本程序所隶属的上一层模块及隶属于本程序的下一层模块、子程序,说明参数赋值和调用方式,说明与本程序相直接关联的数据结构(数据库、数据文卷)。
    3.9存储分配
    根据需要,说明本程序的存储分配。
    3.10注释设计
    说明准备在本程序中安排的注释,如:
    a. 加在模块首部的注释;
    b. 加在各分枝点处的注释;
    c. 对各变量的功能、范围、缺省条件等所加的注释;
    d. 对使用的逻辑所加的注释等等。
    3.11限制条件
    说明本程序运行中所受到的限制条件。
    3.12测试计划
    说明对本程序进行单体测试的计划,包括对测试的技术要求、输入数据、预期结果、进度安排、人员职责、设备条件驱动程序及桩模块等的规定。
    3.13尚未解决的问题
    说明在本程序的设计中尚未解决而设计者认为在软件完成之前应解决的问题。
    4程序2(标识符)设计说明
    用类似F.3的方式,说明第2个程序乃至第N个程序的设计考虑。
    ......

    展开全文
  • Java常见设计模式总结

    万次阅读 多人点赞 2021-09-18 17:18:54
    设计模式是一套经过反复使用的代码设计经验,目的是为了重用代码、让代码更容易被他人理解、保证代码可靠性。设计模式于己于人于系统都是多赢的,它使得代码编写真正工程化,它是软件工程的基石,如同大厦的一块块...

     一、设计模式总述:

    1、什么是设计模式:

            设计模式是一套经过反复使用的代码设计经验,目的是为了重用代码、让代码更容易被他人理解、保证代码可靠性。 设计模式于己于人于系统都是多赢的,它使得代码编写真正工程化,它是软件工程的基石,如同大厦的一块块砖石一样。项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现实中都有相应的原理来与之对应,每种模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛应用的原因。总体来说,设计模式分为三大类:

    • 创建型模式:共5种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式
    • 结构型模式:共7种:适配器模式、装饰器模式、代理模式、桥接模式、外观模式、组合模式、享元模式
    • 行为型模式:共11种:策略模式、模板方法模式、观察者模式、责任链模式、访问者模式、中介者模式、迭代器模式、命令模式、状态模式、备忘录模式、解释器模式

    其实还有两类:并发型模式和线程池模式,用一个图片来整体描述一下:

    2、设计模式的六大原则:

    (1)开闭原则 (Open Close Principle) :

            开闭原则指的是对扩展开放,对修改关闭。在对程序进行扩展的时候,不能去修改原有的代码,想要达到这样的效果,我们就需要使用接口或者抽象类

    (2)依赖倒转原则 (Dependence Inversion Principle):

            依赖倒置原则是开闭原则的基础,指的是针对接口编程,依赖于抽象而不依赖于具体

    (3)里氏替换原则 (Liskov Substitution Principle) :

            里氏替换原则是继承与复用的基石,只有当子类可以替换掉基类,且系统的功能不受影响时,基类才能被复用,而子类也能够在基础类上增加新的行为。所以里氏替换原则指的是任何基类可以出现的地方,子类一定可以出现。

            里氏替换原则是对 “开闭原则” 的补充,实现 “开闭原则” 的关键步骤就是抽象化,而基类与子类的继承关系就是抽象化的具体实现,所以里氏替换原则是对实现抽象化的具体步骤的规范。

    (4)接口隔离原则 (Interface Segregation Principle):

            使用多个隔离的接口,比使用单个接口要好,降低接口之间的耦合度与依赖,方便升级和维护方便

    (5)迪米特原则 (Demeter Principle):

            迪米特原则,也叫最少知道原则,指的是一个类应当尽量减少与其他实体进行相互作用,使得系统功能模块相对独立,降低耦合关系。该原则的初衷是降低类的耦合,虽然可以避免与非直接的类通信,但是要通信,就必然会通过一个“中介”来发生关系,过分的使用迪米特原则,会产生大量的中介和传递类,导致系统复杂度变大,所以采用迪米特法则时要反复权衡,既要做到结构清晰,又要高内聚低耦合。

    (6)合成复用原则 (Composite Reuse Principle):

            尽量使用组合/聚合的方式,而不是使用继承。

    二、Java的23种设计模式:

            接下来我们详细介绍Java中23种设计模式的概念,应用场景等情况,并结合他们的特点及设计模式的原则进行分析

    1、创建型-工厂方法模式:

    工厂方法模式分为三种:

    (1)简单工厂模式:

    建立一个工厂类,并定义一个接口对实现了同一接口的产品类进行创建。首先看下关系图:

    (2)工厂方法模式:

    工厂方法模式是对简单工厂模式的改进,简单工厂的缺陷在于不符合“开闭原则”,每次添加新产品类就需要修改工厂类,不利于系统的扩展维护。而工厂方法将工厂抽象化,并定义一个创建对象的接口。每增加新产品,只需增加该产品以及对应的具体实现工厂类,由具体工厂类决定要实例化的产品是哪个,将对象的创建与实例化延迟到子类,这样工厂的设计就符合“开闭原则”了,扩展时不必去修改原来的代码。UML关系图如下:

     (3)静态工厂方法模式:

    静态工厂模式是将工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可。

    工厂方法模式详情文章:Java设计模式之创建型:工厂模式详解(简单工厂+工厂方法+抽象工厂)

    2、创建型-抽象工厂模式:

            抽象工厂模式主要用于创建相关对象的家族。当一个产品族中需要被设计在一起工作时,通过抽象工厂模式,能够保证客户端始终只使用同一个产品族中的对象;并且通过隔离具体类的生成,使得客户端不需要明确指定具体生成类;所有的具体工厂都实现了抽象工厂中定义的公共接口,因此只需要改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。

            但该模式的缺点在于添加新的行为时比较麻烦,如果需要添加一个新产品族对象时,需要更改接口及其下所有子类,这必然会带来很大的麻烦。

            UML结构图如下:

    抽象工厂模式详情:Java设计模式之创建型:工厂模式详解(简单工厂+工厂方法+抽象工厂)

    3、创建型-建造者模式:

             建造者模式将复杂产品的创建步骤分解在在不同的方法中,使得创建过程更加清晰,从而更精确控制复杂对象的产生过程;通过隔离复杂对象的构建与使用,也就是将产品的创建与产品本身分离开来,使得同样的构建过程可以创建不同的对象;并且每个具体建造者都相互独立,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。UML结构图如下:

     建造者模式详情:Java设计模式之创建型:建造者模式

    4、创建型-单例模式:

            单例模式可以确保系统中某个类只有一个实例,该类自行实例化并向整个系统提供这个实例的公共访问点,除了该公共访问点,不能通过其他途径访问该实例。单例模式的优点在于:

    • 系统中只存在一个共用的实例对象,无需频繁创建和销毁对象,节约了系统资源,提高系统的性能
    • 可以严格控制客户怎么样以及何时访问单例对象。

    单例模式的写法有好几种,主要有三种:懒汉式单例、饿汉式单例、登记式单例。

    单例模式详情:Java设计模式之创建型:单例模式

    5、创建型-原型模式:

            原型模式也是用于对象的创建,通过将一个对象作为原型,对其进行复制克隆,产生一个与源对象类似的新对象。UML类图如下:

     在 Java 中,原型模式的核心是就是原型类 Prototype,Prototype 类需要具备以下两个条件:

    • 实现 Cloneable 接口:
    • 重写 Object 类中的 clone() 方法,用于返回对象的拷贝;

    Object 类中的 clone() 方法默认是浅拷贝,如果想要深拷贝对象,则需要在 clone() 方法中自定义自己的复制逻辑。

    • 浅复制:将一个对象复制后,基本数据类型的变量会重新创建,而引用类型指向的还是原对象所指向的内存地址。
    • 深复制:将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。

            使用原型模式进行创建对象不仅简化对象的创建步骤,还比 new 方式创建对象的性能要好的多,因为 Object 类的 clone() 方法是一个本地方法,直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显;

    原型模式详情:Java设计模式之创建型:原型模式

            

            上面我们介绍了5种创建型模式,下面我们就开始介绍下7种结构型模式:适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、享元模式。其中对象的适配器模式是各种模式的起源,如下图:

    6、结构型-适配器模式:

            适配器模式主要用于将一个类或者接口转化成客户端希望的格式,使得原本不兼容的类可以在一起工作,将目标类和适配者类解耦;同时也符合“开闭原则”,可以在不修改原代码的基础上增加新的适配器类;将具体的实现封装在适配者类中,对于客户端类来说是透明的,而且提高了适配者的复用性,但是缺点在于更换适配器的实现过程比较复杂。

            所以,适配器模式比较适合以下场景:

    • (1)系统需要使用现有的类,而这些类的接口不符合系统的接口。
    • (2)使用第三方组件,组件接口定义和自己定义的不同,不希望修改自己的接口,但是要使用第三方组件接口的功能。

    下面有个非常形象的例子很好地说明了什么是适配器模式:

    适配器模式的主要实现有三种:类的适配器模式、对象的适配器模式、接口的适配器模式。三者的使用场景如下:

    • 类的适配器模式:当希望将一个类转换成满足另一个新接口的类时,可以使用类的适配器模式,创建一个新类,继承原有的类,实现新的接口即可。
    • 对象的适配器模式:当希望将一个对象转换成满足另一个新接口的对象时,可以创建一个Wrapper类,持有原类的一个实例,在Wrapper类的方法中,调用实例的方法就行。
    • 接口的适配器模式:当不希望实现一个接口中所有的方法时,可以创建一个抽象类Wrapper,实现所有方法,我们写别的类的时候,继承抽象类即可。

    适配器模式详情:Java设计模式之结构型:适配器模式

    7、结构型-装饰器模式:

            装饰器模式可以动态给对象添加一些额外的职责从而实现功能的拓展,在运行时选择不同的装饰器,从而实现不同的行为;比使用继承更加灵活,通过对不同的装饰类进行排列组合,创造出很多不同行为,得到功能更为强大的对象;符合“开闭原则”,被装饰类与装饰类独立变化,用户可以根据需要增加新的装饰类和被装饰类,在使用时再对其进行组合,原有代码无须改变。装饰器模式的UML结构图如下:

            但是装饰器模式也存在缺点,首先会产生很多的小对象,增加了系统的复杂性,第二是排错比较困难,对于多次装饰的对象,调试时寻找错误可能需要逐级排查,较为烦琐。

    装饰器模式详情:Java设计模式之结构型:装饰器模式

    8、结构型-代理模式:

            代理模式的设计动机是通过代理对象来访问真实对象,通过建立一个对象代理类,由代理对象控制原对象的引用,从而实现对真实对象的操作。在代理模式中,代理对象主要起到一个中介的作用,用于协调与连接调用者(即客户端)和被调用者(即目标对象),在一定程度上降低了系统的耦合度,同时也保护了目标对象。但缺点是在调用者与被调用者之间增加了代理对象,可能会造成请求的处理速度变慢。UML结构图如下:

    代理模式详情:Java设计模式之结构型:代理模式

    9、结构型-桥接模式:

            桥接模式将系统的抽象部分与实现部分分离解耦,使他们可以独立的变化。为了达到让抽象部分和实现部分独立变化的目的,桥接模式使用组合关系来代替继承关系,抽象部分拥有实现部分的接口对象,从而能够通过这个接口对象来调用具体实现部分的功能。也就是说,桥接模式中的桥接是一个单方向的关系,只能够抽象部分去使用实现部分的对象,而不能反过来。 

            桥接模式符合“开闭原则”,提高了系统的可拓展性,在两个变化维度中任意扩展一个维度,都不需要修改原来的系统;并且实现细节对客户不透明,可以隐藏实现细节。但是由于聚合关系建立在抽象层,要求开发者针对抽象进行编程,这增加系统的理解和设计难度。桥接模式的UML结构图如下:

            就像在Java中我们使用 JDBC 连接数据库时,在各个数据库之间进行切换,基本不需要动太多的代码,原因就是使用了桥接模式,JDBC 提供统一接口,每个数据库提供各自的实现,然后由桥接类创建一个连接数据库的驱动,使用某一个数据库的时候只需要切换一下就行。JDBC 的结构图如下:

             在 JDBC 中,桥接模式的实现化角色 (Implementor) 为的 Driver 接口,具体实现化 (Concrete Implementor) 角色对应 MysqlDriver、OracleDriver 和 MariadbDriver,扩展抽象化 (Refined Abstraction) 角色对应 DriverManager,不具有抽象化 (Abstraction) 角色作为扩展抽象化角色的父类。

    桥接模式详情:Java设计模式之结构型:桥接模式

    10、结构型-外观模式:

            外观模式通过对客户端提供一个统一的接口,用于访问子系统中的一群接口。使用外观模式有以下几点好处:

    (1)更加易用:使得子系统更加易用,客户端不再需要了解子系统内部的实现,也不需要跟众多子系统内部的模块进行交互,只需要跟外观类交互就可以了;

    (2)松散耦合:将客户端与子系统解耦,让子系统内部的模块能更容易扩展和维护。

    (3)更好的划分访问层次:通过合理使用 Facade,可以更好地划分访问的层次,有些方法是对系统外的,有些方法是系统内部使用的。把需要暴露给外部的功能集中到门面中,这样既方便客户端使用,也很好地隐藏了内部的细节。

            但是如果外观模式对子系统类做太多的限制则减少了可变性和灵活性,所以外观模式适用于为复杂子系统提供一个简单接口,提高系统的易用性场景 以及 引入外观模式将子系统与客户端进行解耦,提高子系统的独立性和可移植性。

            外观模式的UML结构图如下:

    外观模式详情: Java设计模式之结构型:外观模式

    11、结构型-组合模式:

            组合模式将叶子对象和容器对象进行递归组合,形成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性,能够像处理叶子对象一样来处理组合对象,无需进行区分,从而使用户程序能够与复杂元素的内部结构进行解耦。

            组合模式最关键的地方是叶子对象和组合对象实现了相同的抽象构建类,它既可表示叶子对象,也可表示容器对象,客户仅仅需要针对这个抽象构建类进行编程,这就是组合模式能够将叶子节点和对象节点进行一致处理的原因。组合模式的UML结构图如下:

    组合模式详情: Java设计模式之结构型:组合模式

    12、结构型-享元模式:

            享元模式通过共享技术有效地支持细粒度、状态变化小的对象复用,当系统中存在有多个相同的对象,那么只共享一份,不必每个都去实例化一个对象,极大地减少系统中对象的数量,从而节省资源。

            享元模式的核心是享元工厂类,享元工厂类维护了一个对象存储池,当客户端需要对象时,首先从享元池中获取,如果享元池中存在对象实例则直接返回,如果享元池中不存在,则创建一个新的享元对象实例返回给用户,并在享元池中保存该新增对象,这点有些单例的意思。

            工厂类通常会使用集合类型来保存对象,如 HashMap、Hashtable、Vector 等等,在 Java 中,数据库连接池、线程池等都是用享元模式的应用。

            享元模式的UML结构图如下:

             Java 中,String 类型就是使用享元模式,String 对象是 final 类型,对象一旦创建就不可改变。而 Java 的字符串常量都是存在字符串常量池中的,JVM 会确保一个字符串常量在常量池中只有一个拷贝。

            而且提到共享池,我们也很容易联想到 Java 里面的JDBC连接池,通过连接池的管理,实现了数据库连接的共享,不需要每一次都重新创建连接,节省了数据库重新创建的开销,提升了系统的性能!

    享元模式详情:Java设计模式之结构型:享元模式

            前面我们介绍了7种结构型设计模式,接下来我们介绍一下11种行为型设计模式:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。先来张图,看看这11中模式的关系:

     13、行为型-策略模式:

            将类中经常改变或者可能改变的部分提取为作为一个抽象策略接口类,然后在类中包含这个对象的实例,这样类实例在运行时就可以随意调用实现了这个接口的类的行为。

            比如定义一系列的算法,把每一个算法封装起来,并且使它们可相互替换,使得算法可独立于使用它的客户而变化,这就是策略模式。UML结构图如下:

            策略模式的优点在于可以动态改变对象的行为;但缺点是会产生很多策略类,并且策略模式的决定权在用户,系统只是提供不同算法的实现,所以客户端必须知道所有的策略类,并自行决定使用哪一个策略类; 

            策略模式适用用于以下几种场景:

    • (1)应用程序需要实现特定的功能服务,而该程序有多种实现方式使用,所以需要动态地在几种算法中选择一种
    • (2)一个类定义了多种行为算法,并且这些行为在类的操作中以多个条件语句的形式出现,就可以将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句。

    策略模式详情:Java设计模式之行为型:策略模式

    14、行为型-模板方法:

            模板方法是基于继承实现的,在抽象父类中声明一个模板方法,并在模板方法中定义算法的执行步骤(即算法骨架)。在模板方法模式中,可以将子类共性的部分放在父类中实现,而特性的部分延迟到子类中实现,只需将特性部分在父类中声明成抽象方法即可,使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤,不同的子类可以以不同的方式来实现这些逻辑。

            模板方法模式的优点在于符合“开闭原则”,也能够实现代码复用,将不变的行为转移到父类,去除子类中的重复代码。但是缺点是不同的实现都需要定义一个子类,导致类的个数的增加使得系统更加庞大,设计更加抽象。模板方法模式的UML图如下:

    模板方法详情:Java设计模式之行为型:模板方法模式

    15、行为型-责任链模式:

            职责链可以将请求的处理者组织成一条链,并将请求沿着链传递,如果某个处理者能够处理请求则处理,否则将该请求交由上级处理。客户端只需将请求发送到职责链上,无须关注请求的处理细节,通过职责链将请求的发送者和处理者解耦了,这也是职责链的设计动机。        

           职责链模式可以简化对象间的相互连接,因为客户端和处理者都没有对方明确的信息,同时处理者也不知道职责链中的结构,处理者只需保存一个指向后续者的引用,而不需要保存所有候选者的引用。

            另外职责链模式增加了系统的灵活性,我们可以任意增加或更改处理者,甚至更改处理者的顺序,不过有可能会导致一个请求无论如何也得不到处理,因为它可能被放置在链末端。

    所以责任链模式有以下几个优点:

    • (1)降低耦合度,将请求的发送者和接收者解耦。反映在代码上就是不需要在类中写很多丑陋的 if….else 语句,如果用了职责链,相当于我们面对一个黑箱,只需将请求递交给其中一个处理者,然后让黑箱内部去负责传递就可以了。
    • (2)简化了对象,使得对象不需要链的结构。
    • (3)增加系统的灵活性,通过改变链内的成员或者调动他们的次序,允许动态地新增或者删除处理者
    • (4)增加新的请求处理类很方便。

    但是责任链模式也存在一些缺点:

    • (1)不能保证请求一定被成功处理
    • (2)系统性能将受到一定影响,并且可能会造成循环调用。
    • (3)可能不容易观察运行时的特征,而且在进行代码调试时不太方便,有碍于除错。

            责任链模式的UML结构图如下:

    责任链模式详情:Java设计模式之行为型:责任链模式

    16、行为型-观察者模式:

            观察者模式又称为 发布-订阅模式,定义了对象之间一对多依赖关系,当目标对象(被观察者)的状态发生改变时,它的所有依赖者(观察者)都会收到通知。一个观察目标可以对应多个观察者,而这些观察者之间没有相互联系,所以能够根据需要增加和删除观察者,使得系统更易于扩展,符合开闭原则;并且观察者模式让目标对象和观察者松耦合,虽然彼此不清楚对方的细节,但依然可以交互,目标对象只知道一个具体的观察者列表,但并不认识任何一个具体的观察者,它只知道他们都有一个共同的接口。

            但观察者模式的缺点在于如果存在很多个被观察者的话,那么将需要花费一定时间通知所有的观察者,如果观察者与被观察者之间存在循环依赖的话,那么可能导致系统崩溃,并且观察者模式没有相应的机制让观察者知道被观察对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。观察者模式的UML结构图如下:

     观察者模式详情:Java设计模式之行为型:观察者模式

    17、行为型-访问者模式:

            访问者模式就是一种分离对象数据结构与行为 (基于数据结构的操作) 的方法,通过这种分离,达到为一个被访问者动态添加新的操作而无需做其它修改的效果,使得添加作用于这些数据结构的新操作变得简单,并且不需要改变各数据结构,为不同类型的数据结构提供多种访问操作方式,这样是访问者模式的设计动机。

            除了使新增访问操作变得更加简单,也能够在不修改现有类的层次结构下,定义该类层次结构的操作,并将有关元素对象的访问行为集中到一个访问者对象中,而不是分散搞一个个的元素类中。

           但访问者模式的缺点在于让增加新的元素类变得困难,每增加一个新的元素类都意味着要在抽象访问者角色中增加一个新的抽象操作,并在每一个具体访问者类中增加相应的具体操作,违背了“开闭原则”的要求;

            所以访问者模式适用于对象结构中很少改变,但经常需要在此对象结构上定义新的操作的系统,使得算法操作的增加变得简单;或者需要对一个对象结构中进行很多不同并且不相关的操作,并且需要避免让这些操作污染这些对象,也不希望在增加新操作时修改这些类的场景。

            访问者模式的UML结构图如下:

            从上面的 UML 结构图中我们可以看出,访问者模式主要分为两个层次结构,一个是访问者层次结构,提供了抽象访问者和具体访问者,主要用于声明一些操作;一个是元素层次结构,提供了抽象元素和具体元素,主要用于声明 accept 操作;而对象结构 ObjectStructure 作为两者的桥梁,存储了不同类型的对象,以便不同的访问者来访问,相同访问者可以以不同的方式访问不同的元素,所以在访问者模式中增加新的访问者无需修改现有代码,可扩展行强。

            在访问者模式使用了双分派技术,所谓双分派技术就是在选择方法的时候,不仅仅要根据消息接收者的运行时区别,还要根据参数的运行时区别。在访问者模式中,客户端将具体状态当做参数传递给具体访问者,这里完成第一次分派,然后具体访问者作为参数的“具体状态”中的方法,同时也将自己this作为参数传递进去,这里就完成了第二次分派。双分派意味着得到的执行操作决定于请求的种类和接受者的类型。

     访问者模式详情:Java设计模式之行为型:访问者模式

    18、行为型-中介者模式:

             中介者模式通过中介者对象来封装一系列的对象交互,将对象间复杂的关系网状结构变成结构简单的以中介者为核心的星形结构,对象间一对多的关联转变为一对一的关联,简化对象间的关系,便于理解;各个对象之间的关系被解耦,每个对象不再和它关联的对象直接发生相互作用,而是通过中介者对象来与关联的对象进行通讯,使得对象可以相对独立地使用,提高了对象的可复用和系统的可扩展性。

            在中介者模式中,中介者类处于核心地位,它封装了系统中所有对象类之间的关系,除了简化对象间的关系,还可以对对象间的交互进行进一步的控制。中介者模式的UML结构图如下:

            但是,中介者对象封装了对象之间的关联关系,导致中介者对象变得比较庞大复杂,所承担的责任也比较多,维护起来也比较困难,它需要知道每个对象和他们之间的交互细节,如果它出问题,将会导致整个系统都会出问题。

    中介者模式详情:Java设计模式之行为型:中介者模式

    19、行为型-命令模式:

            命令模式的本质是将请求封装成对象,将发出命令与执行命令的责任分开,命令的发送者和接收者完全解耦,发送者只需知道如何发送命令,不需要关心命令是如何实现的,甚至是否执行成功都不需要理会。命令模式的关键在于引入了抽象命令接口,发送者针对抽象命令接口编程,只有实现了抽象命令接口的具体命令才能与接收者相关联。

            使用命令模式的优势在于降低了系统的耦合度,而且新命令可以很方便添加到系统中,也容易设计一个组合命令。但缺点在于会导致某些系统有过多的具体命令类,因为针对每一个命令都需要设计一个具体命令类。

            命令模式的UML结构图如下:

    命令模式详情: Java设计模式之行为型:命令模式

    20、行为型-状态模式:

            状态模式,就是允许对象在内部状态发生改变时改变它的行为,对象看起来就好像修改了它的类,也就是说以状态为原子来改变它的行为,而不是通过行为来改变状态。

            当对象的行为取决于它的属性时,我们称这些属性为状态,那该对象就称为状态对象。对于状态对象而言,它的行为依赖于它的状态,比如要预订房间,只有当该房间空闲时才能预订,想入住该房间也只有当你预订了该房间或者该房间为空闲时。对于这样的一个对象,当它的外部事件产生互动的时候,其内部状态就会发生变化,从而使得他的行为也随之发生变化。

            状态模式的UML结构图如下:

     从上面的UML结构图我们可以看出状态模式的优点在于:

    (1)封装了转换规则,允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块

    (2)将所有与状态有关的行为放到一个类中,可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。 

    但是状态模式的缺点在于:

    (1)需要在枚举状态之前需要确定状态种类

    (2)会导致增加系统类和对象的个数。

    (3)对 “开闭原则” 的支持并不友好,新增状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态;而且修改某个状态类的行为也需修改对应类的源代码。

    所以状态模式适用于:代码中包含大量与对象状态有关的条件语句,以及对象的行为依赖于它的状态,并且可以根据它的状态改变而改变它的相关行为。

    状态模式详情:Java设计模式之行为型:状态模式

    21、行为型-备忘录模式:

            备忘录模式提供了一种恢复状态的机制,在不破坏封装的前提下,捕获对象的某个时刻内部状态,并保存在该对象之外,保证该对象能够恢复到某个历史状态;备忘录模式将保存的细节封装在备忘录中,除了创建它的创建者之外其他对象都不能访问它,并且实现了即使要改变保存的细节也不影响客户端。但是备忘录模式都是多状态和多备份的,会早用较多的内存,消耗资源。备忘录模式的额UML结构图如下:

             备忘录模式的核心就是备忘录 Memento,在备忘录中存储的就是原发器 Originator 的部分或者所有的状态信息,而这些状态信息是不能够被其他对象所访问的,也就是说我们是不能使用备忘录之外的对象来存储这些状态信息,如果暴漏了内部状态信息就违反了封装的原则,故备忘录除了原发器外其他对象都不可以访问。所以为了实现备忘录模式的封装,我们需要对备忘录的访问做些控制:

    (1)对原发器:可以访问备忘录里的所有信息。

    (2)对负责人 caretaker:不可以访问备忘录里面的数据,但是他可以保存备忘录并且可以将备忘录传递给其他对象。

    (3)其他对象:不可访问也不可以保存,它只负责接收从负责人那里传递过来的备忘录同时恢复原发器的状态。

    备忘录模式详情:Java设计模式之行为型:备忘录模式

    22、行为型-迭代器模式:

            迭代器模式提供一种访问集合中的各个元素,而不暴露其内部表示的方法。将在元素之间游走的职责交给迭代器,而不是集合对象,从而简化集合容器的实现,让集合容器专注于在它所应该专注的事情上,更加符合单一职责原则,避免在集合容器的抽象接口层中充斥着各种不同的遍历操作。迭代器模式的UML结构图如下:

    迭代器模式详情:Java设计模式之行为型:迭代器模式

    23、行为型-解释器模式:

            解释器模式,就是定义语言的文法,并建立一个解释器来解释该语言中的句子,通过构建解释器,解决某一频繁发生的特定类型问题实例。

            解释器模式描述了如何构成一个简单的语言解释器,主要应用在使用面向对象语言开发的编译器中,它描述了如何为简单的语言定义一个文法,如何在该语言中表示一个句子,以及如何解释这些句子。    

            解释器模式中除了能够使用文法规则来定义一个语言,还能通过使用抽象语法树来更加直观表示、更好地地表示一个语言的构成,每一颗抽象语法树对应一个语言实例。抽象语法树描述了如何构成一个复杂的句子,通过对抽象语法树的分析,可以识别出语言中的终结符和非终结符类。 在解释器模式中由于每一种终结符表达式、非终结符表达式都会有一个具体的实例与之相对应,所以系统的扩展性比较好。

            解释器模式的UML如下:

     解释器模式详情:Java设计模式之行为型:解释器模式


    相关推荐阅读:

    Spring常见面试题总结

    SpringMVC常见面试题总结

    Mybatis常见面试题总结

    MySQL常见面试题总结

    Redis常见面试题总结

    RabbitMQ消息队列常见面试题总结

    ElasticSearch搜索引擎常见面试题总结

    计算机网络常见面试题总结

    操作系统常见面试题总结

    Java基础、集合、多线程常见面试题总结

    Java虚拟机常见面试题总结

    Java常见设计模式总结

    海量数据处理的方法总结


    参考文章:

    Java之美[从菜鸟到高手演变]之设计模式

    Java之美[从菜鸟到高手演变]之设计模式二

    Java之美[从菜鸟到高手演变]之设计模式三

    Java之美[从菜鸟到高手演变]之设计模式四

    展开全文
  • 软件设计方案说明书的编写

    万次阅读 多人点赞 2018-10-09 11:37:36
    关于软件设计方案说明书的编写,其根本目的有两个,一是便于项目内部各职能的成员进行沟通和项目执行时的依据(比如编码、测试等),二是作为项目的一部分,是项目文档的一部分。软件设计方案说明书的格式和内容,...
  • 概要设计说明

    万次阅读 2016-04-22 15:20:17
     将软件系统需求转换未来系统的设计;  逐步开发强壮的系统构架;  使设计适合于实施环境,提高性能而进行设计;  结构应该被分解模块和库。 二、概要设计的任务  制定规范: 代码体系、接口规约、...
  • 而创新的园区导视系统设计,更为来访者带来一场高效和视觉盛宴的升级体验。今天小编大家带来的是麦肯作品——云升科学园。云升科学园,广州科学城第四代产业综合体,集“展示、研发、运动、商业、休闲、居住、孵化...
  • 软件工程之概要设计说明

    万次阅读 2018-10-24 20:45:32
    1引言 ...此概要设计说明书是为了说明整个系统的体系结构,以及需求用例的各个功能点在结构中的体现,系统的详细设计人员进行详细设计师的输入参考文档。 1.2背景 说明: 待开发软件系统的名...
  • 一张图快速了解23种设计模式

    万次阅读 多人点赞 2021-09-10 16:07:41
    设计模式 设计模式是对被用来在特定场景下解决一般设计问题的类和相互通信的对象的描述。 这是《设计模式:可复用面向对象软件的基础》(Design Patterns: Elements of Reusable Object-Oriented)中对设计模式的...
  • 【软件工程】概要设计说明

    万次阅读 热门讨论 2018-03-25 17:07:14
    概要设计说明书 1引言 1.1编写目的 这篇文章的编写目的主要是为了开发此系统系统做一个总体的结构设计,经评审后进一步细化,分别对每一模块进行详细细化的解决方案、接口和数据库等方面的设计,明确描述所有...
  • (3.5分)【单选题】对于序列 s,哪个选项能够返回序列s中第i到jk步长的元素子序列? (3.0分)【单选题】Python 中,for 和 while 可以有 else 语句? (2.0分)【判断题】元组可以作为集合的元素。 (2.0分)【判断题...
  • 理解bpmn先从他的基本元素入手

    万次阅读 2020-06-17 16:14:06
    显然,如果bpmn能够aris方法提供一个完整的、开箱即用的替代方案,那就太好了。我们承认纯粹的标准并非如此,但正是因为bpmn是一种标准,所以现在正在创建软件工具来使用bpmn来实现其他必要的视图。 3、 bpmn的...
  • 软件设计-UML类图详解说明

    万次阅读 多人点赞 2018-07-13 19:13:23
    UML(Unified Modeling Language)中文统一建模语言,是一种开放的方法,用于说明、可视化、构建和编写一个正在开发的、面向对象的、软件密集系统的制品的开放方法。UML展现了一系列最佳工程实践,这些最佳实践在对...
  • 通过我的实践,发现使用flex布局时稍不注意便会遇到三个问题:子元素不平分父元素空间、对文字设置了溢出省略却失效、flex下列表溢出但是滚动失效。常常会让人摸不着头脑。这里记录探究。 元素不均分 “均分列”,也...
  • 一份完整的项目展示中少不了必要的设计说明,虽然设计图是最重要的部分,但好的设计说明也能项目添彩。设计说明即设计阐述,主要是针对设计内容做辅助介绍,帮助观看者除了视觉表象外,深入理解设计背后的思路,并...
  • 软件概要设计说明书—模板

    万次阅读 2015-07-30 13:41:34
    1 引言 1.1 目的 介绍编写本文档的目的,主要内容及读者。 1.2 需求概述 描述所要实现的功能和性能等。... 需求规格说明书; d. 文档所引用的资料、标准和规范。列出这些资料的作者、标题、编
  • 顺序表ADT模板设计及简单应用:将顺序表中前 m 个元素和后 n 个元素进行互换 问题描述 目的:使用STL中的vector模板,设计并实现顺序表应用场合的一些简单算法设计。 应用1:试设计一个算法,用尽可能少的辅助空间将...
  • 后代选择器相比,子元素选择器(Child selectors)只能选择作为某元素元素元素。 选择子元素 如果您不希望选择任意的后代元素,而是希望缩小范围,只选择某个元素的子元素,请使用子元素选择器(Child selector...
  • 元素——答题

    万次阅读 多人点赞 2019-09-19 14:10:44
    元素——答题 微元素每日任务,答题
  • 展开全部这个问题,有部分人的答案是:“是的,必须相同”,就连数组的百度百科,关于数组的使e5a48de588b63231313335323631343130323136353331333431366265用...原因:数组的概念:在程序设计中,为了处理方便,...
  • 设计模式(二)——UML类图介绍

    万次阅读 多人点赞 2019-10-15 22:47:03
    在正式介绍设计模式之前,我们有必要学习一下UML类图,因为我们需要一种直观的表示方法来描述设计模式,这种方法即是UML类图。在Jungle之前的一篇博客里,已经介绍到UML类图UML类图关系与符号简介。这里,不妨我们...
  • Activiti7系列课程7-activiti7设计

    万次阅读 2019-06-17 10:39:38
    要想非常方便的使用Activiti7框架,则必须要安装流程设计器插件,关于Activiti7流程设计器相关插件说明如下: activiti6 官方提供有Web设计器(Modeler设计器)。这个不需要进行安装,直接部署运行activiti-model.....
  • 软件工程——总体设计与详细设计

    万次阅读 2020-05-14 11:12:37
    需求分析确定了系统的开发目标,下一步工作就是软件设计。软件设计可以进一步地 分为两个阶段:总体设计和详细设计
  • 国军标-Gjb软件设计说明书模板

    万次阅读 2016-06-29 17:47:55
    设计说明应包括以下内容(若适用),任何适合于所提供的信息的顺序提供,并应从接口实体角度说明这些特性之间的区别(例如关于数据元素的大小、频率或其他特性的不同期望值): A 接口实体分配给该接口的...
  • [软工]概要设计说明书(GB8567-88)

    万次阅读 多人点赞 2016-11-16 09:55:04
    1.【引言】 1.1 编写目的 设计软件结构的具体...此概要设计说明书是为了说明整个系统的体系架构,以及需求用例的各个功能点在架构中的体现,系统的详细设计人员进行详细设计师的输入参考文档。 1.2 背景 说明: a.
  • 元素周期表中的几个规律

    千次阅读 2021-01-14 16:16:16
    一、电子排布规律最外层电子数1或2的原子可以是IA族、ⅡA族或副族元素的原子;最外层电子数是3~8的原子一定是主族元素的原子,且最外层电子数等于主族的族序数。二、序数差规律(1)同周期相邻主族元素的“序数差”...
  • Map中根据条件删除元素

    千次阅读 2021-03-15 03:00:13
    判定map中是否存在某元素 判断某key是否存在可以使用map的count方法来间接判定 count接受一个参数key值,返回map中key值给定值的元素总数 map i_to_s_map ... 随机推荐 转换一个矩阵(2维数组)...
  • 有一个算法,查找n个元素的的数组的最大值和最小值,要比较2n次;请写一个最高效的算法,并说明他要比较的次数。请注意复杂度的常数 (不用写代码,说明步骤和过程即可,要定出比较的次数,没写不给分) 解题思路 ...
  • HTML中的行内元素和块级元素有那些

    千次阅读 2017-01-04 11:53:02
    1.关于行内元素和块状元素说明 根据CSS规范的规定,每一个网页元素都有一个display属性,用于确定该元素的类型,每一个元素都有默认的display属性值,比如div元素,它的默认display属性值“block”,成为“块级...
  • python简单获取数组元素个数的方法

    千次阅读 2020-12-05 05:03:14
    具体如下:代码如下:mySeq = [1,2,3,4,5]print len(mySeq)运行结果如下:5希望本文所述对大家的Python程序设计有所帮助。时间: 2015-07-12本文实例讲述了python实现判断数组是否包含指定元素的方法.分享给大家供...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 470,240
精华内容 188,096
关键字:

以花为元素的设计说明