实验

设计模式实验


《代码重构与设计模式》课堂实验徐海蛟博士2016.03实验一工厂模式的应用【实验目的】1)掌握工厂模式( Factory)的特点2)分析具体问题,使用工厂模式进行设计【实验内容和要求】有一个OEM制造商代理做H笔记本电脑( Laptop),后来该制造商得到了更多的品牌笔记本电脑的订单Acer、 Leno vo、Del,该OEM商发现,如果一次同时做很多个牌子的本本,有些不利于管理。

利用工厂模式改善设计,用控制台应用程序实现该OEM制造商的工厂模式。

该模式的UML图如下。

【模式UML图】Hehaadacin.如扩对(O.0神【模式代码(JAVA语言实现)publicclass Factory Method{//主类publicstaticvoid main (String[ args)tComputer cFactory f new DellFactoryf. getComputerType(f new LenovoFactory (;《代码重构与设计模式》课堂实验徐海蛟博士2016.03c= f. getComputerType()C Computer Typef= new AcerF actory ogetputerType (C.puTerTypednterface Fac toryComputer getComputerType ();class Dell Factoryimplements Factory@Overridepublic Computer get ComputerTypeoireturnnew Dello)clas sAcer Factory implements Factorypublic Computer get ComputerT yeo)ireturnnew Aceroclass Leno voF actory implements FactoryOVerriden. public Computer get ComputerT yeo)ireturnnew Lenovo(*电脑品牌interface Computerpublicvoid Computer Typeclass Dell implements Computer@Overridepublicvoid Computer Typet/ TODO Auto-generated me thod stub《代码重构与设计模式》课堂实验徐海蛟博士2016.03System. out. print ln("Dell Computer");class Acer implements ComputertSystem. out. println(" Acer Computer ");Lass Lenovo implements Computeripublicvoid Computer Type oiSystem. out. println("Lenovo Computer")【运行截图】CDell ComputerLenovo puterAcMame/w 通过本次实验,学会了使用工厂方法模式。

工厂方法模式的适用性如下:当一个类不知道它所必须创建的对象的类时当一个类希望由它的子类来指定它所创建的对象时当类将创建对象的职责委托给多个帮助子类中的某一个,并且希望将哪个帮助子类是代理这一信息局部化时。

《代码重构与设计模式》课堂实验徐海蛟博士2016.03实验二抽象工厂模式的应用【实验目的】1)掌握抽象工厂模式( Abstract Factory)的特点2)分析具体问题,使用抽象工厂模式进行设计。

【实验内容和要求】麦当劳( McDonalds)和肯德基(KFC)快餐店都经营汉堡( Hamburg)和可乐(Coka),用JAVA控制台应用程序实现这两个快餐店经营产品的抽象工厂模式。

该模式的UML图如下。

【模式UML图】Hasan tAbstraetTastoryI.ndatkurbure o md f gelin bars rodNONfactorc4①加 actorf aretecaa cecule 0 yndt allow vldl【模式代码】publicclass AbstractFactoryTest tpublics taticvoid main(String[] args)tHamburg hiAbstractFactory af new MDNFac tory(《代码重构与设计模式》课堂实验徐海蛟博士2016.03h= af create()c= af create Cola;c. getcolaof= new KD]Factory oh= af create(af create Colaoh. getHumburg o;interface Abstract actory iHamburg createHamburg(Cola createCola(;class MDNF actory implements Abstract actory CoVerrideblic Hamburg createHamburg treturnnew MDNHamburgo:Tnpublic Cola createColaoiclass KD]Factory implements AbstractFactory tpublic Hamburg createHamburgo)treturnnew KDJ Hamburgo)public Cola createColao)ireturnnew KDJ Cola(;kD] &MD Ninterface hamburg g《代码重构与设计模式》课堂实验徐海蛟博士2016.03void getHumburg ();class MDNH amburg implements Hamburg@overridepublicvoid getHumburg oiSystem. out. println("MDNHamburg");class KD]Hamburg implements Hamburgpublicvoid getHumburg()t/ TODo Auto-generated method stubSystem. out. println(" KD JHamburg")interface Colavoid getcolao;class MDNCola implements Colatnpublicvoid getcolao) tclass KDJCola implements colapublicvoid getcolaoiout println("KDJ Cola")【运行截图】MDNHamburgMDNColaKDJHamburgKDJColal《代码重构与设计模式》课堂实验徐海蛟博士2016.03【实验小结】抽象工厂模式主要适用于以下情况:系列要独立于它的产品的创建、组合和表示时。

