您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业文化 > 20144751-刘鹏杰
课程编号:B080103120软件体系结构与设计模式实验报告姓名刘鹏杰学号20144751班级1407班指导教师宋杰实验名称软件体系结构与设计模式开设学期2016-2017第一学期开设时间第7周——第8周报告日期2016-11-1评定成绩95评定人宋杰评定日期2016-11-7东北大学软件学院考核标准得分(1)正确理解和掌握实验所涉及的概念和原理(20%);20(2)按实验要求合理设计数据结构和程序结构(20%);18(3)能设计测试用例,运行结果正确(20%);20(4)实验分析和总结恰当,达到实验目(20%);18(5)实验报告规范(20%)。191.Singleton实验1.1实验目的练习实现Singleton模式的两种方式LazySingleton和EagerSingleton。1.2实验内容实现LazySingleton和EagerSingleton,并且编写一个Client,设法测试是否确实是一个Singleton,说明测试的理由。1.3实验步骤1.首先了解两种单利模式的构建以及设计的相同点以及不同点,清晰区别Lazy和Eager两种模式。2.开始着手于编写两个单例模式的类分别是EagerSingleton和LazySingleton。其中EagerSingleton类的设计:classEagerSingleton{privatestaticEagerSingletonsingle=newEagerSingleton();privateEagerSingleton(){}publicstaticEagerSingletongetInstance(){returnsingle;}}以及LazySingleton类的设计:classLazySingleton{privatestaticLazySingletonsingle;privateLazySingleton(){}publicstaticLazySingletongetInstance(){if(single==null)single=newLazySingleton();returnsingle;}}3.编写client类对分别对两种实现的单例的两个单例对象进行比较。4.最后通过比较方法分别判断它们是否为同一对象,若是同一对象,输出两者相同,证明了单例模式只能实例化一个对象。1.4实验结果1.5实验总结首先,单例模式的特点是保证一个类仅有一个实例,并提供一个访问它的全局访问点。这也是验证所写程序是否满足单例模式的依据。两种实现方式分别为1懒汉模式(LazySingleton):在类加载时不初始化2饿汉式单例模式(EagerSingleton):在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快。单例模式就是将构造方法私有化,然后让该类提供一个获取该类对象的静态方法,该方法必须始终返回同一个对象,这就是单例模式的核心。而对于LazySingleton的单例,是在首次调用该类的静态方法的时候创建该类对象并返回而后的调用将返回同一对象;而对于EagerSingleton的单例模式则是在加载该类到内存时就创建该类的对象并赋值给该类的静态成员变量。单例模式看似简单,但仍需要注意许多细节上的问题。其中最重要的就是考虑到多线程的情况下,LazySingleton模式在创建实例时有可能发生不同步的情况。另外考虑到效率问题,创建实例的代码仍有许多可以改进的余地,这些需要我在日后的学习中逐渐积累经验。2.Decorator实验2.1实验目的练习实现Decorator模式以及其应用。2.2实验内容用Decorator实现东北大学超市的小票打印程序,编写Client和测试程序。要求小票商品信息为必须项目,其它均可自由选择和组合顺序。注意打印小票文字的顺序,可以简化文字内容。东北大学超市----------------------------------可乐330ml2.5面包230g4合计(人民币)6.5**********************14天购物保证。货真价实东大超市电话83688888**********************货物售出概不退款保护环境,请勿随意丢弃2.3实验步骤1.学习、分析装饰器(Decorator)类,根据传统定义类图画出实验类图的大概。(实验思路类图)2.确定商品信息以及合计为核心类,而其它由横线相隔的每一部分都为一个装饰者,所以一共需要定义一个接口,一个实现该接口的核心类,一个实现该接口的抽象装饰类,然后在定义三个实现抽象装饰类的具体装饰类。并且编写核心类,其包含一个ArrayList对象以囊括所有商品对象,并且循环遍历所有商品,计算总结并输出相关信息。classShoppingBillimplementsBill{privateArrayListProductproducts=newArrayListProduct();@Overridepublicvoidprint(){doublesum=0.0;System.out.println(---------------------);for(Productproduct:products){sum+=product.getPrice()*product.getAmounts();if(product.getAmounts()1)System.out.println(product.getAmounts()+*+product.getPrice());System.out.println(product.getName()+\t+product.getDescription()+\t+product.getPrice()*product.getAmounts());}System.out.println();System.out.println(合计(人民币)\t+sum);}…}4.依次编写三个装饰类,其中的落款类形式如下:classInscribeDecoratorextendsDecorator{publicInscribeDecorator(Billbill){super(bill);}@Overridepublicvoidprint(){bill.print();printInscribe();}privatevoidprintInscribe(){System.out.println(**********************);System.out.println(14天购物保障货真价实\n东大超市电话83688888);}}5.编写测试程序,运行测试,加以修改升级优化。2.4实验结果2.5实验总结首先要明白Decorator模式是指在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。具体回到这个实验当中应当首先分清哪些是核心类,哪些是装饰者。并且核心类和装饰者都应当实现同一接口,并且装饰者类中含有一个该接口类型的引用,并且装饰者的构造方法应当传入一个该接口的实现类对象,并在对接口方法的实现中使用该引用调用接口方法。其次是在装饰者对接口的方法的实现中,可以在被装饰对象的方法的执行前后执行其它的业务逻辑,所以要弄清在该方法执行前后分别应当做什么事或者是什么都不做,即方法前不装饰或方法后不装饰。3.Composite实验3.1实验目的练习实现Composite模式,并且练习使用Builder模式创建和组装对象。3.2实验内容用Composite模式创建一个树形菜单,其中树形菜单的每个节点包含名称(Name)属性。需要把一个树形菜单输出。使用Builder创建树形菜单,其中要求树形菜单为一个满二叉树,输入参数为树的深度。如输入为3则输出以下树形菜单。(注意缩进)Level_1Level_2_1Level_3_1_1Level_3_1_2Level_2_2Level_3_2_1Level_3_2_23.3实验步骤1.学习熟悉Composite和Builder两种设计模式的具体实现方式,尝试利用Composite模式分别创建Node、Root、Leaf三个类:abstractclassNode{protectedStringname;protectedintdepth;publicNode(){super();}…}classRootextendsNode{privateNodeleftNode;privateNoderightNode;publicRoot(){super();}…2.将Builder类创建该树形菜单的工作分为两个步骤:步骤一构造出一棵该类型的满二叉树,并将该满二叉树转化为树形菜单的字符串形式,等于说是Builder类要完成该项任务需要按顺序执行两个方法,我设为makeTree()和makeMenu()方法,并设有一个getMemu()的方法以返回该树形菜单的字符串。3.创建一个Director类,该Director中含有一个Builder类的引用,该引用通过构造方法传入。在该类中增加一个work()方法,以对Builder的makeTree()和makeMenu()方法按顺序调用执行。publicvoidwork(){builder.makeTree(builder.getRoot(),_);builder.makeMenu(builder.getRoot(),0);}4.编写Builder类的两个核心方法makeTree()和makeMenu()5.makeTree()方法使用递归实现,并且设有两个入参“Node类型和String类型”,并且该方法调用时需要传递一个Root对象(为Node的子类),和”_”字符串:publicvoidmakeTree(Nodenode,Stringname){NodeleftChild=null;NoderightChild=null;if(node.getDepth()this.number-1){leftChild=newRoot();rightChild=newRoot();......((Root)node).setLeftNode(leftChild);((Root)node).setRightNode(rightChild);leftChild.setDepth(node.getDepth()+1);leftChild.setName(Level_+leftChild.getDepth()+name+1);rightChild.setDepth(node.getDepth()+1);rightChild.setName(Level_+rightChild.getDepth()+name+2);makeTree(leftChild,name+1_);makeTree(rightChild,name+2_);}6.getMenu()方法也使用递归实现,该方法其实就是线序遍历该满二叉树,然后在遍历的同时将每次遍历到的Node对象的name连接起来,并且在name前加上需要的空格。该方法设有两个入参“Node类型和int类型”,并且该方法首次调用时需要传入Root对象和数字0.7.叶子类的编写,因为叶子不能再进行扩展,所以集成Node的目的是了表示接口。publicclassLeafextendsNode{publicLeaf(){super();}}3.4实验结果3.5实验总结此次实验的主要难点在于对Builder模式以及Composite模式的理解,递归算法创建二叉树、将二叉树转化为字符串表示的树形菜单的方法。利用Composite模式来定义好Node、Root、Leaf三个类。Builder模式需要一个Builder类来完成实际的工作,然后该工作由于特别复杂所以需要分成若干部来完成,如果把方法的调用和这些方法的实现都写在一个类中,那么势必会造成日后维护的麻烦。所以Builder模式就利用一个Director来指挥工作,将
本文标题:20144751-刘鹏杰
链接地址:https://www.777doc.com/doc-3717136 .html