java设计模式课件耿祥义.ppt

上传人(卖家):三亚风情 文档编号:2635848 上传时间:2022-05-13 格式:PPT 页数:309 大小:1.64MB
下载 相关 举报
java设计模式课件耿祥义.ppt_第1页
第1页 / 共309页
java设计模式课件耿祥义.ppt_第2页
第2页 / 共309页
java设计模式课件耿祥义.ppt_第3页
第3页 / 共309页
java设计模式课件耿祥义.ppt_第4页
第4页 / 共309页
java设计模式课件耿祥义.ppt_第5页
第5页 / 共309页
点击查看更多>>
资源描述

1、封面Java设计模式设计模式 5/12/20221第一章第一章 设计模式简介设计模式简介 1.1 什么是设计模式什么是设计模式 5/12/20222 每一个设计模式描述一个在我们周围每一个设计模式描述一个在我们周围不断重复发生的问题,以及该问题的解不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次一次决方案的核心。这样,你就能一次一次地使用该方案而不必做重复劳动。地使用该方案而不必做重复劳动。1.2 设计模式的起源设计模式的起源 5/12/20223 软件领域的设计模式软件领域的设计模式起源于建筑学起源于建筑学。 19771977年,建筑大师年,建筑大师AlexanderAlex

2、ander出版了出版了A Pattern A Pattern LanguageLanguage:Towns, Building, ConstructionTowns, Building, Construction一一书。受书。受AlexanderAlexander著作的影响著作的影响 ,Kent BeckKent Beck和和Ward Ward CunninghamCunningham在在19871987年举行的一次面向对象的会议上年举行的一次面向对象的会议上发表了论文:发表了论文:在面向对象编程中使用模式在面向对象编程中使用模式。 1.3 GOF之著作之著作 5/12/20224 目前,被公

3、认在设计模式领域最具影响力的著作是目前,被公认在设计模式领域最具影响力的著作是Erich Gamma、Richard Helm、Ralph Johnson和和John Vlissides在在19941994年合作出版的著作:年合作出版的著作:Design PatternsDesign Patterns:Elements Elements of Reusable Object-Oriented Softwareof Reusable Object-Oriented Software(中译本(中译本设设计模式:可复用的面向对象软件的基本原理计模式:可复用的面向对象软件的基本原理 或或设计模设计模式

4、式),该书被广大喜爱者昵称为),该书被广大喜爱者昵称为GOFGOF(Gang of FourGang of Four)之)之书,被认为是学习设计模式的必读著作,书,被认为是学习设计模式的必读著作,GOFGOF之书已经被公之书已经被公认为是设计模式领域的奠基之作。认为是设计模式领域的奠基之作。1.4 学习设计模式的重要性学习设计模式的重要性 5/12/20225 学习设计模式不仅可以使我们使用好这些学习设计模式不仅可以使我们使用好这些成功的模式,更重要的是可以使我们更加深成功的模式,更重要的是可以使我们更加深刻地理解面向对象的设计思想,非常有利于刻地理解面向对象的设计思想,非常有利于我们更好地使

5、用面向对象语言解决设计中的我们更好地使用面向对象语言解决设计中的问题。问题。 1.5 合理使用模式合理使用模式 5/12/20226 1 1正确使用正确使用 2避免教条避免教条 3模式挖掘模式挖掘第二章第二章 面向对象的几个基本原则面向对象的几个基本原则 2.1 面向抽象原则面向抽象原则 5/12/20227 设计一个类时,不让该类面向具体的设计一个类时,不让该类面向具体的类,而是面向抽象类或接口类,而是面向抽象类或接口 。第二章第二章 面向对象的几个基本原则面向对象的几个基本原则 5/12/20228public class Circledouble r;Circle(double r)th

6、is.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;第二章第二章 面向对象的几个基本原则面向对象的几个基本原则 5/12/20229public abstract class Geometry public abstract double getArea();public class PillarGeometry b

7、ottom; double height;Pillar(Circle bottom,double height)this.bottom=bottom;this.height=height;2.2 开开- -闭原则闭原则 5/12/202210 设计应当对扩展开放,对修改关闭。设计应当对扩展开放,对修改关闭。 如果您的设计遵守了如果您的设计遵守了“开开- -闭原则闭原则”,那,那么这个设计一定是易维护的,因为在设计中么这个设计一定是易维护的,因为在设计中增加新的模块时,不必去修改设计中的核心增加新的模块时,不必去修改设计中的核心模块。模块。 2.3 高内聚高内聚- -低耦合原则低耦合原则 5/1