、一个系统要由多个产品系列中的一个来配置时当要强调一系列相关的产品对象的设计以便进行联合使用时当要提供一个产品类库,而只要显示它们的接口而不是实现时。

《代码重构与设计模式》课堂实验徐海蛟博士2016.03实验三适配器模式的应用【实验目的】1)掌握适配器模式( Adapter)的特点2)分析具体问题,使用适配器模式进行设计【实验内容和要求】个软件团队开发绘图系统,设计了圆对象( Circle)、矩形对象( Rectangle)线对象(Line)都支持 DrawL函数,即可以通过 Draw(函数绘制图形。

为了加快项进度,将角度对象( Angle)绘制功能交给了合作团队实现。

但合作团队将角度对象绘制函数定为了 DrawAngleo。

绘图系统提供给用户后,用户不满意,希望能统一的调用,不用记太多命令。

应用适配器模式,用JAVA控制台应用程序完善该设计。

该模式的UML图如下【模式UML图】rantAlleneAnxletdapterwale+d0hew U- void-traNgie o tyo【模式代码】publicclass Adapter Testpublicstaticvoid main(String[ args)iPaint a new AngleAdapter(a draw)《代码重构与设计模式》课堂实验徐海蛟博士2016.03interface Paintivoid draw()class Circle implements Painti@Overridpublicvoid draw()iSystem.out, print1n("圆圆")classRectangle impl ements paint@Overridepublicvoid draw()tSystem.out. print1n("方方")class Line implements Painti@overridepublicvoid draw)System. out, println("线线");nlass Angletpublicvoid DrawAngleotystem.out. print1n("角度")private Angle a=new Angle(@overridepublicvoid draw)t/ TODo Auto-generated me thod stuba. DrawAngleo;【运行截图】角度《代码重构与设计模式》课堂实验徐海蛟博士2016.03【实验小结】适配器模式主要适用于以下情况当想要使用一个已经存在的类,但是该类的接口不符合现有的需求时。

当需要创建一个可以被复用的类,该类能够与其他无关的类甚至无法预见的类协同工作时当需要使用一个已经存在的子类,但是不可能对所有的都进行子类化以匹配他们的接口时,对象适配器可以对其父类接口进行适配。

《代码重构与设计模式》课堂实验徐海蛟博士2016.03实验四桥接模式的应用【实验目的】1)掌握桥接模式( Brid ge)的特点2)分析具体问题,使用桥接模式进行设计。

【实验内容和要求】个咖啡店可以提供大杯( orumCo ffee)、中杯( MediumCoffee)、小杯( Smallcoffee咖啡(Cofe),为了满足不同用户的口味,在咖啡中可以添加牛奶(Mik),或者糖( Sugar),或者柠檬( Lemon),提供给用户不同口味的组合,如大杯咖啡加牛奶,中杯咖啡加糖,小杯咖啡加柠檬,小杯咖啡加糖等。

应用桥接模式,用JAVA控制台应用程序实现该设计。

该模式的UML图如下【模式类图】丁DrianWWWamBClpits". ER,丁uCEEmo svtcEtc gE wolf+ cetEnEtse O 1 ret.【模式代码】publicstaticvoid main(String[] args)fidge b;b=new Sugar《代码重构与设计模式》课堂实验徐海蛟博士2016.03b. setCoffee (new JorumCoffee()b=new Milk o;b. setcoffee(new SmallCoffee())nterface Coffeeioid getCoffeeo;class JorumCoffee implements Coffee@Overridepublicvoid getcoffeeo)[// TODO Auto-generated method stubSystem.out, print("大杯咖啡");class MediumCoffee implements Coffee@Overridepublicvoid getCoffee)i/ TODo Auto-generated me thod stubSystem.out. print("中杯咖啡");class SmallCoffee implements Coffee@Overridepublicvoid getcoffee([System.out, print("小杯咖啡")配料abstractclass Bridgetprotected Coffee cvoid setcoffee(Coffee co)fpublicvoid getCoffee(tgetcoffeeo《代码重构与设计模式》课堂实验徐海蛟博士2016.03class Sugar extends Bridgetpublicvoid getCoffeeOtSystem. out. print1n("加糖")class Milk extends Bridge[Systint1n("加牛奶")class Lemon extends Bridget@Overridepublicvoid getCoffeeOit, print1n("加柠檬")【运行截图】大杯咖啡加糖小杯咖啡加牛奶【实验小结】桥接模式的适用情况有当不希望在抽象和它的实现之间有一个固定的绑定关系时当类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充时当对一个抽象类的实现部分的修改应对客户不产生影响时。

《代码重构与设计模式》课堂实验徐海蛟博士2016.03实验五装饰模式的应用【实验目的】1)掌握装饰模式( Decorator)的特点2)分析具体问题,使用装饰模式进行设计【实验内容和要求】“喜羊羊逃命”游戏:喜羊羊被灰太狼追,喜羊羊最多5条命,灰太狼每咬到喜羊羊一次,喜羊羊就要少一条命。

