构建之法 学习笔记07

在之前长时间的理论学习之后,这周也快到学期期末了,结合本书第十章 10.2用例(USE CASE)与我的java设计模式课程作业,我对我的原型模式课题稍做了一些研究 。

和典型人物、典型场景的方法类似,用例(UseCase)也是很常用的需求分析工具。用例有这样一些 基本元素:

标题:描述这个用例要达到的目标

角色(Actor):和软件系统交互的角色,例如用户,其他实体,甚至时间(在描述一些和时间相关的场景时有用)

主要成功场景(Main Success Scenario):一系列步骤描述角色是怎样和系统交互,从而达到目标的

步骤(Step):描述每一步的交互(例如一套正常的ATM取款流程)

扩展场景(Extension):描述一些扩展的交互,例如一些意外情况(例如取款时账户余额不足)

下面以原型模式为例结合代码,进行简单的介绍。

原型模式是从一个对象处罚得到一个和自己有相同状态的新对象的成熟模式,该模式的关键是将一个对象定义为原型,并为其提供复制自己的方法。原型模式多用于创建复杂的或者耗时的实例,因为这种情况下,复制一个已经存在的实例可以使程序运行更高效,或者创建值相等,只是命名不一样的同类数据。

原型模式主要包含如下三个角色:

Prototype:抽象原型类。声明克隆自身的接口。
  ConcretePrototype:具体原型类。实现克隆的具体操作。
  Client:客户类。让一个原型克隆自身,从而获得一个新的对象。

原型模式虽然是创建型的模式,但是与工程模式没有关系,从名字即可看出,该模式的思想就是将一个对象作为原型,对其进行复制、克隆,产生一个和原对象类似的新对象。本小结会通过对象的复制,进行讲解。在Java中,复制对象是通过clone()实现的,先创建一个原型类:

1.public class Prototype implements Cloneable

2. {

3.    public Object clone() throws CloneNotSupportedException

4.    {   Prototype proto = (Prototype) super.clone();

5.        return proto;

6.    }

7.}

很简单,一个原型类,只需要实现Cloneable接口,覆写clone方法,此处clone方法可以改成任意的名称,因为Cloneable接口 是个空接口,你可以任意定义实现类的方法名,如cloneA或者cloneB,因为此处的重点是super.clone()这句 话,super.clone()调用的是Object的clone()方法。

另外关于原型模式还存在一个深、浅复制的概念:

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

深复制:将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。简单来说,就是深复制进行了完全彻底的复制,而浅复制不彻底。

此处,写一个深浅复制的例子:

1.public class Prototype implements Cloneable, Serializable

2.{

3.    private static final long serialVersionUID = 1L;

4.    private String string;

5.

6.    private SerializableObject obj;

7.

8.    /* 浅复制 */

9.    public Object clone() throws CloneNotSupportedException {

10.        Prototype proto = (Prototype) super.clone();

11.        return proto;

12.    }

13.

14.    /* 深复制 */

15.    public Object deepClone() throws IOException, ClassNotFoundException {

16.

17.        /* 写入当前对象的二进制流 */

18.        ByteArrayOutputStream bos = new ByteArrayOutputStream();

19.        ObjectOutputStream oos = new ObjectOutputStream(bos);

20.        oos.writeObject(this);

21.

22.        /* 读出二进制流产生的新对象 */

23.        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());

24.        ObjectInputStream ois = new ObjectInputStream(bis);

25.        return ois.readObject();

26.    }

27.

28.    public String getString() {

29.        return string;

30.    }

31.

32.    public void setString(String string) {

33.        this.string = string;

34.    }

35.

36.    public SerializableObject getObj() {

37.        return obj;

38.    }

39.

40.    public void setObj(SerializableObject obj) {

41.        this.obj = obj;

42.    }

43.

44.}

45.

46.class SerializableObject implements Serializable {

47.    private static final long serialVersionUID = 1L;

48.}

时间: 2024-12-12 22:17:40

构建之法 学习笔记07的相关文章

构建之法 学习笔记01

起初我只是在专业要求的硬性规定下去接触了这本<构建之法>,然后仔细的看下来之后确实让我受益匪浅,让我更切实的了解了这个行业.这本书对我来书最实用的地方在于,在高大上的理论之后会有具体的实例来帮助理解.在介绍方法论的同时,会介绍方法论不适用的场景,介绍方法论在现实中是怎样跑偏--什么叫宏观视角?什么叫最佳实践?什么叫算无遗策?就像画一棵决策树,向哪个分支走,结果会怎么样,清清楚楚,明明白白,让人信服.能让学生了解到工作中接触的种种角色及其想法.诉求,避免"以程序为中心"思考问

构建之法阅读笔记07

