UML设计模式Builder,Teplate模式_第1页
UML设计模式Builder,Teplate模式_第2页
UML设计模式Builder,Teplate模式_第3页
UML设计模式Builder,Teplate模式_第4页
UML设计模式Builder,Teplate模式_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

10设计模式(4)

Builder、Template模式权巍主要内容10.1Builder模式10.2Template模式10.3Command模式10.4依赖倒转原则10.5接口隔离原则2UML和设计模式10.1Builder模式--创建型模式软件系统中,创建“一个复杂对象”:

该对象由各个部分的子对象用一定的算法构成;由于需求的变化,负责对象的各个部分(即:各个子对象)经常变化,但是将它们组合在一起的算法却相对稳定。如何应对这种变化?提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,并令系统中复杂对象的构建算法稳定不变。3UML和设计模式10.1.1Builder模式的结构将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。4UML和设计模式Builder模式的角色:抽象建造者(Builder)角色给出一个抽象接口,以规范产品对象的各个组成成分的建造。具体建造者(ConcreteBuilder)角色在应用程序的调用下创建产品实例,完成2个任务:实现抽象建造者声明的接口,给出一步步的完成创建产品实例的操作。在建造过程完成后,提供产品的实例。导演者(Director)角色调用具体建造者角色以创建产品对象,与客户端交互,并不了解产品类的具体知识。产品(Product)角色产品,即:建造中的复杂对象。5UML和设计模式例:买肯德基儿童套餐

典型的儿童餐包括一个主食,一个辅食,一杯饮料和一个玩具(例如汉堡、炸鸡、可乐和玩具车)。这些在不同的儿童餐中可以是不同的,但是组合成儿童餐的过程是相同的。客户端:顾客。想去买一套套餐(这里面包括汉堡,可乐,薯条),可以有1号和2号两种套餐供顾客选择。导演者角色:收银员。知道顾客想要买什么样的套餐,并告诉餐馆员工去准备套餐。建造者角色:餐馆员工。按照收银员的要求去准备具体的套餐,分别放入汉堡,可乐,薯条等。产品角色:最后的套餐,所有的东西放在同一个盘子里面。6UML和设计模式10.1.2Builder模式的示意代码7UML和设计模式//导演者publicclassDirector{ privateBuilderbuilder;

//Director类的构造方法 Director(Builderbuilder){ this.builder=builder; }

//产品构造方法,负责调用各个零件建造方法 publicvoidconstruct(){ builder=newConcreteBuilder(); builder.buildPart1(); builder.buildPart2(); ...... }}8UML和设计模式//产品publicclassProduct{ //产品的相关内容}//抽象建造者publicabstractclassBuilder{ //产品零件构造方法

publicabstractvoidbuildPart1(); publicabstractvoidbuildPart2(); //产品返回方法

publicabstractProductretrieveResult();}9UML和设计模式//具体建造者publicclassConcreteBuilderextendsBuilder{ privateProductproduct=newProduct(); //产品返回方法

publicProductretrieveResult(){ returnproduct; } //产品零件建造方法