在逃的过程中喜羊羊可以吃到三种苹果,吃红苹果'可以给喜羊羊加上保护罩,吃绿苹果”可以加快喜羊羊奔跑速度,吃“黄苹果”可以使喜羊羊趟着水跑。

应用装饰模式,用JAVA控制台应用程序实现该设计。

绘制该模式的UML图提示:这个例子如果用类的继承来实现的话那可就麻烦了,你需要为喜羊羊派生3*2*1=6个子类(有保护罩的喜羊羊,奔跑速度加快的喜羊羊,会趟水的喜羊羊,既有保护罩又会趟水的喜羊羊,奔跑速度快且会趟水的喜羊羊,有保护罩且奔跑速度快的喜羊羊,有保护罩、奔跑速度快且会趟水的喜羊羊),如果使用装饰模式的那就不用派生诸多子类了,当喜羊羊每吃到一个苹果,我们就用装饰模式给喜羊羊加个动态增加一个新功能即可【模式类图】t operatIon.OtvedCineretek1Ytyy iYanstarn+Operation O r voidoperation t votihoteotXiYanwane下aatx! thayerIEvlaingri tangyangOperatta((s woIdOperation( gevol+ opee《代码重构与设计模式》课堂实验徐海蛟博士2016.03【模式代码】publicclass DecoratorTest01 ipublicstaticvoid main(String[ args)[ConcreteXiYY cxy y=new ConcreteXiYYo;Protect angyang px=new ProtectxiYan gyang ();FastXiYangyanSwiming XiY angyang Sx=new SwimingXi Yangyang)px. setXiYangy ang(cxyy)pX.fx. setxiYangy ang(px);fxOperation()sx. setxiYangy ang(fx );SX.Operation()interface XiAngyanglicvoid Operation(;nclass ConcreteXiYY implements XiAngyangOverridepublicvoid Operation oi/ TODO Auto- generated me thod stubn. System.out, println("喜羊羊")abstractclass De orator implements XiYan gyangtprotected XiYangyang xyypublicvoid setXi Yan gyang(XiY ang yang xyy)fthis xyy=xyy;Overridepublicvoid Operation i//TODO Auto-generated me thod stub《代码重构与设计模式》课堂实验徐海蛟博士2016.03class ProtectXiY angyang extends Decorator t@Overridpublicvoid Operation o f// TODO Auto-generated me thod stubSystem. out. print("有保护罩的");super Operation (lass FastXiYangyang extends De orator ioverridepublicvoid Operation(i// TODO Auto-generated me thod stubSystem. out, print("加速的");super Operation()class Swiming XiY angyang extends Decorator. fverridepublicvoidOperation ot/ TODO Auto-generated me thod stubSystem.out, print("会游泳的")super Operation(们【运行截图】有保护罩的喜羊羊加速的有保护罩的喜羊羊会游泳的加速的有保护罩的喜羊羊【实验小结】装饰模式的适用情况有当需要以不影响其他对象为前提实现动态、透明地给单个对象添加职责时当需要将对象的某些职责进行撤销操作时。

当不能用生成子类的方法进行当前系统的扩充时,《代码重构与设计模式》课堂实验徐海蛟博士2016.03实验六代理模式的应用【实验目的】1)掌握代理模式( Proxy)的特点2)分析具体问题,使用代理模式进行设计【实验内容和要求】生产商( Factory)需要销售商品( Product,网上商城(E-Shop)提供了一个平台,可以帮助销售这些商品,获得更大的销量。

当顾客( Custom)从网上商城选购商品的时候,实际是从生产商获得的商品。

应用代理模式,用JAⅥA控制台应用程序改进该设计。

绘制该模式的UML图【模式UML图】一ProductbstractIWWWe roduct o wean FactoryE_ shopfactory Factoryproduct O: voidproduct o: void【实验代码】publicclass ProxyTeste1 i《代码重构与设计模式》课堂实验徐海蛟博士2016.03publicstaticvoid main(String[] args)(// TODO Auto-generated me thod stubE shop es=new E shopo)es productoabstractclass Productipublicabstractvoid product(;class factory extends product@Overridepublicvoid product()i// TODO Auto-generated method stubSystem,out. print in("商品正在促销中,满一百减5.");class E shop extends Productpublicfactory=new Factory on@Overridepublicvoid product()iWw-巴n.COm【运行截图】商品正在促销中,满一百减50【实验小结】代理模式的有以下几种适用情况当需要为一个对象在不同的地址空间提供局部的代表时当需要创建开销非常大的对象时。

当需要控制原始对象的访问时。

当需要再访问对象时执行一些附加操作时,比如通过代理对象计算访问实际对象的次数《代码重构与设计模式》课堂实验徐海蛟博士2016.03实验七观察者模式的应用【实验目的】1)掌握外观模式( Observer)的特点2)分析具体问题,使用外观模式进行设计【实验内容和要求】网上商店中如果商品( product)在名称(mame)、价格( price)等方面有变化,系统能自动通知会员,将是网上商店区别传统商店的一大特色。

如何设计实现?说明你所选择的设计模式,画出类关系图并指明各个类的角色。

应用外观模式,用JAVA控制台应用程序改进该设计。

绘制该模式的UML图【模式UML图】abjectObeerverasTaCE observers: ArrayListsobserver)↑tt当ct udate o: voie+otifyo0:veidConcreteObserverConcreteSubJectStrIngE stata java lang Stringstate t StringConcretesubject+setState Q: voLasetState 0: Java. lan:. StrlngetConcreteSub feot (: ConareteSub 'ec+.BeTConcreteSub fect 0: Concretesublectupdate ovoid【模式代码】publicstaticvoid main(string[ args)i/ TODO Auto-generated me thod stubConcreteSubject cs=new Concrete Subject(CS, Attach( new Concreteobserver(Cs,"1号会员"))CS, Attach( new Concrete observer(cs,"2号会员"))cs. Attach( new Concreteobserver(cs,"3号会员"));(Cs,"4号会员"))cs. setstate("C++编程思想价钱下降1元");《代码重构与设计模式》课堂实验徐海蛟博士2016.03CS Notify ();abstractclass observer[ac void update)class Conc server extends observerprivate String nameprivate String stateublic Con creteSubject getConcrete Subjectpublicvoid setconcrete Subject(ConcreteSubject cs)public Con creteobserver(ConcreteSubject cs, String name )fthis. cs=csthis name=name;overrideublicvoid updaten// TODO Auto-generated me thod stubstate=cs setstatedocIn. abstractclass Subjectiprivate Array Listobserver>observers=new Array Listopublicvoid Attach(observer o)tobservers. add(o)ipublicvoid Detach(observer o)tobservers. remove(o);//通知publicvoid Notifyotfor (int i =0; i
当一个对象必须通知其他对象但是却不能与其他对象造成紧密耦合时。

《代码重构与设计模式》课堂实验徐海蛟博士2016.03实验八职责链模式的应用【实验目的】1)掌握职责链模式( Chain of Responsibility)的特点2)分析具体问题,使用职责链模式进行设计【实验内容和要求】髙校学生请假需要符合学校规定,假如班主任可以批准1天假,系主任可以批准7天假,各学院院长可以批准30天,学校校长可以批准1年。

应用职责链模式,用JAVA控制台应用程序实现该设计。

绘制该模式的UML图【模式UML图】c1Iahr I¥ CLEar: Handlet setsuccesorbandelet D: yaidhandleRequest【模式代码】publicclass Student Client iublicstaticvoid main( String[ args)i/ TODO Auto-generated me thod stubHandler fdy=new FuDaoYuan()Handler xzr=new XizhuRenoHandler xy=new XueHandler xx=new XueXiao o;xzr set Suc ces sor(xy)xy. setsuccessor (xx)for (intfdy. handle request(i);《代码重构与设计模式》课堂实验徐海蛟博士2016.03//处理请求的接口abstractclass Handlerprotected Handler successoblicvoid setSuccessor(Handler successor)ithis successor=successorpublicabstractvoid handle Request(int request)classFuDao Yuan extends handlerpublicvoid handleR quest(int reque st)i//TODO Auto-generated me thod stubif(request<=1)tSystem. out, println(this.getc1ass(). getsimpleName()+"处理了请requesfalseif (this successorI=null)fSystem. out. println(this getclass(.getsimpl me()+"HE无法满足请求,转入下一个处理者");this successor. handleRequest(request)class xizhuRen extends Handler@Overridepublicvoid handleR quest(int request)i/ TODO Auto-generated method stubif(request<=7)tystem.out. printin(this,getc1ass() getsimpleName()+"处理了请求"+ request);if(this successor!=null)tystem out println( this getclass(). getsimpleName()+"H5无法满足请求,转入下一个处理者")this successor. handleRequest(request);《代码重构与设计模式》课堂实验徐海蛟博士2016.03publicvoid handleRequest (int request)iif(request<=9)tintan(this,getc1ass() getsimpleName()+"处理了请求"+ request);elseln(this. getclass(), getsimpleName()+"自身无法满足请求,转入下一个处理者")this, successor. handlerequest (request)class XueXiao extends Handler@Overridepublicvoid handle Request(int request)[丁// TODO Auto-generated me thod stubif(request<=15)[System. out, println( this getclass(), getsimpleName()+"处理了请求"+ request);docIn. System.out. println("该生请假时间太长,不能批准");【运行截图】FuDao Yuan处理了请求1FuDao Yuan自身无法满足请求,转入下一个处理者XiZhuRen处理了请求3FuDao yuan自身无法满足请求,转入下一个处理者XiZhuRen处理了请求5FuDao Yuan自身无法满足请求,转入下一个处理者XiZhuRen处理了请求FuDao Yuan自身无法满足请求,转入下一个处理者《代码重构与设计模式》课堂实验徐海蛟博士2016.03XiZhuRen自身无法满足请求,转入下一个处理者XueYuan处理了请求9FuDao Yuan自身无法满足请求,转入下一个处理者XiZheN自身无法满足请求,转入下一个处理者XueYuan自身无法满足请求,转入下一个处理者Xuexiao处理了请求11FuDao Yuan自身无法满足请求,转入下一个处理者XlZhuRen自身无法满足请求,转入下一个处理者XueYuan自身无法满足请求,转入下一个处理者Xuexiao处理了请求13FuDao Yuan自身无法满足请求,转入下一个处理者XiZhuRen自身无法满足请求,转入下一个处理者XueYuan自身无法满足请求,转入下一个处理者Xuexiao处理了请求15FuDao Yuan自身无法满足请求,转入下一个处理者XizhuRen自身无法满足请求,转入下一个处理者XueYuan自身无法满足请求,转入下一个处理者该生请假时间太长,不能批准FuDao Yuan自身无法满足请求,转入下一个处理者XiZhuRen自身无法满足请求,转入下一个处理者XueYuan自身无法满足请求,转入下一个处理者该生请假时间太长,不能批准们【实验小结】职责链模式主要适用于以下情况当有多个对象可以处理同一个请求,而具体哪个对象来处理这个请求在运行时刻需要自动判定时当需要在不明确接受者的情况下向多个对象中的某提交请求时处理一个请求的对象集合应该动态地被确定时。

《代码重构与设计模式》课堂实验徐海蛟博士2016.03实验九访问者模式的应用【实验目的】1)掌握访问者模式( Visitor)的特点2)分析具体问题,使用访问者模式进行设计【实验内容和要求】超市中有两类商品,苹果( Apple)和巧克力( C hoco late),顾客( Custom)将所选商品放在购物车中( Shopping Cart),然后到收银员( Cashie处付款。

在购物过程中,顾客需要对这些商品进行访问,以便确认这些商品的质量,之后收银员也需要访问购物车内的商品,以便计算价格。

应用访问者模式,用JAVA控制台应用程序实现该设计。

绘制该模式的UML图【模式UML图】ClienttA卫0visttorchocoloia 0t,woifocI. GsmsitarChacalst.O). woia+ visstorApple OviErtorthoaolat01'voidShoppingcart-shps: list chp>t < hor: 0secret 0 vaidethane (1 stringChocolatsaccel U voidascet 0《代码重构与设计模式》课堂实验徐海蛟博士2016.03【模式代码】public class ShoppingTest ipublic static void main(String[] args)(Shopping Cart()scAttachnew Apple("Apple"))sc Attach(new Chocolate("Chocolate"));PersonVisitor pv=new Customersc accept(pv);Personvisitor ps=new Cashier()scaccept(ps);abstract class pers onvisitortpublic abstract void visitor Apple(Apple apple);丁public abstract void visitor Chocolate( Chocolate chocolate)class Customer extends Personvisitort@Overridepublic voidle(Applpple)t// TODo Auto-generated me thod stubSystem. out. println( this getclass(. getsimpl me(+ tlapple. getName )ioverridepublic void visitor Chocolate( Chocolate chocolate/ TODO Auto-generated me thod stubSystem. out. println(this getclass(.getsimpleName(+"itj-j+chocolate getName o)class Cashier extends per sonVisitort《代码重构与设计模式》课堂实验徐海蛟博士2016.03@overridepublic void visitorApple (Apple apple)(/ TODO Auto-generated me thod stubSystem. out. println( this getclass(.getsimpleName(+"xf"+ apple. getName()+"收银")@Overridepublic void visitor Chocolate( Chocolate chocolate//TODO Auto-generated me thod stubSystem. out. println(this getclass(). getsimpleName(+"X+ chocolate, getname()+"收银");abstract class Shop frotected string name;public Shop(String name)famenpublic abstract void accpet( Per sonVisitor pv);public String getName()tclass Apple extends shopipublic Apple(String name )tsuper(name );//TODO Auto-generated constructor stuboverridebublic void accpet Per sonVisitor pv)i// TODO Auto-generated me thod stubvvisitor Apple( this)iclass Chocolate extends Shop《代码重构与设计模式》课堂实验徐海蛟博士2016.03public Chocolate(String name)t/ TODO Auto-generated constructor stub@overridepublic void accpet Per sonVisitor pv)i//TODO Auto-generated me thod stubpv. visitor Cho collate(this)List shops=new ArrayList< shop>o;public void Attach( Shop shop))move( shop);public void accept Per sonVisitor visitor )ffor (int i=0; i< shops. size o; i++)f丁get(i).accpet(visitor);lsew Customer选购App1eCustomer选购 ChocolateCashier对App1e收银Cashier对 Choco1ate收银【实验小结】访问者模式主要有以下几种适用情况当一个对象结构包含有很多类对象,但是他们又不同的接口,并且开发人员希望对这些对象实施一些依赖于具体类的操作时。

当需要对一个对象结构中的对象进行很多不同的并且不相关的操作时。

当该对象结构被很多应用共享时《代码重构与设计模式》课堂实验徐海蛟博士2016.03实验十备忘录模式的应用【实验目的】1)掌握备忘录模式( Memento)的特点2)分析具体问题,使用备忘录模式进行设计【实验内容和要求】Window系统可能会异常终止,设计一个系统备份程序。

