




已阅读5页,还剩37页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目录1【装饰模式应用场景举例】12【策略模式应用场景举例】53【代理模式应用场景举例】84【外观模式应用场景举例】125【抽象工厂模式应用场景举例】146【观察者模式应用场景举例】227【建造者模式应用场景举例】278【原型模式应用场景举例】329【工厂方法模式应用场景举例】3610【模板方法模式应用场景举例】401【装饰模式应用场景举例】 比如在玩“极品飞车”这款游戏,游戏中有对汽车进行喷涂鸦的功能,而且这个喷涂鸦是可以覆盖的,并且覆盖的顺序也影响到最后车身的显示效果,假设现在喷涂鸦具有2种样式:(1)红色火焰(2)紫色霞光如果使用“继承父类”设计这样的功能,那么类图就像如下的这样: 从图中可以看到使用继承来实现这种功能,并且是2种涂鸦样式,就需要创建4个子类,如果喷涂鸦有3种,4种呢?这种情况就是典型中学课程学习过的“排列与组合”,那简直就是“Head First设计模式”书中讲的“类爆炸”。 显然继承“奥迪汽车类”的这个办法是无效,而且是非常徒劳,繁琐的。 那么如何才能以“灵活”,“顺序敏感”这样的需求来实现这样的功能呢? 【装饰模式解释】 类型:结构模式 动态的对一个对象进行功能上的扩展,也可以对其子类进行功能上的扩展。 【装饰模式UML图】【装饰模式-JAVA代码实现】 新建一个抽象汽车父类:packagecar_package;publicabstractclasscar_parent/汽车抽象父类privateStringmake_address;privateintspeed;publicStringgetMake_address()returnmake_address;publicvoidsetMake_address(Stringmake_address)this.make_address=make_address;publicintgetSpeed()returnspeed;publicvoidsetSpeed(intspeed)this.speed=speed;publicabstractvoidprint_face(); 然后新建一个奥迪汽车子类packagecar_package;publicclassaudi_subextendscar_parent/奥迪汽车子类Overridepublicvoidprint_face()System.out.println(audi车默认的颜色为黑色); 然后再新建一个装饰者父类:packagedecorator_package;importcar_package.car_parent;publicabstractclassdecorator_parentextendscar_parent/装饰者父类protectedcar_parentcar_parent_ref;publicvoidsetCar_parent_ref(car_parentcar_parent_ref)this.car_parent_ref=car_parent_ref;Overridepublicvoidprint_face()car_parent_ref.print_face(); 然后再新建装饰者子类:红色火焰装饰者类:packagedecorator_package;publicclassdecorator_audi_redextendsdecorator_parentOverridepublicvoidprint_face()super.print_face();System.out.println(给奥迪喷涂鸦-颜色为红色火焰); 然后再新建装饰者子类:紫色霞光装饰者类:packagedecorator_package;publicclassdecorator_audi_purpleextendsdecorator_parentOverridepublicvoidprint_face()super.print_face();System.out.println(给奥迪喷涂鸦-颜色为紫色霞光); 新建一个运行类packagemain_run;importcar_package.audi_sub;importdecorator_package.decorator_audi_purple;importdecorator_package.decorator_audi_red;publicclassmain_runpublicstaticvoidmain(Stringargs)audi_subaudi_sub_ref=newaudi_sub();audi_sub_ref.setMake_address(北京市朝阳区);audi_sub_ref.setSpeed(200);decorator_audi_reddecorator_audi_red_ref=newdecorator_audi_red();decorator_audi_red_ref.setCar_parent_ref(audi_sub_ref);decorator_audi_purpledecorator_audi_purple_ref=newdecorator_audi_purple();decorator_audi_purple_ref.setCar_parent_ref(decorator_audi_red_ref);decorator_audi_purple_ref.print_face(); 程序运行结果如下:audi车默认的颜色为黑色给奥迪喷涂鸦-颜色为红色火焰给奥迪喷涂鸦-颜色为紫色霞光 从程序结构中可以看到,完全符合了前面我们的要求:“灵活”,“顺序敏感”。2【策略模式应用场景举例】 比如在玩“极品飞车”这款游戏,那么游戏对车的轮胎是可以更换的,不同的轮胎在高速转弯时有不同的痕迹样式,那么针对“汽车”的配件“轮胎”就要可以变化,而且轮胎和轮胎之间是可以相互替换的,这就是典型的要应用“策略模式”的场景!从程序结构中可以看到,完全符合了前面我们的要求:“灵活”,“顺序敏感”。 【策略模式解释】 类型:行为模式 定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。策略模式使这些算法在客户端调用它们的时候能够互不影响地变化。 【策略模式UML图】 【策略模式-JAVA代码实现】 从策略模式UML图中可以看到Context与接口Strategy是组合关系,即强引用关系。 新建一个轮胎接口:packagestrategy_interface;publicinterfacetyre_interface/tyre轮胎publicvoidprint_tyre_line();/显示出轮胎的痕迹 新建2个轮胎接口的实现类:packagestrategy_implement;importstrategy_interface.tyre_interface;/长痕迹轮胎类publicclasstyre_long_implementimplementstyre_interfacepublicvoidprint_tyre_line()System.out.println(在路面上显示一个长轮胎痕迹);packagestrategy_implement;importstrategy_interface.tyre_interface;/短痕迹轮胎类publicclasstyre_short_implementimplementstyre_interfacepublicvoidprint_tyre_line()System.out.println(在路面上显示一个短轮胎痕迹);基于一个轮胎接口来实现不同样式的轮胎样式。 组装一个Car车类:packagecar_package;importstrategy_interface.tyre_interface;publicclassCarprivateStringmake_address;/制造地privateintdeath_year;/报废年限privateintspeed;/速度privatetyre_interfacetyre_interface_ref;/轮胎的样式publicStringgetMake_address()returnmake_address;publicvoidsetMake_address(Stringmake_address)this.make_address=make_address;publicintgetDeath_year()returndeath_year;publicvoidsetDeath_year(intdeath_year)this.death_year=death_year;publicintgetSpeed()returnspeed;publicvoidsetSpeed(intspeed)this.speed=speed;publictyre_interfacegetTyre_interface_ref()returntyre_interface_ref;publicvoidsetTyre_interface_ref(tyre_interfacetyre_interface_ref)this.tyre_interface_ref=tyre_interface_ref;publicvoidstart()System.out.println(车的基本信息为:);System.out.println(制造地make_address:+this.getMake_address();System.out.println(报废年限death_year:+this.getDeath_year();System.out.println(速度speed:+this.getSpeed();System.out.println(Car起动了!);System.out.println(Car高速行驶,遇到一个大转弯,路面显示:);this.getTyre_interface_ref().print_tyre_line(); 让车跑起来,并且具有更换轮胎样式的功能:packagemain_run;importstrategy_implement.tyre_long_implement;importstrategy_implement.tyre_short_implement;importcar_package.Car;publicclassrun_mainpublicstaticvoidmain(Stringargs)tyre_long_implementtyre_long_implement=newtyre_long_implement();tyre_short_implementtyre_short_implement=newtyre_short_implement();Carcar=newCar();car.setDeath_year(8);car.setMake_address(北京朝阳区);car.setSpeed(200);car.setTyre_interface_ref(tyre_long_implement);car.start(); 控制台打印出:车的基本信息为:制造地make_address:北京朝阳区报废年限death_year:8速度speed:200Car起动了!Car高速行驶,遇到一个大转弯,路面显示:在路面上显示一个长轮胎痕迹 是一个长轮胎痕迹,但在程序中可以使用代码:car.setTyre_interface_ref(tyre_long_implement);来对轮胎的样式进行不同的替换,可以替换成短轮胎痕迹的汽车轮胎,这样在不更改Car类的前题下进行了不同轮胎样式的改变,轮胎和轮胎之间可以互相替换,这就是策略模式。3【代理模式应用场景举例】 比如在玩“极品飞车”这款游戏,如果游戏者手中的金钱达到了一定的数量就可以到车店买一部性能更高的赛车,那么这个卖车的“车店”就是一个典型的“汽车厂家”的“代理”,他为汽车厂家“提供卖车的服务”给有需求的人士。从面向对象的方面考虑,“销售汽车的代理”也是一个对象,那么这个对象也具有一定的状态,在软件项目中这个对象也具有管理财务进销存的基本功能,那么在设计时就要以面向OOP编程的思想来考虑软件的类结构,这个销售汽车的代理也是一个类了。 【代理模式解释】 类型:结构模式 对一些对象提供代理,以限制那些对象去访问其它对象。 【代理模式UML图】 【代理模式-JAVA代码实现】 新建一个买车的接口:packagebuy_car_package;publicinterfacebuy_car_packagepublicvoidbuy_car(); 新建一个people人类,具有买车的行为,所以实现接口buy_car_package:packagebuy_car_imple;importbuy_car_package.buy_car_package;publicclasspeopleimplementsbuy_car_packageprivateintcash;privateStringusername;publicintgetCash()returncash;publicvoidsetCash(intcash)this.cash=cash;publicStringgetUsername()returnusername;publicvoidsetUsername(Stringusername)this.username=username;publicvoidbuy_car()System.out.println(username+买了一台新车);people类不能拥有车,必须经过proxy代理类的认证,符合条件之后才可以拥有车辆,新建一个代理,这个代理类来考察当前的people是否有资格进行买车:packagebuy_car_imple;importbuy_car_package.buy_car_package;publicclassproxy_buy_car_impleimplementsbuy_car_packageprivatepeoplepeople;publicpeoplegetPeople()returnpeople;publicvoidsetPeople(peoplepeople)this.people=people;publicvoidbuy_car()if(people.getCash()3000)System.out.println(people.getUsername()+花+people.getCash()+块买了新车交易结束);elseSystem.out.println(people.getUsername()+金钱不够,请继续比赛!); 最后创建一个客户端,用来模拟买车的行为:packagerun_main;importbuy_car_imple.people;importbuy_car_xy_buy_car_imple;publicclassrun_mainpublicstaticvoidmain(Stringargs)peoplepeople_ref1=newpeople();people_ref1.setCash(4000);people_ref1.setUsername(高洪岩);peoplepeople_ref2=newpeople();people_ref2.setCash(2000);people_ref2.setUsername(岩洪高);proxy_buy_car_impleproxy_buy_car_imple=newproxy_buy_car_imple();proxy_buy_car_imple.setPeople(people_ref1);proxy_buy_car_imple.buy_car();proxy_buy_car_imple.setPeople(people_ref2);proxy_buy_car_imple.buy_car(); 程序运行结果如下:高洪岩花4000块买了新车交易结束岩洪高金钱不够,请继续比赛! 这样people就不可能自由的拥有车辆,必须经过proxy的认证之后才可以。 而代理模式在GOF四人帮的介绍中大体有4种使用情景: (1)远程代理。典型的就是客户端与webservice使用的情况,客户端由于是针对OOP编程,而不是针对webservice中的方法进行编程,所以得在客户端模拟一下webservice的环境,用proxy来对webservice进行包装,这样就可以使用proxy代理类来远程操作webservice了。 (2)虚拟代理。比如你要开发一个大文档查看软件,大文档中有大的图片,有可能一个图片有100MB,在打开文件时不可能将所有的图片都显示出来,这样就可以使用代理模式,当需要查看图片时,用proxy来进行大图片的打开。 (3)安全代理。其实也就是本例中所举的买车的例子,金钱不够不可以买车! (4)智能指引。比如在访问一个对象时检测其是否被锁定等情况。4【外观模式应用场景举例】 比如在玩“极品飞车”这款游戏,你只需要等待的就是倒计时到0时以最快的车速冲到第一名,但游戏者根本没有想过在车冲出去之前要做哪些工作,比如挂档,离合器,油箱检测,调整方向等等的微操作,将这些微操作封装起来变成一个接口就是外观模式了。在WEB开发中的MVC分层架构就是典型的一个外观模式,每一层将操作的具体内容隐藏起来,保留一个接口供上层调用。 【外观模式解释】 类型:结构模式 为子系统中的一组接口提供一个一致的interface接口界面。 【外观模式UML图】 【外观模式-JAVA代码实现】 新建赛车类:packagecar_package;publicclasscarpublicvoidstart()System.out.println(车子已启动);publicvoidcheck_stop()System.out.println(刹车检查);publicvoidcheck_box()System.out.println(检查油箱);publicvoidcheck_console()System.out.println(检查仪表盘是否异常);新建赛车操作的外观类:packagecar_facade;importcar_package.car;publicclasscar_facade_implepublicvoidcar_go_go(carcar_ref)car_ref.check_box();car_ref.check_console();car_ref.check_stop();car_ref.start(); 新建客户端运行类:packagerun_main;importcar_facade.car_facade_imple;importcar_package.car;publicclassrun_mainpublicstaticvoidmain(Stringargs)car_facade_implecar_facade_imple_ref=newcar_facade_imple();car_facade_imple_ref.car_go_go(newcar(); 程序运行结果如下:检查油箱检查仪表盘是否异常刹车检查车子已启动 很简单吧,将子操作用一个外观接口封装起来,然后调用这个接口就是调用那些非常复杂的微操作了。5【抽象工厂模式应用场景举例】写到抽象工厂模式了,我深知“抽象工厂模式”博文会带来一点点高潮,因为程序员对工厂模式中的“抽象工厂”都是比较感冒的,而且关注也很多,我就尽量用我所能理解的那么点程度来给大家介绍这个模式,如果有更好的比喻还请网友指正,先感谢了!设计模式-快餐简解-【工厂方法模式】 介绍了工厂方法的使用,从那个程序中可以看到,奥迪audi车是从audi_car_factory_imple工厂中创建出来的,而大众3W车是从threeW_car_factory_imple工厂中创建出来的,那么如果这2家汽车生产大厂由总部在北京市,现在发展到上海,深圳等城市创建生气汽车的分厂,该怎么办?是不是得将原来的奥迪汽车工厂类:publicclassaudi_car_factory_impleimplementsIcar_factorypublicIcar_interfacecreate_car()car_audi_implecar_audi_imple_ref=newcar_audi_imple();car_audi_imple_ref.setName(奥迪A6);car_audi_imple_ref.setSpeed(300);returncar_audi_imple_ref; 改成类似如下的模样:publicclassaudi_car_factory_impleimplementsIcar_factorypublicIcar_interfacecreate_car(Stringarea_car)if(area_car.equals(北京)创建一个北京的奥迪汽车if(area_car.equals(上海)创建一个上海的奥迪汽车if(area_car.equals(深圳)创建一个深圳的奥迪汽车returncar_audi_imple_ref; 那么发现一个问题,不同地域的汽车却在一个工厂中出现,这是不合乎常理的,因为北京奥迪在北京分厂创建,上海奥迪在上海分厂创建,这样才对。 所以如果遇到分“大系”来创建对象的时候,抽象工厂方法是肯定要使用的时候了。这里的大系指的就是从地域上来分。 这个例子就应该以“用抽象工厂来定义具体工厂的抽象,而由具体工厂来创建对象” 比如在玩“极品飞车”这款游戏,每个地图处都有造车的工厂,每个造车的工厂都因为有造车的档次不同而划分为高级车厂,低级车厂,那么这样的场景正是应用抽象工厂的好时机,再来理解一下这句话“用抽象工厂来定义具体工厂的抽象,而由具体工厂来创建对象”,用抽象造车工厂来定义具体造车工厂的抽象,而由具体的造车工厂来创建汽车,这就是抽象工厂与工厂方法的不同,工厂方法中对象的创建是由工厂方法来确定的,创建的对象都是不分类并且实现一个接口的,而抽象工厂就是在工厂方法的基础上对创建车的对象的行为进行分类,比如北京车厂,上海车厂等。【抽象工厂模式解释】 类型:创建模式 提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。 【抽象工厂模式UML图】 【抽象工厂模式-JAVA代码实现】 新建抽象工厂接口:packagecar_factory_interface;importcar_interface.Icar_interface;publicinterfaceIcar_factorypublicIcar_interfacecreate_threeW_car();publicIcar_interfacecreate_audi_car(); 新建抽象工厂接口的高级车adv工厂实现类:packagecar_factory_imple;importcar_factory_interface.Icar_factory;importcar_imple.car_3w_imple_adv;importcar_imple.car_audi_imple_adv;importcar_interface.Icar_interface;publicclasscar_factory_advimplementsIcar_factorypublicIcar_interfacecreate_audi_car()car_audi_imple_advcar_audi_imple_adv=newcar_audi_imple_adv();car_audi_imple_adv.setName(奥迪A6);car_audi_imple_adv.setSpeed(300);returncar_audi_imple_adv;publicIcar_interfacecreate_threeW_car()car_3w_imple_advcar_3w_imple_adv_ref=newcar_3w_imple_adv();car_3w_imple_adv_ref.setName(大众A6);car_3w_imple_adv_ref.setSpeed(300);returncar_3w_imple_adv_ref;新建抽象工厂接口的普通车low工厂实现类:packagecar_factory_imple;importcar_factory_interface.Icar_factory;importcar_imple.car_3w_imple_low;importcar_imple.car_audi_imple_low;importcar_interface.Icar_interface;publicclasscar_factory_lowimplementsIcar_factorypublicIcar_interfacecreate_audi_car()car_audi_imple_lowcar_audi_imple_low_ref=newcar_audi_imple_low();car_audi_imple_low_ref.setName(奥迪A6);car_audi_imple_low_ref.setSpeed(300);returncar_audi_imple_low_ref;publicIcar_interfacecreate_threeW_car()car_3w_imple_lowcar_3w_imple_low_ref=newcar_3w_imple_low();car_3w_imple_low_ref.setName(大众A6);car_3w_imple_low_ref.setSpeed(300);returncar_3w_imple_low_ref; 上面已经有抽象工厂和具体工厂的实现类了。 新建汽车接口:packagecar_interface;publicinterfaceIcar_interfacepublicvoidstart();publicvoidstop(); 新建汽车父类:packagecar_imple;importcar_interface.Icar_interface;publicclassbase_car_impleimplementsIcar_interfaceprivateintspeed;privateStringname;publicintgetSpeed()returnspeed;publicvoidsetSpeed(intspeed)this.speed=speed;publicStringgetName()returnname;publicvoidsetName(Stringname)=name;publicvoidstart()/TODOAuto-generatedmethodstubpublicvoidstop()/TODOAuto-generatedmethodstub新建大众高级车:packagecar_imple;importcar_interface.Icar_interface;publicclasscar_3w_imple_advextendsbase_car_implepublicvoidstart()System.out.println(富华版:+this.getName()+车以专利技术起动了最高速度为:+this.getSpeed();publicvoidstop()System.out.println(富华版:+this.getName()+车以专利技术停车了); 新建大众普通车:packagecar_imple;importcar_interface.Icar_interface;publicclasscar_3w_imple_lowextendsbase_car_implepublicvoidstart()System.out.println(普通版:+this.getName()+车以专利技术起动了最高速度为:+this.getSpeed();publicvoidstop()System.out.println(普通版:+this.getName()+车以专利技术停车了); 新建大众普通车:packagecar_imple;importcar_interface.Icar_interface;publicclasscar_audi_imple_advextendsbase_car_implepublicvoidstart()System.out.println(富华版:+this.getName()+车以专利技术起动了最高速度为:+this.getSpeed();publicvoidstop()System.out.println(富华版:+this.getName()+车以专利技术停车了);新建奥迪普通车:packagecar_imple;importcar_interface.Icar_interface;publicclasscar_audi_imple_lowextendsbase_car_implepublicvoidstart()System.out.println(普通版:+this.getName()+车以专利技术起动了最高速度为:+this.getSpeed();publicvoidstop()System.out.println(普通版:+this.getName()+车以专利技术停车了); 新建客户端运行类:packagerun_main;importcar_factory_imple.car_factory_adv;importcar_factory_interface.Icar_factory;importcar_interface.Icar_interface;publicclassrun_mainpublicstaticvoidmain(Stringargs)Icar_factoryIcar_factory_ref=newcar_factory_adv();Icar_interfaceIcar_interface_ref=Icar_factory_ref.create_threeW_car();Icar_interface_ref.start();Icar_interface_ref.stop(); 程序运行结果如下:富华版:大众A6车以专利技术起动了最高速度为:300富华版:大众A6车以专利技术停车了 抓一篇阎宏的小文字:一开始只在后花园中种蔬菜类的时候可以用简单工厂模式,由工厂负责生成具体的蔬菜类,但是如果后花园要引进水果类的时候简单模式就行不通了,因此需要使用工厂方法模式,将产品类族分开。但是如果后花园的规模继续扩大到地域范围的分割时,比如说一个在北京,一个在上海的时候,工厂方法模式就不够了,因为对两个后花园来说,每个后花园的植物是要被种在一起的,并且两个后花园用工厂方法模式是无法体现其区别的 从程序中可以看到,工厂是抽象的,工厂的实现是不样的,不同的工厂创建出不同汽车。而工厂方法仅仅是用一个工厂去创建很多汽车。6【观察者模式应用场景举例】 比如在玩“极品飞车”这款游戏,每一个车手到达终点的时候,都会在其它车手的屏幕上显示:某某人以多少时间到达终点的提示,其实这就是一个典型的观察者模式的应用,观察者模式即是典型的双向一对多的应用场景下用一的一端来通知多的一端。 【观察者模式解释】 类型:行为模式 定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象的状态发生改变时,会通知所有的观察者对象,使它们能够自己更新自己。 【观察者模式UML图】 【观察者模式-JAVA代码实现】 新建抽象发布通知父类:packagecarer_subject;importjava.util.ArrayList;importjava.util.List;importcarer_observer.carer_observer;publicinterfacecarer_subject_parentpublicvoidset_state(Stringstate_string);publicStringget_state();publicvoidadd_observer(carer_observercarer_observer_ref);publicvoidsub_observer(carer_observercarer_observer_re
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025人民医院医疗资源调配考核
- 沧州市人民医院急诊配血专项考核
- 2025内蒙古赤峰市元宝山区事业单位通过“绿色通道”引进高层次人才10人模拟试卷及答案详解(夺冠)
- 2025北京市公园管理中心所属事业单位第一批高层次人才招聘2人模拟试卷附答案详解(考试直接用)
- 2025河南新乡学院诚聘高层次人才100人模拟试卷及答案详解参考
- 2025北京市海淀区锦秋学校招聘考前自测高频考点模拟试题附答案详解
- 2025广西玉林市玉州区城北供销合作社招聘行政工作人员3人考前自测高频考点模拟试题附答案详解
- 2025北京大学中国社会科学调查中心招聘3名劳动合同制工作人员模拟试卷及完整答案详解一套
- 2025内蒙古锡林浩特市内蒙古北方人才集团招聘10人模拟试卷含答案详解
- 2025河南郑州大学第三附属医院招聘160名考前自测高频考点模拟试题带答案详解
- 明市2025新闻记者职业资格考试(新闻采编实务)复习题及答案
- 人工牛黄甲硝唑胶囊课件
- 全产业链视角下我国低空经济保险发展研究
- 核心素养下初中数学符号意识的培养
- 淮北矿业安全管理办法
- 诊所日常运营管理规范流程
- 法国文学课件
- 2025年止血技术理论知识考试试题及答案
- ECMO护理进修汇报
- 2025年(完整版)(高级)政工师理论考试题库与答案
- 首钢职务职级管理办法
评论
0/150
提交评论