8、2/202211 如果类中的方法是一组相关的行为,则如果类中的方法是一组相关的行为,则称该类是称该类是高内聚高内聚的,反之称为低内聚的。的,反之称为低内聚的。 所谓所谓低耦合低耦合就是尽量不要让一个类含有就是尽量不要让一个类含有太多的其它类的实例的引用,以避免修改太多的其它类的实例的引用,以避免修改系统的其中一部分会影响到其它部分。系统的其中一部分会影响到其它部分。 第四章第四章 命令模式命令模式 5/12/202212命令模式(别名:动作,事务)命令模式(别名:动作,事务) 将一个请求封装为一个对象,从而使你可用不同的请将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求

9、排队或记录请求日志,以求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。及支持可撤消的操作。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.一一 、 概述概述 5/12/202213 在许多设计中,经常涉及到一个对

10、象请求另一个对在许多设计中,经常涉及到一个对象请求另一个对象调用其方法到达某种目的。如果请求者不希望或无象调用其方法到达某种目的。如果请求者不希望或无法直接和被请求者打交道,即不希望或无法含有被请法直接和被请求者打交道,即不希望或无法含有被请求者的引用,那么就可以使用命令模式。求者的引用,那么就可以使用命令模式。 实例在军队作战中,指挥官请求三连偷袭敌人,但是指挥官不希望或无法直接与三连取得联系,那么可以将该请求:“三连偷袭敌人”形成一个“作战命令”。只要能让该作战命令被执行,就会实现三连偷袭敌人的目的。二、二、命令模式的结构与使用命令模式的结构与使用 5/12/202215模式的结构中包括四

