软件设计模式_第1页
软件设计模式_第2页
软件设计模式_第3页
软件设计模式_第4页
软件设计模式_第5页
已阅读5页,还剩18页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

1、2014-2015 学年第二学期设计模式大作业课题名称:设计模式在 Duck 模拟器设计中的应用班 级: 12 级软工一班 学 号: 1215115161:成 绩:2015 年 6 月 10 日Duck 模拟器的设计及实现一、设计概述要实现一个鸭子模拟器,这个鸭子模拟器由 Duck 类描述,如下:1.display2.swim3.fly4.quack其中 swim 是所有鸭子都具有的特性,而且所有鸭子的这些特性都相同,因此,这个方法可以直接在 Duck 类中实现。display 方法也是所有鸭子具有的特性,但随着鸭子的种类不同,display 也有所不同,因此,display 方法应为 Duc

2、k 类的抽象方法。fly 和 quack 并不是所有鸭子的特性,如橡皮鸭子即不会飞,也不会叫。因此,可以将这两个方法看作是两个行为,可将每一个行为设计成一个接口。这样可以和 Duck 类完全脱离。因为,fly 和 quack 与 Duck 一点关系都没有(别的东西也可能 fly 和 quack),然后不同的 fly 和 quack 分别用实现相应接口的类表示。使用的是复合模式实现,最终运行结果如下按照迭代顺序,由简单到复杂:二、创建 Quack_impl 接口Quack_impl 接口主要是通过 public void quack()方法实现,并且让其他的不同种类的鸭子重写 quack()方法

3、;publicerface Quack_impl extends Quack_Observablepublic void quack();三、不同种类的鸭子实现 Quack_impl 接口红鸭实现Quack_impl 接口代码:public class Redhead_Duck implements Quack_impl/红鸭子Overridepublic void quack() / TODO Auto-generated method stubSystem.out.prln(Redhead_Duck);绿鸭实现Quack_impl 接口代码:public class Mallard_Duc

4、k implements Quack_implObservable observable;public Mallard_Duck() observable = new Observable();public void quack() / TODO Auto-generated method stubSystem.out.prln(MallardDuck);notifyObservers();鸭鸣器实现Quack_impl 接口代码:public class Rubber_Duck implements Quack_impl/橡皮鸭Overridepublic void quack() / TO

5、DO Auto-generated method stubSystem.out.prln(Squeak);橡皮鸭实现Quack_impl 接口代码:public class Rubber_Duck implements Quack_impl/橡皮鸭Overridepublic void quack() / TODO Auto-generated method stubSystem.out.prln(Squeak);实现的类图如下:四创建 Duck_Simulator 模拟器public class Duck_Simulator /鸭子模拟器public sic void main(String

6、 args)Duck_Simulator simulator = new Duck_Simulator();/创建一个模拟器Abstract_DuckFactory abstract_DuckFactory = newCountingDuck_Factory();simulator.simulate(abstract_DuckFactory);void simulate(Abstract_DuckFactory duckFactory) / TODO Auto-generated method stubQuack_implmallard Duck = duckFactory.creatMall

