版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验一 工厂模式的应用【实验目的】1) 掌握工厂模式( Factory)的特点2) 分析具体问题,使用工厂模式进行设计。【实验内容和要求】有一个 OEM 制造商代理做 HP 笔记本电脑 (Laptop),后来该制造商得到了更 多的品牌笔记本电脑的订单 Acer、Lenovo、Dell ,该 OEM 商发现,如果一次同 时做很多个牌子的本本,有些不利于管理。利用工厂模式改善设计,用控制台应 用程序实现该 OEM 制造商的工厂模式。该模式的 UML 图如下。【模式 UML 图 】【模式代码( JAVA 语言实现)】public class FactoryMethod / 主类 public sta
2、tic void main(String args) Computer c;Factory f =new DellFactory();c = f.getComputerType(); c.ComputerType();f = new LenovoFactory();c = f.getComputerType(); c.ComputerType();f = new AcerFactory();c = f.getComputerType(); c.ComputerType();interface FactoryComputer getComputerType();class DellFactory
3、 implements Factory Overridepublic Computer getComputerType() return new Dell();class AcerFactory implements Factory Overridepublic Computer getComputerType() return new Acer();class LenovoFactory implements Factory Overridepublic Computer getComputerType() return new Lenovo();*/电脑品牌interface Comput
4、erpublic void ComputerType();class Dell implements ComputerOverridepublic void ComputerType() / TODO Auto generated method stubSystem. out .println("Dell Computer");class Acer implements ComputerOverride public void ComputerType() System. out .println("Acer Computer" );class Leno
5、vo implements ComputerOverride public void ComputerType() / TODO Auto generated method stubSystem. out .println( "Lenovo Computer" ); 运行截图】实验小结】通过本次实验,学会了使用工厂方法模式。工厂方法模式的适用性如下: 当一个类不知道它所必须创建的对象的类时。 当一个类希望由它的子类来指定它所创建的对象时。 当类将创建对象的职责委托给多个帮助子类中的某一个,并且希望将哪 一个帮助子类是代理这一信息局部化时。实验二 抽象工厂模式的应用实验目的】
6、1) 掌握抽象工厂模式( Abstract Factory)的特点2) 分析具体问题,使用抽象工厂模式进行设计。 实验内容和要求】麦当劳( McDonalds)和肯德基( KFC)快餐店都经营汉堡( Hamburg)和 可乐( Cola),用 JAVA 控制台应用程序实现这两个快餐店经营产品的抽象工厂 模式。该模式的 UML 图如下。【模式 UML 图】【模式代码】public class AbstractFactoryTest public static void main(String args) Hamburg h;Cola c;AbstractFactory af = new MDNF
7、actory();h = af.createHamburg(); c = af.createCola(); h.getHumburg(); c.getCola();af = new KDJFactory(); h = af.createHamburg(); c = af.createCola(); h.getHumburg(); c.getCola();interface AbstractFactory Hamburg createHamburg(); Cola createCola();class MDNFactory implements AbstractFactory Overridep
8、ublic Hamburg createHamburg() return new MDNHamburg();Overridepublic Cola createCola() return new MDNCola();class KDJFactory implements AbstractFactoryOverridepublic Hamburg createHamburg() return new KDJHamburg();Overridepublic Cola createCola() return new KDJCola();Hamburg/* * kDJ & */ interfa
9、cevoid getHumburg();class MDNHamburg implements HamburgOverridepublic void getHumburg() System. out .println( "MDNHamburg" );class KDJHamburg implements Hamburg Overridepublic void getHumburg() / TODO Auto generated method stubSystem. out .println( "KDJHamburg" );interface Colavo
10、id getCola();class MDNCola implements ColaOverridepublic void getCola() System. out .println( "MDNCola" ); class KDJCola implements ColaOverridepublic void getCola() System. out .println( "KDJCola" ); 运行截图】实验小结】抽象工厂模式主要适用于以下情况: 一系列要独立于它的产品的创建、组合和表示时。、 一个系统要由多个产品系列中的一个来配置时。 当要强调一系
11、列相关的产品对象的设计以便进行联合使用时。 当要提供一个产品类库,而只要显示它们的接口而不是实现时实验三 适配器模式的应用【实验目的】1) 掌握适配器模式( Adapter)的特点2) 分析具体问题,使用适配器模式进行设计。【实验内容和要求】一个软件团队开发绘图系统,设计了圆对象 (Circle) 、矩形对象 (Rectangle), 线对象 (Line)都支持 Draw()函数,即可以通过 Draw()函数绘制图形。为了加快项 目进度,将角度对象 (Angle) 绘制功能交给了合作团队实现。但合作团队将角度 对象绘制函数定为了 DrawAngle() 。绘图系统提供给用户后,用户不满意,希望
12、 能统一的调用,不用记太多命令。应用适配器模式,用 JAVA 控制台应用程序完 善该设计。该模式的 UML 图如下。【模式 UML图】模式代码】public class AdapterTest public staticvoid main(String args) Paint a =new AngleAdapter();a. draw();interface Paint void draw();class Circle implements Paint Override public void draw() System. out .println( " 圆圆 " ); c
13、lass Rectangle implements PaintOverride public void draw() System. out .println( " 方方 " ); class Line implements Paint Override public void draw() System. out .println( " 线线 " ); class Angle public void DrawAngle()System. out .println( " 角度 " ); class AngleAdapter imple
14、ments Paint private Angle a=new Angle(); Override public void draw() / TODO Auto generated method stuba. DrawAngle();【运行截图】实验小结】 适配器模式主要适用于以下情况: 当想要使用一个已经存在的类,但是该类的接口不符合现有的需求时。 当需要创建一个可以被复用的类,该类能够与其他无关的类甚至无法预见的 类协同工作时。当需要使用一个已经存在的子类,但是不可能对所有的都进行子类化以匹配 他们的接口时,对象适配器可以对其父类接口进行适配。实验四 桥接模式的应用实验目的】1) 掌握桥接
15、模式( Bridge)的特点2) 分析具体问题,使用桥接模式进行设计实验内容和要求】小杯一 个 咖 啡 店 可 以 提 供 大 杯 (JorumCoffee) 、 中 杯 (MediumCoffee) 、 (SmallCoffee)的咖啡 (Coffee),为了满足不同用户的口味,在咖啡中可以添加牛奶 (Milk) ,或者糖(Sugar),或者柠檬 (Lemon),提供给用户不同口味的组合,如大 杯咖啡加牛奶,中杯咖啡加糖,小杯咖啡加柠檬,小杯咖啡加糖等。应用桥接模 式,用 JAVA 控制台应用程序实现该设计。该模式的 UML 图如下。模式类图】【模式代码】package Constructo
16、r; public class BridgeTest public static void main(String args) Bridge b; b=new Sugar();b. setCoffee( new JorumCoffee();b. getCoffee();b=new Milk();b.setCoffee( new SmallCoffee();b.getCoffee();interface Coffeevoid getCoffee();class JorumCoffee implements CoffeeOverridepublic void getCoffee() / TODO
17、Auto generated method stubSystem. out .print( " 大杯咖啡 " );class MediumCoffee implements CoffeeOverridepublic void getCoffee() / TODO Auto generated method stubSystem. out .print( " 中杯咖啡 " );class SmallCoffee implements CoffeeOverridepublic void getCoffee() / TODO Auto generated me
18、thod stubSystem. out .print( " 小杯咖啡 " );/* 配料*/abstract class Bridge protected Coffee c; void setCoffee(Coffee co)c=co;public void getCoffee()c. getCoffee();class Sugar extends BridgeOverridepublic void getCoffee()c. getCoffee();System. out .println(" 加糖 " );class Milk extends Br
19、idgeOverridepublic void getCoffee()c.getCoffee();System. out .println( " 加牛奶 " );class Lemon extends BridgeOverridepublic void getCoffee()c.getCoffee();System. out .println( " 加柠檬 " );【运行截图】【实验小结】桥接模式的适用情况有:当不希望在抽象和它的实现之间有一个固定的绑定关系时。 当类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充时 当对一个抽象类的实现部分的修改
20、应对客户不产生影响时。实验五 装饰模式的应用实验目的】1) 掌握装饰模式( Decorator)的特点2) 分析具体问题,使用装饰模式进行设计 实验内容和要求】“喜羊羊逃命 ”游戏:喜羊羊被灰太狼追,喜羊羊最多 5 条命,灰太狼每咬到 喜羊羊一次,喜羊羊就要少一条命。在逃的过程中喜羊羊可以吃到三种苹果,吃 “红苹果 ”可以给喜羊羊加上保护罩,吃 “绿苹果 ”可以加快喜羊羊奔跑速度,吃 “黄 苹果 ”可以使喜羊羊趟着水跑。应用装饰模式,用 JAVA 控制台应用程序实现该 设计。绘制该模式的 UML 图。提示:这个例子如果用类的继承来实现的话那可就麻烦了,你需要为喜羊羊 派生 3*2*1=6 个子
21、类(有保护罩的喜羊羊,奔跑速度加快的喜羊羊,会趟水的喜 羊羊,既有保护罩又会趟水的喜羊羊,奔跑速度快且会趟水的喜羊羊,有保护罩 且奔跑速度快的喜羊羊,有保护罩、奔跑速度快且会趟水的喜羊羊),如果使用 装饰模式的那就不用派生诸多子类了,当喜羊羊每吃到一个苹果,我们就用装饰 模式给喜羊羊加一个动态增加一个新功能即可。【模式类图】模式代码】public class DecoratorTest01 public static void main(String args) ConcreteXiYY cxyy= new ConcreteXiYY(); ProtectXiYangyang px= new P
22、rotectXiYangyang(); FastXiYangyang fx= new FastXiYangyang(); SwimingXiYangyang sx= new SwimingXiYangyang(); px.setXiYangyang(cxyy);px.Operation(); fx.setXiYangyang(px);fx.Operation(); sx.setXiYangyang(fx);sx.Operation();interface XiYangyang public void Operation();class ConcreteXiYY implements XiYan
23、gyangOverride public void Operation() / TODO Auto generated method stub System. out .println( " 喜羊羊 " );abstract class Decorator implements XiYangyang protected XiYangyang xyy; public void setXiYangyang(XiYangyang xyy) this . xyy =xyy;Override public void Operation() / TODO Auto generated
24、method stub xyy .Operation();class ProtectXiYangyang extends Decorator Overridepublic void Operation() / TODO Auto generated method stubSystem. out .print( " 有保护罩的 " );super .Operation();class FastXiYangyang extends Decorator Overridepublic void Operation() / TODO Auto generated method stu
25、bSystem. out .print( " 加速的 " );super .Operation();class SwimingXiYangyang extends Decorator Overridepublic void Operation() / TODO Auto generated method stubSystem. out .print( " 会游泳的 " );super .Operation();【运行截图】【实验小结】装饰模式的适用情况有:当需要以不影响其他对象为前提实现动态、透明地给单个对象添加职责时 当需要将对象的某些职责进行撤销操作
26、时。 当不能用生成子类的方法进行当前系统的扩充时。实验六 代理模式的应用【实验目的】1) 掌握代理模式( Proxy)的特点2) 分析具体问题,使用代理模式进行设计。【实验内容和要求】生产商 (Factory)需要销售商品 (Product),网上商城 (E-Shop)提供了一个平台, 可以帮助销售这些商品,获得更大的销量。当顾客 (Custom)从网上商城选购商品 的时候,实际是从生产商获得的商品。应用代理模式,用 JAVA 控制台应用程序 改进该设计。绘制该模式的 UML 图。【模式 UML图】【实验代码】public class ProxyTest01 publicstaticvoid
27、main(String args) /TODO Auto generated method stubE_shop es= new E_shop(); duct(); abstract class Productpublic abstract void product(); class Factory extends ProductOverridepublic void product() / TODO Auto generated method stubSystem. out .println( " 商品正在促销中,满一百减 50." ); class E_sh
28、op extends Product private Factory factory ; public E_shop() factory =new Factory();Overridepublic void product() / TODO Auto generated method stub factory .product();运行截图】【实验小结】代理模式的有以下几种适用情况: 当需要为一个对象在不同的地址空间提供局部的代表时。 当需要创建开销非常大的对象时。当需要控制原始对象的访问时。 当需要再访问对象时执行一些附加操作时,比如通过代理对象计算访问实际 对象的次数。实验七 观察者模式的
29、应用【实验目的】1) 掌握外观模式( Observer)的特点2) 分析具体问题,使用外观模式进行设计。【实验内容和要求】网上商店中如果商品( product)在名称( name)、价格( price)等方面有变 化,系统能自动通知会员,将是网上商店区别传统商店的一大特色。如何设计实 现? 说明你所选择的设计模式,画出类关系图并指明各个类的角色。应用外观 模式,用 JAVA 控制台应用程序改进该设计。绘制该模式的 UML 图。 【模式 UML 图】模式代码】import java.util.ArrayList;public class ObeserverTest public static v
30、oid main(String args) / TODO Auto generated method stubConcreteSubject cs= new ConcreteSubject();cs.Attach( new ConcreteObserver(cs, cs.Attach( new ConcreteObserver(cs,cs.Attach( new ConcreteObserver(cs,"1 号会员 " );"2 号会员 " );"3 号会员 " );"4 号会员 " );100 元 "
31、);cs.Attach( new ConcreteObserver(cs, cs.setState( "C+ 编程思想价钱下降 cs.Notify();abstract class Observerpublic abstract void update();class ConcreteObserver extends ObserverprivateString name;privateString state ;privateConcreteSubjectcs ;publicConcreteSubject getConcreteSubject()return cs ;public v
32、oid setConcreteSubject(ConcreteSubject cs) this . cs =cs;public ConcreteObserver(ConcreteSubject cs,String name) this . cs =cs;this . name=name;Overridepublic void update() / TODO Auto generated method stubstate =cs .getState();System. out .println(name+" 观察到的状态是: " +state );abstract class
33、 Subjectprivate ArrayList<Observer> observers =new ArrayList<Observer>();public void Attach(Observer o)observers .add(o);public void Detach(Observer o)observers .remove(o);/ 通知publicvoid Notify()for (int i = 0; i <observers .size(); i+) observers .get(i).update();class ConcreteSubject
34、extends Subjectprivate String statethispublic void setState(String state)String getState()state ;. state =state;publicreturn运行截图】【实验小结】观察者模式的适用情况有:当一个抽象模型有两个方面,而其中一个方面必须依赖于另一个方面时。 当对一个对象的改变需要同时改变其他对象但是却不知道具体有多少个对 象等到改变时。当一个对象必须通知其他对象但是却不能与其他对象造成紧密耦合时。实验八 职责链模式的应用【实验目的】1) 掌握职责链模式( Chain of Responsibi
35、lity)的特点2) 分析具体问题,使用职责链模式进行设计。【实验内容和要求】高校学生请假需要符合学校规定,假如班主任可以批准 1 天假,系主任可以 批准 7 天假,各学院院长可以批准 30 天,学校校长可以批准 1 年。应用职责链 模式,用 JAVA 控制台应用程序实现该设计。绘制该模式的 UML 图。【模式 UML图】模式代码】public class StudentClient public static void main(String args) / TODO Auto generated method stub Handler fdy=new FuDaoYuan();Handler
36、 xzr= new XiZhuRen();new XueYuan(); new XueXiao();Handler xy=Handler xx= fdy.setSuccessor(xzr);xzr.setSuccessor(xy);xy.setSuccessor(xx);for ( int i = 1; i < 20; i+=2) fdy.handleRequest(i);/ 处理请求的接口 abstract class Handlerprotected Handler successor ;public void setSuccessor(Handler successor) this
37、 . successor =successor;public abstract void handleRequest( int request);class FuDaoYuan extends HandlerOverridepublic void handleRequest( int request) / TODO Auto generated method stub if (request<=1)System. out .println( this .getClass().getSimpleName()+ 求 " +request);else if ( this . succ
38、essor != null )System. out .println( this .getClass().getSimpleName()+ 无法满足请求,转入下一个处理者 " );this . successor .handleRequest(request);class XiZhuRen extends HandlerOverridepublic void handleRequest( int request) / TODO Auto generated method stub if (request<=7)System. out .println( this .getCl
39、ass().getSimpleName()+ 求 " +request);else if ( this . successor != null )System. out .println( this .getClass().getSimpleName()+ 无法满足请求,转入下一个处理者 " );this . successor .handleRequest(request);" 处理了请" 自身" 处理了请" 自身 class XueYuan extends HandlerOverridepublic void handleRequ
40、est( int request) / TODO Auto generated method stubif (request<=9)System. out .println( this .getClass().getSimpleName()+ " 处理了请 求 " +request);else if ( this . successor != null )System. out .println( this .getClass().getSimpleName()+ " 自身 无法满足请求,转入下一个处理者 " );this . successor
41、.handleRequest(request);class XueXiao extends HandlerOverridepublic void handleRequest( int request) / TODO Auto if (request<=15)System. outgenerated method stub.println(this .getClass().getSimpleName()+" 处理了请求 " +request);else System. out.println("该生请假时间太长,不能批准 " );【运行截图】FuDa
42、oYuan 处理了请求 1FuDaoYuan 自身无法满足请求,转入下一个处理者XiZhuRen 处理了请求 3FuDaoYuan 自身无法满足请求,转入下一个处理者XiZhuRen 处理了请求 5FuDaoYuan 自身无法满足请求,转入下一个处理者XiZhuRen 处理了请求 7FuDaoYuan 自身无法满足请求,转入下一个处理者XiZhuRen 自身无法满足请求,转入下一个处理者XueYuan 处理了请求 9FuDaoYuan 自身无法满足请求,转入下一个处理者XiZhuRen 自身无法满足请求,转入下一个处理者XueYuan 自身无法满足请求,转入下一个处理者XueXiao 处理了请
43、求 11FuDaoYuan 自身无法满足请求,转入下一个处理者XiZhuRen 自身无法满足请求,转入下一个处理者XueYuan 自身无法满足请求,转入下一个处理者XueXiao 处理了请求 13FuDaoYuan 自身无法满足请求,转入下一个处理者XiZhuRen 自身无法满足请求,转入下一个处理者XueYuan 自身无法满足请求,转入下一个处理者XueXiao 处理了请求 15FuDaoYuan 自身无法满足请求,转入下一个处理者XiZhuRen 自身无法满足请求,转入下一个处理者XueYuan 自身无法满足请求,转入下一个处理者 该生请假时间太长,不能批准FuDaoYuan 自身无法满足
44、请求,转入下一个处理者XiZhuRen 自身无法满足请求,转入下一个处理者XueYuan 自身无法满足请求,转入下一个处理者 该生请假时间太长,不能批准【实验小结】 职责链模式主要适用于以下情况:当有多个对象可以处理同一个请求,而具体哪个对象来处理这个请求在运行 时刻需要自动判定时。当需要在不明确接受者的情况下向多个对象中的某一个提交请求时。 当处理一个请求的对象集合应该动态地被确定时。实验九 访问者模式的应用实验目的】1) 掌握访问者模式( Visitor )的特点2) 分析具体问题,使用访问者模式进行设计 实验内容和要求】超市中有两类商品,苹果 (Apple)和巧克力 (Chocolate
45、),顾客 (Custom)将所选 商品放在购物车中 (Shopping Cart),然后到收银员 (Cashier)处付款。在购物过程 中,顾客需要对这些商品进行访问,以便确认这些商品的质量,之后收银员也需 要访问购物车内的商品,以便计算价格。应用访问者模式,用 JAVA 控制台应用 程序实现该设计。绘制该模式的 UML 图。模式 UML图】【模式代码】import java.util.ArrayList;import java.util.List;public class ShoppingTest * param args*/public static void main(String ar
46、gs) / TODO Auto generated method stubShoppingCart sc=new ShoppingCart();sc.Attach(new Apple("Apple");sc.Attach(new Chocolate("Chocolate");PersonVisitor pv=new Customer();sc.accept(pv);PersonVisitor ps=new Cashier();sc.accept(ps);abstract class PersonVisitorpublic abstract void vi
47、sitorApple(Apple apple);public abstract void visitorChocolate(Chocolate chocolate);class Customer extends PersonVisitorOverridepublic void visitorApple(Apple apple) / TODO Auto generated method stubSystem.out.println(this.getClass().getSimpleName()+" 选购 "+apple.getName();Overridepublic voi
48、d visitorChocolate(Chocolate chocolate) / TODO Auto generated method stubSystem.out.println(this.getClass().getSimpleName()+" 选购 "+chocolate.getName();class Cashier extends PersonVisitorOverridepublic void visitorApple(Apple apple) / TODO Auto generated method stubSystem.out.println(this.g
49、etClass().getSimpleName()+" 对 "+apple.getName()+" 收银 ");Overridepublic void visitorChocolate(Chocolate chocolate) / TODO Auto generated method stub System.out.println(this.getClass().getSimpleName()+" 对 "+chocolate.getName()+" 收银 "); abstract class Shopprotect
50、ed String name;public Shop(String name)=name;public abstract void accpet(PersonVisitor pv);public String getName()return name;class Apple extends Shoppublic Apple(String name) super(name);/ TODO Auto generated constructor stubOverridepublic void accpet(PersonVisitor pv) / TODO Auto generate
51、d method stub pv.visitorApple(this);class Chocolate extends Shoppublic Chocolate(String name) super(name);/ TODO Auto generated constructor stub Override public void accpet(PersonVisitor pv) / TODO Auto generated method stub pv.visitorChocolate(this);class ShoppingCartList<Shop> shops=new ArrayList<Shop>(); public void Attach(Shop shop) shops.add(shop);public void Detach(Shop shop) shops.remove(shop);public void accept(PersonVisitor visitor) for (int i = 0; i < shops
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小学信息科技人教版(新教材)三年级全一册第4单元 创作数字作品 每课教学设计
- 《混凝土用矿物掺合料应用技术规范》
- 衣物收纳真空压缩与褶皱权衡
- 2026江苏无锡科技职业学院招聘高层次人才37人(长期)考试模拟试题及答案解析
- 2026四川成都光华开源资本管理有限责任公司招聘4人笔试模拟试题及答案解析
- 2026湖南株洲市天元区招聘中小学教职工120人考试备考试题及答案解析
- 攀枝花市2026年春季医疗卫生事业单位引才盐边县岗位考核考试备考试题及答案解析
- 2026年宁德市四四二医院招聘医师1人考试备考试题及答案解析
- 集体主义主题教育方案
- 2026上海对外经贸大学国际经贸学院行政管理人员招聘考试备考题库及答案解析
- 2026年高考数学一轮复习策略《指向深度学习的高中数学教学策略》讲座
- 生物质颗粒采购合同范本
- 青海教师退休管理办法
- 码头防风防汛管理制度
- 2025年安徽省高考化学试卷真题(含答案详解)
- 小米公司企业管理制度
- 安宁市教育体育系统安宁市外选调中小学教师真题2024
- 建筑工程安全管理桩基工程安全技术课件
- GB/T 10816-2024紫砂陶器
- 机场接送服务:汽车租赁合同
- 肺腺癌化疗药物及方案
评论
0/150
提交评论