第一范文网 - 专业文章范例文档资料分享平台

UML期末复习 - 图文

来源:用户分享 时间:2025/5/18 14:09:40 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

roundPeg.insertIntoHole(str);}}

在上面代码中,RoundPeg属于Adaptee(被适配者).

PegAdapter属于Adapter,将Adaptee(被适配者RoundPeg)和Target(目标SquarePeg)进行适配. 实际上这是组合方法(composition)和继承(inheritance)方法的综合运用

PegAdapter首先继承SquarePeg,然后使用new的组合生成对象方式,生成RoundPeg的对象roundPeg,再重载父类insert()方法。

从这里,我们也了解到使用new生成对象和使用extends继承生成对象的不同,前者无需对原来的类修改,甚至无需要知道其内部结构和源代码. 7)进一步使用Adapter

上面的PegAdapter继承了SquarePeg,如果我们需要两边都继承,既继承SquarePeg 又继承RoundPeg,但是Java中不允许多继承,因此我们可以实现(implements)两个接口(interface) public interface IRoundPeg{

public void insertIntoHole(String msg);} public interface ISquarePeg{ public void insert(String str); }

下面是新的RoundPeg 和SquarePeg, 除了实现接口这一区别,和上面的没什么区别: public class SquarePeg implements ISquarePeg{ public void insert(String str){

System.out.println(\ }}

public class RoundPeg implements IRoundPeg{ public void insertIntohole(String msg){ System.out.println(\ insertIntoHole():\ }}

下面是新的PegAdapter,叫做two-way adapter:

public class PegAdapter implements IRoundPeg,ISquarePeg{ private RoundPeg roundPeg; private SquarePeg squarePeg;

// 构造方法

public PegAdapter(RoundPeg peg){this.roundPeg=peg;} // 构造方法

public PegAdapter(SquarePeg peg)(this.squarePeg=peg;) public void insert(String str){ roundPeg.insertIntoHole(str);} public void insertIntoHole (String str){squarePeg. insert (str);}}

还有一种Pluggable Adapters,使用Reflection技术,可以动态的获取adapters 3、Facade(外观) (1)对象结构型模式

(2)意图:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

(3)适用性:①为一个复杂子系统提供一个简单接口,需要更多的可定制性的用户可以越过Facade层。 ②当客户程序与抽象类的实现部分之间存在着很大的依赖性时,引入Facade将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性。③在构建一个层次结构的子系统时,使用Facade模式定义子系统中每层的入口点。让相互依赖的子系统之间仅通过Facade进行通讯,可以简化它们之间的依赖关系。 (4)各子接口和类 //定义子系统类Water: public class Water { boolean waterIsBoiling; public Water () {

setWaterIsBoiling (false);

System.out.println (\纯净的水准备好了\ }

public void boilFacadeWater () { setWaterIsBoiling (true); System.out.println (\水在沸腾\ }

public void setWaterIsBoiling (boolean isWaterBoiling) { waterIsBoiling = isWaterBoiling; }

第 29 页 共 42 页

public boolean getWaterIsBoiling () { return waterIsBoiling; }}

//定义子系统类茶包: public class TeaBag { public TeaBag() {

System.out.println(\清香的茶包准备好了\ }}

//定义茶怀子系统类: public class TeaCup {

boolean teaBagIsSteeped; Water facadeWater; TeaBag facadeTeaBag; public TeaCup () {

setTeaBagIsSteeped (false);

System.out.println (\茶杯准备好了\ }

public void setTeaBagIsSteeped (boolean isTeaBagSteeped) { teaBagIsSteeped = isTeaBagSteeped; }

public boolean getTeaBagIsSteeped () { return teaBagIsSteeped; } public void addFacadeTeaBag (TeaBag facadeTeaBagIn) {

facadeTeaBag = facadeTeaBagIn; System.out.println (\茶包放在苶杯了\ public void addFacadeWater (Water facadeWaterIn) {

facadeWater = facadeWaterIn; System.out.println (\水倒入杯子了\ } public void steepTeaBag () {

if ( (facadeTeaBag != null) && ( (facadeWater != null) && (facadeWater.getWaterIsBoiling ()))) {

System.out.println (\茶渗透到杯子中\ setTeaBagIsSteeped (true); else { System.out.println (\茶没有渗透到杯子中\ setTeaBagIsSteeped (false); } }} 外观类

//facadeCuppaMaker耦合各系统来冲茶: public class FacadeCuppaMaker { boolean teaBagIsSteeped;

} public FacadeCuppaMaker() {

System.out.println(\准备好为你冲茶了!\ public TeaCup makeACuppa() {

TeaCup cup = new TeaCup(); TeaBag teaBag = new TeaBag(); Water water = new Water(); cup.addFacadeTeaBag(teaBag); water.boilFacadeWater(); cup.addFacadeWater(water); cup.steepTeaBag(); return cup; }}

4、Decorator(装饰者) (1)定义

动态地给一个对象添加一些额外的职责。就扩展功能而言,使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活。 (2)为什么使用Decorator?

①我们通常可以使用继承来实现功能的拓展,如果这些需要拓展的功能的种类很繁多,那么势必生成很多子类,增加系统的复杂性,同时,使用继承实现功能拓展,我们必须可预见这些拓展功能,这些功能是编译时就确定了,是静态的②使用Decorator的理由是这些功能需要由用户动态决定加入的方式和时机③Decorator提供了\即插即用\的方法,在运行期间决定何时增加何种功能 (3)如何使用Decorator?

举Adapter中的打桩示例,在Adapter中有两种类:方形桩、圆形桩,Adapter模式展示如何综合使用这两个类。假如,我们现在需要在打桩时增加一些额外功能,比如,挖坑 在桩上钉木板等,不关心如何使用两个不相关的类,则可以考虑事业Decorator模式 先建立一个接口: public interface Work{ public void insert(); }

接口Work有一个具体实现:插入方形桩或圆形桩,这两个区别对Decorator是无所谓.我们以插入

第 30 页 共 42 页

} 方形桩为例:

public class SquarePeg implements Work{ public void insert(){

System.out.println(\插入方形桩\ } }

现在有一个应用需要在桩打入前挖坑,在打入后,在桩上钉木板,这些额外的功能是动态,可能随意增加调整修改,比如,可能又需要在打桩之后钉架子,那么我们使用Decorator模式,这里方形桩SquarePeg是decoratee(被刷油漆者),我们需要在decoratee上刷些\油漆\,这些油漆就是那些额外的功能

public class Decorator implements Work{ private Work work;

//额外增加的功能被打包在这个List中 private ArrayList others = new ArrayList();

//在构造器中使用组合new方式,引入Work对象; public Decorator(Work work){

this.work=work; others.add(\挖坑\钉木板\public void insert(){ newMethod(); }

//在新方法中,我们在insert之前增加其他方法,这里次序先后是用户灵活指定: public void newMethod(){ otherMethod(); work.insert();} public void otherMethod(){

ListIterator listIterator = others.listIterator(); while (listIterator.hasNext()){

System.out.println(((String)(listIterator.next())) + \正在进行\ }}}

在上例中,我们把挖坑和钉木板都排在了打桩insert前面,这里只是举例说明额外功能次序可以任意安排。好了,Decorator模式出来了,我们看如何调用: Work squarePeg = new SquarePeg(); Work decorator = new Decorator(squarePeg); decorator.insert();

(4)什么时候应该使用装饰模式:①需要扩展一个类的功能,增加附加责任②需要动态地给一个类增加功能③需要增加由一些基本功能排列组合而成的大量附加功能 五、设计模式

1、行为模式的目的:①行为模式涉及到算法和对象间职责的分配。②行为模式描述对象或类之间的通信模式,刻划了在运行时难以跟踪的复杂的控制流。 2、行为模式的分类

不变模式Immutable、策略模式Strategy、模版方法Template Method、观察者模式Observer 命令模式Command、迭代器模式Iterator、责任链Chain of Responsibility、备忘录模式Memento、状态模式State、访问者模式Visitor、解释器模式Interpreter、中介者模式Mediator 3、Observer(观察者)

(1)对象行为模式(2)意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。(3)适用性:①当一个抽象模型有两个方面,其中一个方面依赖于另一方面,将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。②当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象有待改变。 ③当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之,不希望这些对象是紧密耦合的。(4)效果:①目标与观察者之间的耦合是抽象和最小的。②支持广播通信,对通知的响应取决于观察者。③可能引起意外的更新。(5)实现:①创建目标与观察者之间的映射。②观察多个目标时,应修改Update使观察者知道发出通知的目标。③Notify的触发。④删除一个目标时,应通知观察者,避免悬挂引用。⑤发出通知前确保目标状态的稳定。⑥避免特定于观察者的更新协议——推/拉模型。⑦可以显式地指定观察者感兴趣的改变。⑧封装复杂的更新语义。 4、Command(命令):(1)对象行为模式(2)意图:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。(3)适用性:①抽象出待执行的动作以参数化某对象。Command模式是回调机制的一个面向对象的替代品。②在不同的时刻指定、排列和执行请求。③支持取消操作。④支持修改日志,这样当系统崩溃时,这些修改可以被重做一遍。⑤用构建在原语操作上的高层操作构造一个系统。 (4)效果:①将调用操作的对象与实现操作的对象解耦。②Command对象也可以被操纵和扩展。③可以将多个Command装配成一个复合Command。④无需改变已有的类,可以容易地增加新Command。(5)实现:①Command对象的智能程度。②对Undo和Redo的支持。③避免Undo操作过程中的错误积累。④在C++中可以用模板来实现简单的Command类。

5、Iterator(迭代器):(1)对象行为模式(2)意图:提供一种方法顺序访问一个聚合对象中各

第 31 页 共 42 页

个元素, 而又不需暴露该对象的内部表示。(3)适用性:①访问一个聚合对象的内容而无需暴露它的内部表示。 ②支持对聚合对象的多个和多种遍历。③为遍历不同的聚合结构提供一个统一的接口。(4)效果:①支持以不同方式遍历一个聚合。②简化了聚合的接口,聚合不必再提供用于遍历的接口。③在同一个聚合上可以有多个遍历。(5)实现:①谁来控制迭代②谁来提供遍历算法③迭代器的健壮程度④附加的迭代器操作⑤多态迭代器的管理(堆中分配的迭代器的撤销)⑥迭代器的特权访问⑦复合对象上的迭代器⑧空迭代器 6、State(状态)

(1)对象行为模式(2)意图:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。(3)适用性:①一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。 ②一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示。通常,有多个操作包含这一相同的条件结构。State模式将每一个条件分支放入一个独立的类中。这使得可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化。

(4)效果:①将与特定状态相关的行为局部化,将不同状态的行为分割开来。②使得状态转换显式化。③State对象可以被共享。 7、Strategy(策略)

(1)对象行为模式(2)意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。(3)适用性:①许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。②需要使用一个算法的不同变体。③算法使用客户不应该知道的数据,可使用策略模式以避免暴露复杂的、与算法相关的数据结构。④一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现,将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句。 8、Template Method(模板方法)

(1)类行为模式(2)意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

(3)适用性:①一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。 ②各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。这是Opdyke和Johnson所描述过的“重分解以一般化”的一个很好的例子[OJ93]。首先识别现有代码中的不同之处,并且将不同之处分离为新的操作。最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。 ③控制子类扩展。模板方法只在特定点调用“hook”操作(参见效果一节),这样就只允许

在这些点进行扩展。

【综合案例-------大学选课系统的分析与设计UML应用案例】

主要以“学生注册讨论班”为例,运用UML建模语言对大学的选课系统进行了分析。从问题分析到最后的系统设计,主要从以下几个方面进行了陈述:问题描述、需求分析、静态建模、动态建模、组件建模、部署建模 一、问题描述

1、大学选课系统是与学生有着紧密的联系,具有注册、交费、选课、成绩查询等功能 2、为了简化本次系统分析只考虑学生注册讨论班的功能,该问题描述如下:①学生想要注册某门讨论班,于是向注册员提交其姓名和学生编号;②注册员验证该学生是否有资格注册这门讨论班;③注册员验证后,提供讨论班列表,并验证是否适合学生的课程安排;④注册员统计费用并通知学生;⑤在学生确认后,注册员将该学生注册到讨论班,并将费用加入学生帐单;⑥注册员向学生提供注册成功的确认信息。

3、根据以上问题描述,该简化系统应具有如下功能:①学生搜索、注册讨论班②验证注册资格③显示讨论班及相关信息④提供成绩单⑤结算并显示帐单⑥注册成功⑦关闭注册 二、需求分析

采用用例驱动的方法分析需求的主要任务是识别参与者和用例,并建立用例模型,主要分为识别参与者、识别用例、确定事件流三个部分。 1、识别参与者(角色)

参与者表示与系统进行交互的任何人或物。可以包括人(不只是最终用户)、外部系统和其它机构。通过分析选课系统的功能需求,确定有以下三个参与者:①学生:在系统中申请注册讨论班的人②注册员:完成验证注册信息的人或外部系统③教授:指导或协助讨论班和管理学生成绩 2、识别用例(用况)

用例是一系列活动,描述真实世界中参与者与系统相互交互的方式。通过分析选课系统的功能需求,确定有如下用例:(1)注册讨论班(2)退出讨论班(3)参加讨论班(4)完成讨论班(5)通知学生计划改变(6)分发成绩单(7)输出收费计划表(8)输入成绩(9)指导讨论班(10)生成教学进度

系统的用例图如下所示:

第 32 页 共 42 页

搜索更多关于: UML期末复习 - 图文 的文档
UML期末复习 - 图文.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c11sx693t2v79c964hv2d_8.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top