11、种角色:模式的结构中包括四种角色: 接收者(接收者(ReceiverReceiver) 命令命令(Command)(Command)接口接口 具体命令(具体命令(ConcreteCommandConcreteCommand) 请求者(请求者(InvokerInvoker)5/12/202216模式的模式的UMLUML类图类图 5/12/202217模式的结构的描述与使用模式的结构的描述与使用 1 1接收者(接收者(ReceiverReceiver) : : CompanyArmy.javaCompanyArmy.javapublic class CompanyArmypublic class

12、CompanyArmy public void sneakAttack() public void sneakAttack() System.out.println( System.out.println(我们知道如何偷袭敌人我们知道如何偷袭敌人, ,保证完成任务保证完成任务); ); 5/12/202218模式的结构的描述与使用模式的结构的描述与使用 2 2命令(命令(CommandCommand)接口)接口 : : Command.javaCommand.javapublic interface Command public interface Command public abstrac

13、t void execute(); public abstract void execute(); 5/12/202219模式的结构的描述与使用模式的结构的描述与使用 3 3具体命令(具体命令(ConcreteCommandConcreteCommand) ConcreteCommand.java ConcreteCommand.java public class ConcreteCommand implements Commandpublic class ConcreteCommand implements Command CompanyArmy army; CompanyArmy army

14、; /含有接收者的引用含有接收者的引用 ConcreteCommand(CompanyArmy army)ConcreteCommand(CompanyArmy army) this.army=army; this.army=army; public void execute() public void execute() /封装着指挥官的请求封装着指挥官的请求 army.sneakAttack(); army.sneakAttack(); /偷袭敌人偷袭敌人 5/12/202220模式的结构的描述与使用模式的结构的描述与使用 4 4请求者(请求者(InvokerInvoker) ArmySu

15、perior.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 startExe

16、cuteCommand() /让具体命令执行让具体命令执行execute()execute()方法方法 command.execute();command.execute(); 5/12/202221模式的结构的描述与使用模式的结构的描述与使用 5 5应用应用 Application.javaApplication.java public class Application public class Application public static void main(String args) public static void main(String args) CompanyArmy

17、CompanyArmy 三连三连=new CompanyArmy(); =new CompanyArmy(); Command command=new ConcreteCommand( Command command=new ConcreteCommand(三连三连);); ArmySuperior ArmySuperior 指挥官指挥官=new ArmySuperior(); =new ArmySuperior(); 指挥官指挥官.setCommand(command); .setCommand(command); 指挥官指挥官.startExecuteCommand();.startExe

18、cuteCommand(); 三、三、命令模式的优点命令模式的优点 5/12/202222 在命令模式中,请求者(Invoker)不直接与接收者(Receiver)交互,即请求者(Invoker)不包含接收者(Receiver)的引用,因此彻底消除了彼此之间的耦合。 命令模式满足“开-闭原则”。如果增加新的具体命令和该命令的接受者,不必修改调用者的代码,调用者就可以使用新的命令对象;反之,如果增加新的调用者,不必修改现有的具体命令和接受者,新增加的调用者就可以使用已有的具体命令。四、应用举例 模拟带控制开关的小电器。该电器上有四个开关,两个一组,其中一组负责打开、关闭小电器上的照明灯,另一组负

19、责打开、关闭小电器上的摄像头。第五章第五章 观察者模式观察者模式 5/12/202224观察者模式(别名:依赖,发布观察者模式(别名:依赖,发布-订阅)订阅) 定义对象间的一种一对多的依赖关系,当一个对象的定义对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都得到通知并被状态发生变化时,所有依赖于它的对象都得到通知并被自动更新。自动更新。Observer Pattern(Another Name: Dependents, Publish-Subscribe) Define a one-to-many dependency between objects so tha

20、t when one object changes state, all its dependents are notified and updated automatically. 一一 、 概述概述 5/12/202225 在许多设计中,经常涉及到多个对象在许多设计中,经常涉及到多个对象都对一个特殊对象中的数据变化感兴趣,都对一个特殊对象中的数据变化感兴趣,而且这多个对象都希望跟踪那个特殊对而且这多个对象都希望跟踪那个特殊对象中的数据变化。象中的数据变化。 实例 某些寻找工作的人对“求职中心”的职业需求信息的变化非常关心,很想跟踪“求职中心”中职业需求信息的变化。“求职者”可以让“求职中心

21、”把自己登记下来,这样求职中心就会及时通知她最新的职业信息需求。二、二、 模式的结构与使用模式的结构与使用 5/12/202227观察者模式的结构中包括四种角色:观察者模式的结构中包括四种角色: 主题(主题(SubjectSubject) 观察者(观察者(ObserverObserver) 具体主题(具体主题(ConcreteSubjectConcreteSubject) 具体观察者(具体观察者(ConcreteObserverConcreteObserver) 5/12/202228模式的模式的UMLUML类图类图 5/12/202229模式的结构的描述与使用模式的结构的描述与使用 1 1主

22、题主题 : : 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();

23、5/12/202230模式的结构的描述与使用模式的结构的描述与使用 2 2观察者观察者 : : Obsever.java Obsever.java public interface Observerpublic interface Observer public void hearTelephone(String heardMess); public void hearTelephone(String heardMess); 5/12/202231模式的结构的描述与使用模式的结构的描述与使用 3 3具体主题具体主题 SeekJobCenter.java_1 SeekJobCenter.java

24、_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 deleteObse

25、rver(Observer o) if(personList.contains(o) personList.remove(o); 5/12/202232模式的结构的描述与使用模式的结构的描述与使用 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); chan

26、ged=false; public void giveNewMess(String str) if(str.equals(mess) changed=false; else mess=str; changed=true; 5/12/202233模式的结构的描述与使用模式的结构的描述与使用 4 4具体观察者具体观察者_1 _1 UniversityStudent.javaUniversityStudent.javaimport java.io.import java.io.* *; ;public class UniverStudent implements Observerpublic cla

27、ss 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); /使当前实例成为使

28、当前实例成为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)

29、; 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()+写入如下内容写入

30、如下内容:);:); System.out.println(heardMess); System.out.println(heardMess); catch(IOException exp) catch(IOException exp) System.out.println(exp.toString(); System.out.println(exp.toString(); 5/12/202234模式的结构的描述与使用模式的结构的描述与使用 4 4具体观察者具体观察者_2 _2 HaiGui.javaHaiGui.java import java.io.import java.io.* *;

31、;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.s

32、ubject=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.contain

33、s(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()

34、; 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.pr

35、intln( System.out.println(我是海归我是海归, ,这次的信息中没有我需要的信息这次的信息中没有我需要的信息);); catch(IOException exp) catch(IOException exp) System.out.println(exp.toString(); System.out.println(exp.toString(); 5/12/202235模式的结构的描述与使用模式的结构的描述与使用 5 5应用应用 Application.javaApplication.javapublic class Applicationpublic class App

36、lication 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 Ha

37、iGui(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.no

38、tifyObservers(); center.giveNewMess( center.giveNewMess(仁海公司需要仁海公司需要9 9个电工。个电工。);); center.notifyObservers(); center.notifyObservers(); center.giveNewMess( center.giveNewMess(仁海公司需要仁海公司需要9 9个电工。个电工。); ); center.notifyObservers(); center.notifyObservers(); 三、三、观察者模式的优点观察者模式的优点 5/12/202236具体主题和具体观察者是松

39、耦合关系。由于主题(Subject)接口仅仅依赖于观察者(Observer)接口,因此具体主题只是知道它的观察者是实现观察者(Observer)接口的某个类的实例,但不需要知道具体是哪个类。同样,由于观察者仅仅依赖于主题(Subject)接口,因此具体观察者只是知道它依赖的主题是实现主题(subject)接口的某个类的实例,但不需要知道具体是哪个类。观察模式满足“开-闭原则”。主题(Subject)接口仅仅依赖于观察者(Observer)接口,这样,我们就可以让创建具体主题的类也仅仅是依赖于观察者(Observer)接口,因此如果增加新的实现观察者(Observer)接口的类,不必修改创建具体

40、主题的类的代码。同样,创建具体观察者的类仅仅依赖于主题(Observer)接口,如果增加新的实现主题(Subject)接口的类,也不必修改创建具体观察者类的代码。四、应用举例 指挥部希望按时得到水文站测量到的关于水流的信息,比如流量、流速等。第六章第六章 装饰模式装饰模式 5/12/202238装饰模式(别名:包装器)装饰模式(别名:包装器) 动态地给对象添加一些额外的职责。就功能来说装饰动态地给对象添加一些额外的职责。就功能来说装饰模式相比生成子类更为灵活。模式相比生成子类更为灵活。Decorator Pattern(Another Name: Wrapper) Attach additio

41、nal responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality.一一 、 概述概述 5/12/202239 装饰模式是动态地扩展一个对象的功能,而装饰模式是动态地扩展一个对象的功能,而不需要改变原始类代码的一种成熟模式。在装饰不需要改变原始类代码的一种成熟模式。在装饰模式中,模式中,“具体组件具体组件”类和类和“具体装饰具体装饰”类是该类是该模式中的最重要的两个角色。模式中的最重要的两个角色。 实

42、例实例 5/12/202240假设系统中有一个Bird抽象类以及Bird类的一个子类:Sparrow。Sparrow类实现了Bird类的fly方法,使得Sparrow类创建的对象调用fly方法能连续飞行100米。现在用户需要两种鸟,必须分别能连续飞行150米和200米。二、二、装饰模式模式的结构与使用装饰模式模式的结构与使用 5/12/202241装饰模式的结构中包括四种角色:装饰模式的结构中包括四种角色: 抽象组件(抽象组件(ComponentComponent) 具体组件(具体组件(ConcreteComponentConcreteComponent) 装饰(装饰(DecoratorDec

43、orator) 具体装饰(具体装饰(ConcreteDecotatorConcreteDecotator) 5/12/202242装饰模式的装饰模式的UMLUML类图类图 5/12/202243装饰模式的结构的描述与使用装饰模式的结构的描述与使用 1 1抽象组件抽象组件 : : Bird.java Bird.java public abstract class Birdpublic abstract class Bird public abstract int fly(); public abstract int fly(); 5/12/202244装饰模式的结构的描述与使用装饰模式的结构的描

44、述与使用 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; 5/12/202245装饰模式的结构的描述与使用装饰模式的结构的描述与使用 3 3装饰装饰 (Decorator

45、Decorator): : 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;

46、 5/12/202246装饰模式的结构的描述与使用装饰模式的结构的描述与使用 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; /e

47、leFly方法能飞方法能飞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 eleF

48、ly() /装饰者新添加的方法装饰者新添加的方法 return DISTANCE;return DISTANCE; 5/12/202247装饰模式的结构的描述与使用装饰模式的结构的描述与使用 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.f

49、ly(); 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();

50、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(sparrowD

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(java设计模式课件耿祥义.ppt)为本站会员(三亚风情)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|