7、ardDuck();Quack_implredhead_Duck =duckFactory.createRedheadDuck();Quack_implduck_Call = duckFactory.createDuckCall();Quack_implrubber_Duck = duckFactory.createRubberDuck();Quack_implgoose_Duck = new Goose_Adapter(newGoose();System.out.prln(nDuck Simulator);Flock flockOfDucks = new Flock();flockOfDuc

8、ks.add(redhead_Duck);flockOfDucks.add(duck_Call);flockOfDucks.add(rubber_Duck);flockOfDucks.add(goose_Duck);Flock flockOfMallards = new Flock();Quack_impl mallardOne = duckFactory.creatMallardDuck();Quack_implmallardTwo = duckFactory.creatMallardDuck();Quack_implmallardThree = duckFactory.creatMalla

9、rdDuck();Quack_implmallardFour = duckFactory.creatMallardDuck();flockOfMallards.add(mallardOne);flockOfMallards.add(mallardTwo);flockOfMallards.add(mallardThree);flockOfMallards.add(mallardFour);flockOfDucks.add(flockOfMallards);System.out.prln(nDuckSimulator:Whole Flock Simulation);simulate(flockOf

10、Ducks);System.out.prln(nDuckSimulator:Mallard Flock Simulation);System.out.prln(nDuckSimulator: With Observer);Quack_ologistquack_ologist = new Quack_ologist();flockOfDucks.registerObserver(quack_ologist);simulate(flockOfDucks);System.out.prtimes);ln(nThe ducks quacked + Quack_Counter.getQuacks()+/*

11、simulate(mallard_Duck);simulate(redhead_Duck);simulate(duck_Call);simulate(rubber_Duck);simulate(goose_Duck);System.out.prtimes);*/ln(The ducksquacked+Quack_Counter.getQuacks()+void simulate(Quack_implduck)duck.quack();运行的结果如图:五创建跟鸭子一样会叫的鸟鸟类只有一个 hock()方法,但是这里的鸟叫是不同于鸭子的,其实现的具体代码如下:首先创建一个鸟类:public cla

12、ss Goose /鸟类void hock()System.out.prln(Honk);这个类是定义一个方法hock()六为这个鸟类创建适配器上面定义的鸟类必选要实现方法hock()就必须要重写一个适配器在这里创建了一个适配器Goose_Adapter,为了实现 Quack_impl 类的方法具体的实现代码如下:public class Goose_Adapter implements Quack_impl/用适配器将鹅适配成鸭子Goose goose;public Goose_Adapter(Goose goose)this.goose = goose;Overridepublic voi

13、d quack() / TODO Auto-generated method stubgoose.hock();Overridepublic void registerObserver(Observer observer)/ TODO Auto-generated methodstubOverridepublic void notifyObservers() / TODO Auto-generated methodstub其具体的类图实现如下:七在模拟器中加入鸟类:这样的话,就需要对模拟器中的代码进行更新,其代码如下:Quack_impl mallardOne = duckFactory.cr

14、eatMallardDuck();Quack_implmallardTwo = duckFactory.creatMallardDuck();Quack_implmallardThree = duckFactory.creatMallardDuck();Quack_implmallardFour = duckFactory.creatMallardDuck();flockOfMallards.add(mallardOne);flockOfMallards.add(mallardTwo);flockOfMallards.add(mallardThree);flockOfMallards.add(

15、mallardFour);运行的结果如下:八创建有装饰类的工厂,这样才是真正需要创建的工厂:代码:public class CountingDuck_Factory extends Abstract_DuckFactoryOverridepublic Quack_impl creatMallardDuck() / TODO Auto-generated method stubreturn new Quack_Counter(new Mallard_Duck();Overridepublic Quack_impl createRedheadDuck() / TODO Auto-generated

16、 method stubreturn new Quack_Counter(new Redhead_Duck();Overridepublic Quack_impl createDuckCall() / TODO Auto-generated method stubreturn new Quack_Counter(new Duck_Call();Overridepublic Quack_impl createRubberDuck() / TODO Auto-generated method stubreturnnewQuack_Counter(newRubber_Duck();这个类图如下:九修

17、改鸭子模式,这时需要使用工厂修改的部分代码如下:public class Duck_Simulator /鸭子模拟器public sic void main(String args)Duck_Simulator simulator = new Duck_Simulator();/创建一个模拟器Abstract_DuckFactory abstract_DuckFactory = newCountingDuck_Factory();simulator.simulate(abstract_DuckFactory);void simulate(Abstract_DuckFactory duckFac

18、tory) / TODO Auto-generated method stubQuack_implmallard Duck = duckFactory.creatMallardDuck();Quack_implredhead_Duck =duckFactory.createRedheadDuck();Quack_implduck_Call = duckFactory.createDuckCall();Quack_implrubber_Duck = duckFactory.createRubberDuck();Quack_implgoose_Duck = new Goose_Adapter(ne

19、wGoose();System.out.prln(nDuck Simulator);Flock flockOfDucks = new Flock();flockOfDucks.add(redhead_Duck);flockOfDucks.add(duck_Call);flockOfDucks.add(rubber_Duck);flockOfDucks.add(goose_Duck);在其中加入抽象工厂模式运行的结果如下:十修改鸭子模拟器通过修改鸭子模拟器,将一些鸭子设置能进入组合结构的代码,部分代码如下:Flock flockOfDucks = new Flock();flockOfDucks

20、.add(redhead_Duck);flockOfDucks.add(duck_Call);flockOfDucks.add(rubber_Duck);flockOfDucks.add(goose_Duck);Flock flockOfMallards=new Flock();Quack_implmallardOne=duckFactory.creatMallardDuck();Quack_implmallardTwo=duckFactory.creatMallardDuck();Quack_implmallardThree= duckFactory.creatMallardDuck();Q

21、uack_implmallardFour = duckFactory.creatMallardDuck();flockOfMallards.add(mallardOne);flockOfMallards.add(mallardTwo);flockOfMallards.add(mallardThree);flockOfMallards.add(mallardFour);flockOfDucks.add(flockOfMallards);运行结果:十一创建鸭子观察者:创建一个 Observer,这个接口需要和通知观察者的方法,代码如下:publicerface Quack_Observable p

22、ublic void registerObserver(Observer observer);public void notifyObservers();十二创建辅助类 Obserable, 将所有的 Observ_impl 的调用都委托给 Obserable 类:部分代码实现如下:importjava.util.ArrayList;importjava.util.Iterator;publicclass Observable implements Quack_ObservableArrayList observers = new ArrayList();Quack_Observable duck;public Observable() this.duck = duck;Overridepublic void notifyObservers() / TODO Auto-generated method stubIterator iterator = observers.iterator();while (iterator.hasNext() Observer observer = (Observer) iterator.next();pu

温馨提示

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

评论

0/150

提交评论