java设计模式ppt课件耿祥义

上传人:494895****12427 文档编号:241293226 上传时间:2024-06-15 格式:PPT 页数:309 大小:1.78MB
返回 下载 相关 举报
java设计模式ppt课件耿祥义_第1页
第1页 / 共309页
java设计模式ppt课件耿祥义_第2页
第2页 / 共309页
java设计模式ppt课件耿祥义_第3页
第3页 / 共309页
点击查看更多>>
资源描述
封面Java设计模式设计模式 6/15/20241封面 Java设计模式 Java设计模式Java设计模式1第一章第一章 设计模式简介设计模式简介 1.1 什么是设计模式什么是设计模式 6/15/20242 每一个设计模式描述一个在我们周围每一个设计模式描述一个在我们周围不断重复发生的问题,以及该问题的解不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次一次决方案的核心。这样,你就能一次一次地使用该方案而不必做重复劳动。地使用该方案而不必做重复劳动。第一章 设计模式简介 1.1 什么是设计模式 Java21.2 设计模式的起源设计模式的起源 6/15/20243 软件领域的设计模式软件领域的设计模式起源于建筑学起源于建筑学。1977 1977年,建筑大师年,建筑大师AlexanderAlexander出版了出版了A Pattern A Pattern LanguageLanguage:Towns,Building,ConstructionTowns,Building,Construction一书。一书。受受AlexanderAlexander著作的影响著作的影响 ,Kent BeckKent Beck和和Ward Ward CunninghamCunningham在在19871987年举行的一次面向对象的会议上年举行的一次面向对象的会议上发表了论文:在面向对象编程中使用模式。发表了论文:在面向对象编程中使用模式。1.2 设计模式的起源 Java设计模式 Java设31.3 GOF之著作之著作 6/15/20244 目前,被公认在设计模式领域最具影响力的著作是目前,被公认在设计模式领域最具影响力的著作是Erich Gamma、Richard Helm、Ralph Johnson和和John Vlissides在在19941994年合作出版的著作:年合作出版的著作:Design PatternsDesign Patterns:Elements Elements of Reusable Object-Oriented Softwareof Reusable Object-Oriented Software(中译本(中译本设设计模式:可复用的面向对象软件的基本原理计模式:可复用的面向对象软件的基本原理 或或设计模设计模式式),该书被广大喜爱者昵称为),该书被广大喜爱者昵称为GOFGOF(Gang of FourGang of Four)之)之书,被认为是学习设计模式的必读著作,书,被认为是学习设计模式的必读著作,GOFGOF之书已经被公之书已经被公认为是设计模式领域的奠基之作。认为是设计模式领域的奠基之作。1.3 GOF之著作 Java设计模式 Java设41.4 学习设计模式的重要性学习设计模式的重要性 6/15/20245 学习设计模式不仅可以使我们使用好这些学习设计模式不仅可以使我们使用好这些成功的模式,更重要的是可以使我们更加深成功的模式,更重要的是可以使我们更加深刻地理解面向对象的设计思想,非常有利于刻地理解面向对象的设计思想,非常有利于我们更好地使用面向对象语言解决设计中的我们更好地使用面向对象语言解决设计中的问题。问题。1.4 学习设计模式的重要性 Java设计模式 Ja51.5 合理使用模式合理使用模式 6/15/20246 1 1正确使用正确使用 2避免教条避免教条 3模式挖掘模式挖掘1.5 合理使用模式 Java设计模式 Java6第二章第二章 面向对象的几个基本原则面向对象的几个基本原则 2.1 面向抽象原则面向抽象原则 6/15/20247 设计一个类时,不让该类面向具体的设计一个类时,不让该类面向具体的类,而是面向抽象类或接口类,而是面向抽象类或接口 。第二章 面向对象的几个基本原则 2.1 面向抽象原则 7第二章第二章 面向对象的几个基本原则面向对象的几个基本原则 6/15/20248public class Circledouble r;Circle(double r)this.r=r;public double getArea()return 3.14*r*r;public class PillarCircle bottom;double height;Pillar(Circle bottom,double height)this.bottom=bottom;this.height=height;第二章 面向对象的几个基本原则 Java设计模式 Ja8第二章第二章 面向对象的几个基本原则面向对象的几个基本原则 6/15/20249public abstract class Geometry public abstract double getArea();public class PillarGeometry bottom;double height;Pillar(Circle bottom,double height)this.bottom=bottom;this.height=height;第二章 面向对象的几个基本原则 Java设计模式 Ja92.2 开开-闭原则闭原则 6/15/202410 设计应当对扩展开放,对修改关闭。设计应当对扩展开放,对修改关闭。如果您的设计遵守了如果您的设计遵守了“开开-闭原则闭原则”,那,那么这个设计一定是易维护的,因为在设计中么这个设计一定是易维护的,因为在设计中增加新的模块时,不必去修改设计中的核心增加新的模块时,不必去修改设计中的核心模块。模块。2.2 开-闭原则 Java设计模式 Java设计模102.3 高内聚高内聚-低耦合原则低耦合原则 6/15/202411 如如果果类类中中的的方方法法是是一一组组相相关关的的行行为为,则则称该类是称该类是高内聚高内聚的,反之称为低内聚的。的,反之称为低内聚的。所谓所谓低耦合低耦合就是尽量不要让一个类含有就是尽量不要让一个类含有太多的其它类的实例的引用,以避免修改太多的其它类的实例的引用,以避免修改系统的其中一部分会影响到其它部分。系统的其中一部分会影响到其它部分。2.3 高内聚-低耦合原则 Java设计模式 Jav11第四章第四章 命令模式命令模式 6/15/202412命令模式(别名:动作,事务)命令模式(别名:动作,事务)将将一一个个请请求求封封装装为为一一个个对对象象,从从而而使使你你可可用用不不同同的的请请求求对对客客户户进进行行参参数数化化;对对请请求求排排队队或或记记录录请请求求日日志志,以以及支持可撤消的操作。及支持可撤消的操作。Command Pattern(Another Name:Action,Transaction)Encapsulate a request as an object,thereby letting you parameterize clients with different requests,queue or log requests,and support undoable operations.第四章 命令模式 Java设计模式 Java设计模式12一一、概述概述 6/15/202413 在许多设计中,经常涉及到一个对象请求另一个对在许多设计中,经常涉及到一个对象请求另一个对象调用其方法到达某种目的。如果请求者不希望或无象调用其方法到达某种目的。如果请求者不希望或无法直接和被请求者打交道,即不希望或无法含有被请法直接和被请求者打交道,即不希望或无法含有被请求者的引用,那么就可以使用命令模式。求者的引用,那么就可以使用命令模式。一、概述 Java设计模式 Java设计模式8/913实例在军队作战中,指挥官请求三连偷袭敌人,但是指挥官不希望或无法直接与三连取得联系,那么可以将该请求:“三连偷袭敌人”形成一个“作战命令”。只要能让该作战命令被执行,就会实现三连偷袭敌人的目的。实例在军队作战中,指挥官请求三连偷袭敌人,但是指挥官不希望或14二、二、命令模式的结构与使用命令模式的结构与使用 6/15/202415模式的结构中包括四种角色:模式的结构中包括四种角色:接收者(接收者(ReceiverReceiver)命令命令(Command)(Command)接口接口 具体命令(具体命令(ConcreteCommandConcreteCommand)请求者(请求者(InvokerInvoker)二、命令模式的结构与使用 Java设计模式 Java156/15/202416模式的模式的UMLUML类图类图 Java设计模式 Java设计模式8/9/202316166/15/202417模式的结构的描述与使用模式的结构的描述与使用 1 1接收者(接收者(ReceiverReceiver):CompanyArmy.javaCompanyArmy.javapublic class CompanyArmypublic class CompanyArmy public void sneakAttack()public void sneakAttack()System.out.println(System.out.println(我们知道如何偷袭敌人我们知道如何偷袭敌人,保证完成任务保证完成任务););Java设计模式 Java设计模式8/9/202317176/15/202418模式的结构的描述与使用模式的结构的描述与使用 2 2命令(命令(CommandCommand)接口)接口:Command.javaCommand.javapublic interface Command public interface Command public abstract void execute();public abstract void execute();Java设计模式 Java设计模式8/9/202318186/15/202419模式的结构的描述与使用模式的结构的描述与使用 3 3具体命令(具体命令(ConcreteCommandConcreteCommand)ConcreteCommand.java ConcreteCommand.java public class ConcreteCommand implements Commandpublic class ConcreteCommand implements Command CompanyArmy army;CompanyArmy army;/含有接收者的引用含有接收者的引用 ConcreteCommand(CompanyArmy army)ConcreteCommand(CompanyArmy army)this.army=army;this.army=army;public void execute()public void execute()/封装着指挥官的请求封装着指挥官的请求 army.sneakAttack();army.sneakAttack();/偷袭敌人偷袭敌人 Java设计模式 Java设计模式8/9/202319196/15/202420模式的结构的描述与使用模式的结构的描述与使用 4 4请求者(请求者(InvokerInvoker)ArmySuperior.java ArmySuperior.java public class ArmySuperiorpublic class ArmySuperior Command command;Command command;/用来存放具体命令的引用用来存放具体命令的引用 public void setCommand(Command command)public void setCommand(Command command)mand=command;mand=command;public void startExecuteCommand()public void startExecuteCommand()/让具体命令执行让具体命令执行execute()execute()方法方法 command.execute();command.execute();Java设计模式 Java设计模式8/9/202320206/15/202421模式的结构的描述与使用模式的结构的描述与使用 5 5应用应用 Application.javaApplication.java public class Application public class Application public static void main(String args)public static void main(String args)CompanyArmy CompanyArmy 三连三连=new CompanyArmy();=new CompanyArmy();Command command=new ConcreteCommand(Command command=new ConcreteCommand(三连三连););ArmySuperior ArmySuperior 指挥官指挥官=new ArmySuperior();=new ArmySuperior();指挥官指挥官.setCommand(command);.setCommand(command);指挥官指挥官.startExecuteCommand();.startExecuteCommand();Java设计模式 Java设计模式8/9/20232121三、三、命令模式的优点命令模式的优点 6/15/202422 在命令模式中,请求者(Invoker)不直接与接收者(Receiver)交互,即请求者(Invoker)不包含接收者(Receiver)的引用,因此彻底消除了彼此之间的耦合。命令模式满足“开-闭原则”。如果增加新的具体命令和该命令的接受者,不必修改调用者的代码,调用者就可以使用新的命令对象;反之,如果增加新的调用者,不必修改现有的具体命令和接受者,新增加的调用者就可以使用已有的具体命令。三、命令模式的优点 Java设计模式 Java设计模22四、应用举例 模拟带控制开关的小电器。该电器上有四个开关,两个一组,其中一组负责打开、关闭小电器上的照明灯,另一组负责打开、关闭小电器上的摄像头。四、应用举例 模拟带控制开关的小电器。该电器上有四个开关,两23第五章第五章 观察者模式观察者模式 6/15/202424观察者模式(别名:依赖,发布观察者模式(别名:依赖,发布-订阅)订阅)定定义义对对象象间间的的一一种种一一对对多多的的依依赖赖关关系系,当当一一个个对对象象的的状状态态发发生生变变化化时时,所所有有依依赖赖于于它它的的对对象象都都得得到到通通知知并并被被自动更新。自动更新。Observer Pattern(Another Name:Dependents,Publish-Subscribe)Define a one-to-many dependency between objects so that when one object changes state,all its dependents are notified and updated automatically.第五章 观察者模式 Java设计模式 Java设计模24一一、概述概述 6/15/202425 在许多设计中,经常涉及到多个对象在许多设计中,经常涉及到多个对象都对一个特殊对象中的数据变化感兴趣,都对一个特殊对象中的数据变化感兴趣,而且这多个对象都希望跟踪那个特殊对而且这多个对象都希望跟踪那个特殊对象中的数据变化。象中的数据变化。一、概述 Java设计模式 Java设计模式8/925实例某些寻找工作的人对“求职中心”的职业需求信息的变化非常关心,很想跟踪“求职中心”中职业需求信息的变化。“求职者”可以让“求职中心”把自己登记下来,这样求职中心就会及时通知她最新的职业信息需求。实例某些寻找工作的人对“求职中心”的职业需求信息的变化非常关26二、二、模式的结构与使用模式的结构与使用 6/15/202427观察者模式的结构中包括四种角色:观察者模式的结构中包括四种角色:主题(主题(SubjectSubject)观察者(观察者(ObserverObserver)具体主题(具体主题(ConcreteSubjectConcreteSubject)具体观察者(具体观察者(ConcreteObserverConcreteObserver)二、模式的结构与使用 Java设计模式 Java276/15/202428模式的模式的UMLUML类图类图 Java设计模式 Java设计模式8/9/202328286/15/202429模式的结构的描述与使用模式的结构的描述与使用 1 1主题主题:Subject.java Subject.java public interface Subject public interface Subject public void addObserver(Observer o);public void addObserver(Observer o);public void deleteObserver(Observer o);public void deleteObserver(Observer o);public void notifyObservers();public void notifyObservers();Java设计模式 Java设计模式8/9/202329296/15/202430模式的结构的描述与使用模式的结构的描述与使用 2 2观察者观察者:Obsever.java Obsever.java public interface Observerpublic interface Observer public void hearTelephone(String heardMess);public void hearTelephone(String heardMess);Java设计模式 Java设计模式8/9/202330306/15/202431模式的结构的描述与使用模式的结构的描述与使用 3 3具体主题具体主题 SeekJobCenter.java_1 SeekJobCenter.java_1 import java.util.ArrayList;public class SeekJobCenter implements Subject String mess;boolean changed;ArrayList personList;SeekJobCenter()personList=new ArrayList();mess=;changed=false;public void addObserver(Observer o)if(!(personList.contains(o)personList.add(o);public void deleteObserver(Observer o)if(personList.contains(o)personList.remove(o);Java设计模式 Java设计模式8/9/202331316/15/202432模式的结构的描述与使用模式的结构的描述与使用 3 3具体主题具体主题 SeekJobCenter.java_2 SeekJobCenter.java_2 public void notifyObservers()if(changed)for(int i=0;ipersonList.size();i+)Observer observer=personList.get(i);observer.hearTelephone(mess);changed=false;public void giveNewMess(String str)if(str.equals(mess)changed=false;else mess=str;changed=true;Java设计模式 Java设计模式8/9/202332326/15/202433模式的结构的描述与使用模式的结构的描述与使用 4 4具体观察者具体观察者_1 _1 UniversityStudent.javaUniversityStudent.javaimport java.io.*;import java.io.*;public class UniverStudent implements Observerpublic class UniverStudent implements Observer Subject subject;Subject subject;File myFile;File myFile;UniverStudent(Subject subject,String fileName)UniverStudent(Subject subject,String fileName)this.subject=subject;this.subject=subject;subject.addObserver(this);/subject.addObserver(this);/使当前实例成为使当前实例成为subjectsubject所引用的具体主题的观察者所引用的具体主题的观察者 myFile=new File(fileName);myFile=new File(fileName);public void hearTelephone(String heardMess)public void hearTelephone(String heardMess)try RandomAccessFile out=new RandomAccessFile(myFile,rw);try RandomAccessFile out=new RandomAccessFile(myFile,rw);out.seek(out.length();out.seek(out.length();byte b=heardMess.getBytes();byte b=heardMess.getBytes();out.write(b);/out.write(b);/更新文件中的内容更新文件中的内容 System.out.print(System.out.print(我是一个大学生我是一个大学生,);,);System.out.println(System.out.println(我向文件我向文件+myFile.getName()+myFile.getName()+写入如下内容写入如下内容:);:);System.out.println(heardMess);System.out.println(heardMess);catch(IOException exp)catch(IOException exp)System.out.println(exp.toString();System.out.println(exp.toString();Java设计模式 Java设计模式8/9/202333336/15/202434模式的结构的描述与使用模式的结构的描述与使用 4 4具体观察者具体观察者_2 _2 HaiGui.javaHaiGui.java import java.io.*;import java.io.*;import java.util.regex.*;import java.util.regex.*;public class HaiGui implements Observerpublic class HaiGui implements Observer Subject subject;Subject subject;File myFile;File myFile;HaiGui(Subject subject,String fileName)HaiGui(Subject subject,String fileName)this.subject=subject;this.subject=subject;subject.addObserver(this);/subject.addObserver(this);/使当前实例成为使当前实例成为subjectsubject所引用的具体主题的观察者所引用的具体主题的观察者 myFile=new File(fileName);myFile=new File(fileName);public void hearTelephone(String heardMess)public void hearTelephone(String heardMess)try boolean boo=heardMess.contains(java try boolean boo=heardMess.contains(java程序员程序员)|heardMess.contains()|heardMess.contains(软件软件););if(boo)if(boo)RandomAccessFile out=new RandomAccessFile(myFile,rw);RandomAccessFile out=new RandomAccessFile(myFile,rw);out.seek(out.length();out.seek(out.length();byte b=heardMess.getBytes();byte b=heardMess.getBytes();out.write(b);out.write(b);System.out.print(System.out.print(我是一个海归我是一个海归,);,);System.out.println(System.out.println(我向文件我向文件+myFile.getName()+myFile.getName()+写入如下内容写入如下内容:);:);System.out.println(heardMess);System.out.println(heardMess);else else System.out.println(System.out.println(我是海归我是海归,这次的信息中没有我需要的信息这次的信息中没有我需要的信息););catch(IOException exp)catch(IOException exp)System.out.println(exp.toString();System.out.println(exp.toString();Java设计模式 Java设计模式8/9/202334346/15/202435模式的结构的描述与使用模式的结构的描述与使用 5 5应用应用 Application.javaApplication.javapublic class Applicationpublic class Application public static void main(String args)public static void main(String args)SeekJobCenter center=new SeekJobCenter();SeekJobCenter center=new SeekJobCenter();UniverStudent zhangLin=new UniverStudent(center,A.txt);UniverStudent zhangLin=new UniverStudent(center,A.txt);HaiGui wangHao=new HaiGui(center,B.txt);HaiGui wangHao=new HaiGui(center,B.txt);center.giveNewMess(center.giveNewMess(腾辉公司需要腾辉公司需要1010个个javajava程序员。程序员。););center.notifyObservers();center.notifyObservers();center.giveNewMess(center.giveNewMess(海景公司需要海景公司需要8 8个动画设计师。个动画设计师。););center.notifyObservers();center.notifyObservers();center.giveNewMess(center.giveNewMess(仁海公司需要仁海公司需要9 9个电工。个电工。););center.notifyObservers();center.notifyObservers();center.giveNewMess(center.giveNewMess(仁海公司需要仁海公司需要9 9个电工。个电工。););center.notifyObservers();center.notifyObservers();Java设计模式 Java设计模式8/9/20233535三、三、观察者模式的优点观察者模式的优点 6/15/202436具体主题和具体观察者是松耦合关系。由于主题(Subject)接口仅仅依赖于观察者(Observer)接口,因此具体主题只是知道它的观察者是实现观察者(Observer)接口的某个类的实例,但不需要知道具体是哪个类。同样,由于观察者仅仅依赖于主题(Subject)接口,因此具体观察者只是知道它依赖的主题是实现主题(subject)接口的某个类的实例,但不需要知道具体是哪个类。观察模式满足“开-闭原则”。主题(Subject)接口仅仅依赖于观察者(Observer)接口,这样,我们就可以让创建具体主题的类也仅仅是依赖于观察者(Observer)接口,因此如果增加新的实现观察者(Observer)接口的类,不必修改创建具体主题的类的代码。同样,创建具体观察者的类仅仅依赖于主题(Observer)接口,如果增加新的实现主题(Subject)接口的类,也不必修改创建具体观察者类的代码。三、观察者模式的优点 Java设计模式 Java设计36四、应用举例指挥部希望按时得到水文站测量到的关于水流的信息,比如流量、流速等。四、应用举例指挥部希望按时得到水文站测量到的关于水流的信息,37第六章第六章 装饰模式装饰模式 6/15/202438装饰模式(别名:包装器)装饰模式(别名:包装器)动动态态地地给给对对象象添添加加一一些些额额外外的的职职责责。就就功功能能来来说说装装饰饰模式相比生成子类更为灵活。模式相比生成子类更为灵活。Decorator Pattern(Another Name:Wrapper)Attach additional responsibilities to an object dynamically.Decorators provide a flexible alternative to subclassing for extending functionality.第六章 装饰模式 Java设计模式 Java设计模式38一一、概述概述 6/15/202439 装饰模式是动态地扩展一个对象的功能,而不装饰模式是动态地扩展一个对象的功能,而不需要改变原始类代码的一种成熟模式。在装饰模需要改变原始类代码的一种成熟模式。在装饰模式中,式中,“具体组件具体组件”类和类和“具体装饰具体装饰”类是该模类是该模式中的最重要的两个角色。式中的最重要的两个角色。一、概述 Java设计模式 Java设计模式8/939实例实例 6/15/202440假设系统中有一个Bird抽象类以及Bird类的一个子类:Sparrow。Sparrow类实现了Bird类的fly方法,使得Sparrow类创建的对象调用fly方法能连续飞行100米。现在用户需要两种鸟,必须分别能连续飞行150米和200米。实例 Java设计模式 Java设计模式8/9/20240二、二、装饰模式模式的结构与使用装饰模式模式的结构与使用 6/15/202441装饰模式的结构中包括四种角色:装饰模式的结构中包括四种角色:抽象组件(抽象组件(ComponentComponent)具体组件(具体组件(ConcreteComponentConcreteComponent)装饰(装饰(DecoratorDecorator)具体装饰(具体装饰(ConcreteDecotatorConcreteDecotator)二、装饰模式模式的结构与使用 Java设计模式 Ja416/15/202442装饰模式的装饰模式的UMLUML类图类图 Java设计模式 Java设计模式8/9/202342426/15/202443装饰模式的结构的描述与使用装饰模式的结构的描述与使用 1 1抽象组件抽象组件:Bird.java Bird.java public abstract class Birdpublic abstract class Bird public abstract int fly();public abstract int fly();Java设计模式 Java设计模式8/9/202343436/15/202444装饰模式的结构的描述与使用装饰模式的结构的描述与使用 2 2具体组件具体组件:Sparrow.java Sparrow.java public class Sparrow extends Birdpublic class Sparrow extends Bird public final int DISTANCE=100;public final int DISTANCE=100;public int fly()public int fly()return DISTANCE;return DISTANCE;Java设计模式 Java设计模式8/9/202344446/15/202445装饰模式的结构的描述与使用装饰模式的结构的描述与使用 3 3装饰装饰 (DecoratorDecorator):Decorator.java Decorator.java public abstract class Decorator extends Birdpublic abstract class Decorator extends Bird protected Bird bird;protected Bird bird;public Decorator()public Decorator()public Decorator(Bird bird)public Decorator(Bird bird)this.bird=bird;this.bird=bird;Java设计模式 Java设计模式8/9/202345456/15/202446装饰模式的结构的描述与使用装饰模式的结构的描述与使用 4 4具体装饰(具体装饰(ConcreteDecotatorConcreteDecotator):SparrowDecorator.java SparrowDecorator.java public class SparrowDecorator extends Decoratorpublic class SparrowDecorator extends Decorator public final int DISTANCE=50;/eleFly public final int DISTANCE=50;/eleFly方法能飞方法能飞5050米米 SparrowDecorator(Bird bird)SparrowDecorator(Bird bird)super(bird);super(bird);public int fly()public int fly()int distance=0;int distance=0;distance=bird.fly()+eleFly();distance=bird.fly()+eleFly();return distance;return distance;private int eleFly()/private int eleFly()/装饰者新添加的方法装饰者新添加的方法 return DISTANCE;return DISTANCE;Java设计模式 Java设计模式8/9/202346466/15/202447装饰模式的结构的描述与使用装饰模式的结构的描述与使用 5 5应用应用 Application.javaApplication.java public class Applicationpublic class Application public void needBird(Bird bird)public void needBird(Bird bird)int flyDistance=bird.fly();int flyDistance=bird.fly();System.out.println(System.out.println(这只鸟能飞行这只鸟能飞行+flyDistance+flyDistance+米米););public static void main(String args)public static void main(String args)Application client=new Application();Application client=new Application();Bird sparrow=new Sparrow();Bird sparrow=new Sparrow();Bird sparrowDecorator1=Bird sparrowDecorator1=new SparrowDecorator(sparrow);new SparrowDecorator(sparrow);Bird sparrowDecorator2=Bird sparrowDecorator2=new SparrowDecorator(sparrowDecorator1);new SparrowDecorator(sparrowDecorator1);client.needBird(sparrowDecorator1);client.needBird(sparrowDecorator1);client.needBird(sparrowDecorator2);client.needBird(sparrowDecorator2);Java设计模式 Java设计模式8/9/20234747三、三、装饰模式的优点装饰模式的优点 6/15/202448 被装饰者和装饰者是松耦合关系。由于装饰被装饰者和装饰者是松耦合关系。由于装饰(DecoratorDecorator)仅仅依赖于抽象组件()仅仅依赖于抽象组件(ComponentComponent),因此具),因此具体装饰只知道它要装饰的对象是抽象组件的某一个子类的实体装饰只知道它要装饰的对象是抽象组件的某一个子类的实例,但不需要知道是哪一个具体子类。例,但不需要知道是哪一个具体子类。装饰模式满足装饰模式满足“开开-闭原则闭原则”。不必修改具体组件,就可。不必修改具体组件,就可以增加新的针对该具体组件的具体装饰。以增加新的针对该具体组件的具体装饰。可以使用多个具体装饰来装饰具体组件的实例。可以使用多个具体装饰来装饰具体组件的实例。三、装饰模式的优点 Java设计模式 Java设计模48四、应用举例当前系统已有一个抽象类ReadWord,该类有一个抽象方法readWord(),另外还有一个ReadWord类的子类ReadEnglishWord,该类的readWord()方法可以读取一个由英文单词构成的文本文件word.txt。系统已有类的类图如图6.11所示。目前已有一些客户在使用该系统,并使用ReadWord类的对象调用readWord()方法读取文件中的单词。ReadWord+readWord(File)ReadEnglishWord+readWord(File)四、应用举例当前系统已有一个抽象类ReadWord,该类有一49四、应用举例现有部分用户希望使用ReadWord类的对象调用readWord()方法读取文件word.txt中的单词,并希望同时也能得到该单词 的汉语解释,也有一些用户希望不仅能得到该单词汉语解释也能得到该单词的英文例句。要求不允许修改现有系统的代码以及word.txt文件,对系统进行扩展以满足用户需求。四、应用举例现有部分用户希望使用ReadWord类的对象调用50第七章第七章 策略模式策略模式 6/15/202451策略模式(别名:政策)策略模式(别名:政策)定定义义一一系系列列算算法法,把把它它们们一一个个个个封封装装起起来来,并并且且使使它它们们可可相相互互替替换换。本本模模式式使使得得算算法法可可独独立立于于使使用用它它的的客客户户而而变变化。化。Strategy Pattern(Another Name:Policy)Define a family of algorithms,encapsulate each one,and make them inter changeable.Strategy lets the algorithm vary independently from clients that use it.第七章 策略模式 Java设计模式 Java设计模式51一一、概述概述 6/15/202452 策略模式是处理算法的不同变体的一种成熟模策略模式是处理算法的不同变体的一种成熟模式,策略模式通过接口或抽象类封装算法的标识,式,策略模式通过接口或抽象类封装算法的标识,即在接口中定义一个抽象方法,实现该接口的类即在接口中定义一个抽象方法,实现该接口的类将实现接口中的抽象方法。将实现接口中的抽象方法。在策略模式中,封装算法标识的接口称作策略,在策略模式中,封装算法标识的接口称作策略,实现该接口的类称作具体策略。实现该接口的类称作具体策略。一、概述 Java设计模式 Java设计模式8/952实例实例 6/15/202453 策略模式是处理算法的不同变体的一种成熟模策略模式是处理算法的不同变体的一种成熟模式,策略模式通过接口或抽象类封装算法的标识,式,策略模式通过接口或抽象类封装算法的标识,即在接口中定义一个抽象方法,实现该接口的类即在接口中定义一个抽象方法,实现该接口的类将实现接口中的抽象方法。将实现接口中的抽象方法。在策略模式中,封装算法标识的接口称作策略,在策略模式中,封装算法标识的接口称作策略,实现该接口的类称作具体策略。实现该接口的类称作具体策略。实例 Java设计模式 Java设计模式8/9/20253二、二、策略模式的结构与使用策略模式的结构与使用 6/15/202454策略模式的结构中包括三种角色:策略模式的结构中包括三种角色:策略(策略(StrategyStrategy)具体策略(具体策略(ConcreteStrategyConcreteStrategy)上下文(上下文(ContextContext)二、策略模式的结构与使用 Java设计模式 Java546/15/202455策略模式的策略模式的UMLUML类图类图 Java设计模式 Java设计模式8/9/202355556/15/202456策略模式的结构的描述与使用策略模式的结构的描述与使用 1 1策略(策略(StrategyStrategy):Computable.java Computable.java public interface ComputableStrategypublic interface ComputableStrategy public abstract double computeScore(double a);public abstract double computeScore(double a);Java设计模式 Java设计模式8/9/202356566/15/202457策略模式的结构的描述与使用策略模式的结构的描述与使用 2 2具体策略(具体策略(ConcreteStrategyConcreteStrategy):StrategyOne.java StrategyOne.java public class StrategyOne implements ComputableStrategypublic class StrategyOne implements ComputableStrategy public double computeScore(double a)public double computeScore(double a)double score=0,sum=0;double score=0,sum=0;for(int i=0;ia.length;i+)for(int i=0;ia.length;i+)sum=sum+ai;sum=sum+ai;score=sum/a.length;score=sum/a.length;return score;return score;Java设计模式 Java设计模式8/9/202357576/15/202458策略模式的结构的描述与使用策略模式的结构的描述与使用 2 2具体策略(具体策略(ConcreteStrategyConcreteStrategy):StrategyTwo.java StrategyTwo.java public class StrategyTwo implements ComputableStrategypublic class StrategyTwo implements ComputableStrategy public double computeScore(double a)public double computeScore(double a)double score=0,multi=1;double score=0,multi=1;int n=a.length;int n=a.length;for(int i=0;ia.length;i+)for(int i=0;ia.length;i+)multi=multi*ai;multi=multi*ai;score=Math.pow(multi,1.0/n);score=Math.pow(multi,1.0/n);return score;return score;Java设计模式 Java设计模式8/9/202358586/15/202459策略模式的结构的描述与使用策略模式的结构的描述与使用 2 2具体策略(具体策略(ConcreteStrategyConcreteStrategy):StrategyThree.java StrategyThree.java import java.util.Arrays;import java.util.Arrays;public class StrategyThree implements ComputableStrategypublic class StrategyThree implements ComputableStrategy public double computeScore(double a)public double computeScore(double a)if(a.length=2)if(a.length=2)return 0;return 0;double score=0,sum=0;double score=0,sum=0;Arrays.sort(a);Arrays.sort(a);for(int i=1;ia.length-1;i+)for(int i=1;ia.length-1;i+)sum=sum+ai;sum=sum+ai;score=sum/(a.
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学培训


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!