类 Windows S ystem是发起人角色 Orignation),类 Memento是备忘录角色( Memento),类User是备忘录管理角色( Caretaker)。

应用备忘录模式,用JAVA控制台应用程序实现该设计。

绘制该模式的UML图【模式UML图】Windorssystemstate: StringMemertowindowrcreateMeinentowlindoss 0: Hementowindowsstate StringsetMementofindows ogetstate o F StringsetstaterestatetStatemenentowindows:MementowlindorssetMementoiindons (), voldgetMementoindows () Mementofindoiny【模式代码】publicstaticvoid main(String[] args)i/ TODO Auto-generated me thod stubWindows Systemo)s. setstate("开机正常工作");setMe men towindows(ws creat eMementowindows O)《代码重构与设计模式》课堂实验徐海蛟博士2016.03s. setstate("系统崩了啊!");System. out. print1n("对系统进行恢复wS.setMementowindows(u. getMementowindows ();//备忘录类class Mementowindowsiprivate string state;public Mementowindows( String state//获取状态ublic String getstateotclass Windows Sys temtrivate String state建立状态存储对象ublic Mementowindows create Mement windows()i丁returnnew Mement windows( state);设置状态存储对象publicvoid setMe men towindows(Memen towind owsntowin)tstate=mementowindows gestate//展现状态publicvoid show()iSystem.out, println("状态为:"+ state);//获取状态public String getstate(ireturnstate//设置状态publicvoid setstate(String state)tthis state=stateprivate Me mentowindows me mentowindows《代码重构与设计模式》课堂实验徐海蛟博士2016.03//设定备忘publicvoid setMementowindows(Memen towindows me mentowindows)tthis. me men towind ows=me men towindows//获取备忘public Mement windows getMementowindows()ireturnmementowindows【运行截图】状态为:开机正常工作状态为:系统崩了啊!对系统进行恢复,1s状态为:开机正常工作【实验小结】备忘录模式有以下几种适用情况当必须保存一个对象在某一时刻的全部或部分状态以便在需要时可以将其回复到先前的状态时当使用接口让其他对象直接得到自己的状态会暴露对象的实现细节、继而破坏其封装性。