publicvoidbuildPart1(){ //buildthefirstpartoftheproduct } publicvoidbuildPart2(){ //buildthesecondpartoftheproduct } }10UML和设计模式建造模式的使用方法顺序图//客户端程序classClient{publicstaticvoidmain(String[]args){ Builderbuilder=newConcreteBuilder(); Directordirector=newDirector(builder);

//构造Product director.construct();

//获得Product对象 Productproduct=builder.retrieveResult();}}11UML和设计模式什么情况下使用Builder模式(1)需要生产的产品对象有复杂的内部结构。(2)需要生产的产品对象的属性相互依赖。(3)在对象创建过程中会使用到系统中的其他一些对象,这些对象在产品对象的创建过程中不易得到。12UML和设计模式10.1.3例子示例代码1:

产品、抽象建造者、具体建造者、导演者、客户代码例2:

任何证件生成都需要两个部分组成--姓名和号码。姓名由“姓”和“名”组成,而号码则根据不同证件由不同的生成方式。如:学生证("前缀"+号码),身份证("省份"+"城市"+"出生日期"+"随机数")。

示例代码:builder-demo213UML和设计模式10.2模板模式(Template)UML和设计模式14行为型模式在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或者由于固有的原因(比如框架与应用之间的关系)而无法和任务的整体结构同时实现。如何在确定稳定操作结构的前提下,来灵活应对各个子步骤的变化或者晚期实现需求?10.2.1什么是模板模式Template模板模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。本模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。UML和设计模式1510.2.2模板模式的结构UML和设计模式16模板模式的角色抽象模板类:

定义一个或多个抽象的操作,以便让子类实现;

定义并实现一个模板方法,一般是具体方法;它给出了实现的框架,而框架中的具体组成则在相应的抽象操作中,推迟到子类实现。具体类:

实现父类定义的一个或多个抽象方法。每个抽象模板类可对应多个具体类,每个具体类都给出抽象方法的不同实现UML和设计模式17UML和设计模式18模板模式的一个简单的例子对多种汽车实现测试的例子(java)abstractpublicclassVehical{//表示汽车 publicabstractvoidstartup(); publicabstractvoidrun(); publicabstractvoidturn(intdegree); publicabstractvoidstop();

//模板方法 publicvoidTest() { //汽车测试的框架逻辑代码

startup(); run(); turn(...); stop(); }}UML和设计模式19publicclassHongQiCarextendsVehical{//具体汽车

publicabstractvoidstartup(){ ……//红旗车的具体启动

} publicabstractvoidrun(){…… } publicabstractvoidturn(intdegree){…… } publicabstractvoidstop(){…… }}publicclassClient{//客户程序

publicstaticvoidmain(String[]args){ Vehicalhq=newHongQiCar(); hq.Test(); }}10.3Command模式--创建型模式命令模式:将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。命令模式解耦了命令发送者和接受者之间联系。命令模式的优点:新的命令很容易被加入系统允许接收方决定是否要拒绝请求容易实现请求日志的记录、及请求的Undo、Redo20UML和设计模式Command模式的结构21UML和设计模式Command模式的角色:客户Client:创建了一个具体命令对象并确定其接收者;抽象命令Command:一个所有具体命令类的抽象接口;具体命令ConcreteCommand:负责调用接收者的相应操作,实现接收者和行为之间的弱耦合;请求者Invoker:负责调用命令对象执行请求;接收者Receiver:负责具体实施和执行一个请求。22UML和设计模式10.1.2Command模式的示意代码23UML和设计模式命令模式的一个简单的例子(java)实现对电视机的开、关等命令进行封装,//抽象命令Command,Command.java:publicinterfaceCommand{

voidexecute();

}//具体命令1:关机CommandOff.java:

publicclassCommandOffimplementsCommand{

privateTvmyTv;

publicCommandOff(Tvtv){

myTv=tv;

}

publicvoidexecute(){

myTv.turnOff();

}

}24UML和设计模式//Invoker请求者,Control.java//增加新的具体命令时,需更改此文件publicclassControl{

privateCommandonCommand,offCommand;

publicControl(Commandon,Commandoff){

onCommand=on;

offCommand=off;

}

publicvoidturnOn(){

onCommand.execute();

}

publicvoidturnOff(){

offCommand.execute();

}

}25UML和设计模式命令模式的一个简单的例子(java)//命令接收者Reserver,TV.javapublicclassTv{

publicintcurrentChannel=0;

publicvoidturnOn(){

System.out.println("Thetelevisinoison.");

}

publicvoidturnOff(){

System.out.println("Thetelevisionisoff.");

}

}26UML和设计模式//具体命令2:开机CommandOn.java:

publicclassCommandOnimplementsCommand{

privateTvmyTv;

publicCommandOn(Tvtv) {

myTv=tv;

}

publicvoidexecute() {

myTv.turnOn();

}

}//可方便添加其他具体命令,如频道切换命令等27UML和设计模式//客户程序Client:CommandTest.java:

publicclassCommandTest{

publicstaticvoidmain(String[]args){

//命令接收者

Tv

myTv=newTv();

//开机命令

CommandOnon=newCommandOn(myTv);

//关机命令

CommandOffoff=newCommandOff(myTv);

//命令控制对象,即命令请求者Invoker

Contr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论