本周我主要看了<构建之法>的软件测试部分.在读软件测试之前,我认为软件测试并不是很重要.很繁琐. 但是读了这一部分之后,我深深地认识到软件测试对于开发等的作用是非常大的,而且是必不可少的.下面对软件测试做一下简单介绍: 一.测试方法分类 黑箱:在设计测试的过程中,把软件系统当作一个“黑箱”,无法了解或使用系统的内部结构及知识.一个更准确的说法是“Behavioral Test Design”,从软件的行为,而不是内部结构出发来设计测试. 白箱:在设计测试的过程中,设计者可以“看到”软件系统的内

构建之法 学习笔记02

在一个项目运行的过程中,所有参与者都是团队的一份子,都是推进进度的零件.因此在知识和技术之上,不可或缺的是对于团队的建设. 在这次的学习笔记之中我想简要谈谈本书的第十七章的内容--人,绩效和职业德行. 在这个章节里,书中首先提出了这样一个概念:猪,鸡和鹦鹉,这三种动物都有着在团队中各自潜在的含义.一个团队的人可能来自五湖四海,有个各自的性格和特性,但是肯定都有着同一个目标,为着同一个目标而走到了一起. 有些人是猪--在这里的意向并无贬义,对他们来说,想要项目成功就得拿出自己身上的肉,背水一战:一

构建之法 学习笔记06

关于敏捷流程. 在软件工程的语境中,"敏捷流程"是一系列价值观和方法论的集合.从2001年开始,一些软件界的专家开始倡导"敏捷"的价值观和流程,他们肯定了流行做法的价值,但是强调了敏捷做法更能带来价值 ."敏捷"(Agile)是一种思潮,或者说是一种价值观,它涵盖了好几种软件开发的方法论(Methodology):这些方法论又是建立在许多行之有效的最佳实践方法(Best Practices)之上的.而关于敏捷的方法论比较有名的是一下三种:1.爱抚

构建之法 学习笔记04

关于软件工程的一些基本概念和技术 单元测试 绝大部分软件都是由多人合作完成的,大家的工作互相有依赖关系.最典型的的例子就是,某人负责的模板的功能被其他人调用.软件的额很多错误都是来源于程序员对模块功能的误解.疏忽或不了解模块的变化.单元测试可以有效的解决这些问题. 用VSTS写单元测试 许多应用程序中都会用到"用户"这一类型,用户的标识通常是一个邮件地址. 创建单元测试含糊的主要步骤是: 1.设置数据(一个假想的正确的E-mail地址) 2.使用被测试类型的功能(用E-mail地址来创

老师的问题和《构建之法》笔记

谈构建之法之前,先回答老师的几个问题~ 1.我本科专业是物联网工程,四年间的学习内容一直处于软硬件间摇摆,一度使我怀疑人生.这种学习方式最大的好处是可以从底层理解整个计算机的运作,循序渐进,而最大的缺点是,体系太过于庞大,低效,冗杂.当我到了大三的时候,我依然不能够独立编写一些软件,也不能处理有意义的硬件问题,所以当务之急便是做出取舍,否则我的大学可能就止步于C语言和单片机了.几经周折,最后还是选定了偏向软件的方向,原因众多,硬件的学习难度和深度让我苦不堪言,对数模电,通信原理,高频电路亦有较高

构建之法阅读笔记三—结对编程

构建之法阅读笔记三——结对编程 何谓结对编程,结对编程就是程序员肩并肩,平等的,互补的进行开发工作,他们使用同一台电脑,编写同样的程序,一起分析,一起设计,一块交流想法. 然而我以前却并不是这样做的,我以前喜欢在没人打扰的环境下写代码,我觉得有人在我身边看着,会影响我的思路,还有我个人自尊心比较强,不太喜欢被人指指点点,所以每次都是,我写完代码之后,自己先找自己的bug,每当自己实在找不到之后,才会请教大神,但是有时候可能由于自己的能力不足,往往一个很简单的问题,我自己发现就会花费很久的时间,让

C#数字图像处理算法学习笔记(一)--C#图像处理的3中方法

C#数字图像处理算法学习笔记(一)--C#图像处理的3中方法 Bitmap类:此类封装了GDI+中的一个位图,次位图有图形图像及其属性的像素数据组成.因此此类是用于处理像素数据定义的图形的对象.该类的主要方法和属性如下:  GetPixel与SetPixel方法:获取或设置一个图像的指定像素的颜色. PixelFormat属性:返回图像的像素格式. Height和Width:返回图像的高度和宽度. LockBits与UnLockBits方法:分别锁定和解锁系统内存中的位图像素. LockBits

C#数字图像处理算法学习笔记(三)--图像几何变换

C#数字图像处理算法学习笔记(三)--图像几何变换 几何图像处理包括 图像的平移变换,镜像变换,旋转变换,伸缩变换,在这里仅以水平镜像为例,通过代码来理解其基本操作方式: 翻转前: 翻转后: //后台代码: public partial class Form1 : Form { private string _curFileName; private Bitmap _srcBitmap; private Bitmap _dstBitmap; public Form1() { Initialize