《Java设计模式大作业.pdf》由会员分享,可在线阅读,更多相关《Java设计模式大作业.pdf(11页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、武汉轻工大学武汉轻工大学数学与计算机学院数学与计算机学院2018-20192018-2019 学年第二学期学年第二学期JAVA 大作业指导老师:指导老师:*专专业:业:信息管理与信息系统信息管理与信息系统班班级:级:信管信管 16021602 班班学学号:号:*姓姓名:名:*20192019 年年6 6 月月5 5 日日JavaJava 设计模式学习体会设计模式学习体会1 1、策略模式:、策略模式:策略模式就是将能够通用的算法,封装成不同的组件,实现同一个接口,使之可以互换。例子:SpringMVC 的 9 大组件,都采用策略模式。比如HandlerMethodArgumentResolver
2、,有非常多不同的实现类,这些实现类都可以互相替换来处理不同类型的参数,这就是策略模式。我们知道一件事可能会有很多种方式来实现它,但是其中总有一种最高效的方式,在软件开发的世界里面同样如此,我们也有很多中方法来实现一个功能,但是我们需要一种简单、高效的方式来实现它,使得系统能够非常灵活,这就是策略模式。所以策略模式就是定义了算法族,分别封装起来,让他们之前可以互相转换,此模式然该算法的变化独立于使用算法的客户。在策略模式中它将这些解决问题的方法定义成一个算法群,每一个方法都对应着一个具体的算法,这里的一个算法我就称之为一个策略。虽然策略模式定义了算法,但是它并不提供算法的选择,即什么算法对于什么
3、问题最合适这是策略模式所不关心的,所以对于策略的选择还是要客户端来做。客户必须要清楚的知道每个算法之间的区别和在什么时候什么地方使用什么策略是最合适的,这样就增加客户端的负担。同时策略模式也非常完美的符合了“开闭原则”,用户可以在不修改原有系统的基础上选择算法或行为,也可以灵活地增加新的算法或行为。但是一个策略对应一个类将会是系统产生很多的策略类。策略模式与模板方法模式的区别:策略模式与模板方法模式的区别:比如一个抽象类有一个抽象方法,每个实现该抽象方法的具体实现都不同,就是模板方法模式,一般在抽象类中会有逻辑处理,只是用到了抽象的模板方法时,交给具体的子类去不同实现。如果一个模板方法,被子类
4、实现时,实现方式大都相同,比如模板方法为处理字符(10 个子类可能只有两种实现,一种是处理为 UTF-8,一种是处理成 GBK),那么这个模板方法就应该使用策略模式。2 2、观察者模式:、观察者模式:观察者模式就是将“观察者”注册给“被观察者”,当被观察者发生改变时,能够及时的通知所有观察者。例子:比如 listener 或者事件触发等,都是观察者模式3 3、装饰者模式:、装饰者模式:装饰者模式就是在不必改变原类文件和使用继承的情况下,动态的扩展对象的的功能。比如你有一个真实对象,有一个包装对象,两个对象都必须实现同一个接口 A;但是在进行包装的时候,包装对象需要引用真实对象,然后在真实对象的
5、基础上进行功能扩展,最后返回的都是接口 A 的对象。但是已经被包装过了,扩展了功能。我们可以通过继承和组合的方式来给一个对象添加行为,虽然使用继承能够很好拥有父类的行为,但是它存在几个缺陷:一、对象之间的关系复杂的话,系统变得复杂不利于维护。二、容易产生“类爆炸”现象。三、是静态的。在这里我们可以通过使用装饰者模式来解决这个问题。装饰者模式,动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更加有弹性的替代方案。虽然装饰者模式能够动态将责任附加到对象上,但是他会产生许多的细小对象,增加了系统的复杂度。4 4、工厂方法模式、工厂方法模式工厂方法模式就是定义一个创建对象的接口,里面有一个创
6、建对象的方法。通过继承或者实现,将对象的创建交给子类。而调用者只用使用接口就可以了,不用关心具体的对象是怎么创建出来的。作为抽象工厂模式的孪生兄弟,工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个,也就是说工厂方法模式让实例化推迟到子类。工厂方法模式非常符合“开闭原则”,当需要增加一个新的产品时,我们只需要增加一个具体的产品类和与之对应的具体工厂即可,无须修改原有系统。同时在工厂方法模式中用户只需要知道生产产品的具体工厂即可,无须关系产品的创建过程,甚至连具体的产品类名称都不需要知道。虽然他很好的符合了“开闭原则”,但是由于每新增一个新产品时就需要增加两个类,这样势必会导
7、致系统的复杂度增加。其 UML 结构图:5 5、抽象工厂模式、抽象工厂模式抽象工厂模式就是定义一个为创建一组(多个)相关或者相依赖的对象的接口,而调用者无需关心具体的创建对象的实现类。工厂方法模式与抽象工厂模式的区别:当抽象工厂模式定义的接口中只能创建一个对象,工厂方法模式与抽象工厂模式的区别:当抽象工厂模式定义的接口中只能创建一个对象,那么那么“抽象工厂模式抽象工厂模式”就退化成为了就退化成为了“工厂方法模式工厂方法模式”。所谓抽象工厂模式就是提供一个接口,用于创建相关或者依赖对象的家族,而不需要明确指定具体类。他允许客户端使用抽象的接口来创建一组相关的产品,而不需要关系实际产出的具体产品是
8、什么。这样一来,客户就可以从具体的产品中被解耦。它的优点是隔离了具体类的生成,使得客户端不需要知道什么被创建了,而缺点就在于新增新的行为会比较麻烦,因为当添加一个新的产品对象时,需要更加需要更改接口及其下所有子类。其UML 结构图如下:6 6、单例模式、单例模式简单图解7 7、命令模式、命令模式命令模式就是把请求封装成命令对象,“调用者”就是将“命令对象”传递给“处理对象”。8 8、适配器模式、适配器模式适配器模式就是将一个接口转换成为另一个接口。在我们的应用程序中我们可能需要将两个不同接口的类来进行通信,在不修改这两个的前提下我们可能会需要某个中间件来完成这个衔接的过程。这个中间件就是适配器
9、。所谓适配器模式就是将一个类的接口,转换成客户期望的另一个接口。它可以让原本两个不兼容的接口能够无缝完成对接。作为中间件的适配器将目标类和适配者解耦,增加了类的透明性和可复用性。9 9、外观模式、外观模式外观模式提供了一个统一的接口,用来访问系统中的一群接口。外观模式定义了一个高层接口,让使用变得更加容易(不用再去调用一群接口,外观接口已经将一群接口封装好了)。我们都知道类与类之间的耦合越低,那么可复用性就越好,如果两个类不必彼此通信,那么就不要让这两个类发生直接的相互关系,如果需要调用里面的方法,可以通过第三者来转发调用。外观模式非常好的诠释了这段话。外观模式提供了一个统一的接口,用来访问子
10、系统中的一群接口。它让一个应用程序中子系统间的相互依赖关系减少到了最少,它给子系统提供了一个简单、单一的屏障,客户通过这个屏障来与子系统进行通信。通过使用外观模式,使得客户对子系统的引用变得简单了,实现了客户与子系统之间的松耦合。但是它违背了“开闭原则”,因为增加新的子系统可能需要修改外观类或客户端的源代码。1010、模板方法模式、模板方法模式模仿方法模式定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤。有些时候我们做某几件事情的步骤都差不多,仅有那么一小点的不同,在软件开发的世界里同样如此,如果我们都将这些步骤都一一做的话,费时
11、费力不讨好。所以我们可以将这些步骤分解、封装起来,然后利用继承的方式来继承即可,当然不同的可以自己重写实现嘛!这就是模板方法模式提供的解决方案。所谓模板方法模式就是在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。模板方法模式就是基于继承的代码复用技术的。在模板方法模式中,我们可以将相同部分的代码放在父类中,而将不同的代码放入不同的子类中。也就是说我们需要声明一个抽象的父类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法让子类来实现剩余的逻辑,不同的子类可以以不同的方式来实现这些逻辑。所以模板
12、方法的模板其实就是一个普通的方法,只不过这个方法是将算法实现的步骤封装起来的。1111、迭代器模式、迭代器模式迭代器模式就是 Iterator 接口,使得客户可以顺序得访问对象中的各个元素,又不暴露对象内部的细节。1212、组合模式、组合模式当你将对象的组合(多个对象)组成树结构来展现,那么不管你这个对象是节点(还包含子节点),还是叶子节点(不包含子节点),都可以用一致的方式进行处理。组合模式组合多个对象形成树形结构以表示“整体-部分”的结构层次。它定义了如何将容器对象和叶子对象进行递归组合,使得客户在使用的过程中无须进行区分,可以对他们进行一致的处理。在使用组合模式中需要注意一点也是组合模式
13、最关键的地方:叶子对象和组合对象实现相同的接口。这就是组合模式能够将叶子节点和对象节点进行一致处理的原因。虽然组合模式能够清晰地定义分层次的复杂对象,也使得增加新构件也更容易,但是这样就导致了系统的设计变得更加抽象,如果系统的业务规则比较复杂的话,使用组合模式就有一定的挑战了。1313、状态模式、状态模式状态模式是指当前对象把处理自己不同状态的的行为对象,都封装成为自己的属性。当状态发生改变时,调用不同的行为对象,执行不同的操作。(看起来就好像类发生了改变一样)1414、代理模式、代理模式为另一个对象提供一个替身或占位符以访问这个对象(包装一个对象,并控制对它的访问)1515、复合模式、复合模
14、式复合模式结合两个或以上的模式,组成一个解决方案,解决一再发生的一般性问题。(MVC 模式就是典型的符合模式;其中 Model 是观察者模式,发生改变后通知 View;View 是组合模式,通过各种不同的组件嵌套组成一个完整的 View 展现用户界面;Controller 是策略模式,不同的 View 可以使用不同的 Controller 处理不同的业务)1717、建造者(生成器)模式、建造者(生成器)模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。Spring 里面的 FactoryBean 就是建造者模式1818、责任链模式、责任链模式使多个对象都有机会处理请
15、求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。(责任链就是一个链表结构,头结点处理完成以后再决定是否要交由下一个节点继续处理,直到没有下一个节点或者其中对象终止责任链)1919、蝇量模式(享元模式)、蝇量模式(享元模式)FlyweightPatternFlyweightPattern享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。在一个系统中对象会使得内存占用过多,特别是那些大量重复的对象,这就是对系统资源的极大浪费。享元模式对对象的重用提供了一种解决方案,它使用共享技术对相同或者相似对象实现重用。享元
16、模式就是运行共享技术有效地支持大量细粒度对象的复用。系统使用少量对象,而且这些都比较相似,状态变化小,可以实现对象的多次复用。这里有一点要注意:享元模式要求能够共享的对象必须是细粒度对象。享元模式通过共享技术使得系统中的对象个数大大减少了,同时享元模式使用了内部状态和外部状态,同时外部状态相对独立,不会影响到内部状态,所以享元模式能够使得享元对象在不同的环境下被共享。同时正是分为了内部状态和外部状态,享元模式会使得系统变得更加复杂,同时也会导致读取外部状态所消耗的时间过长。2121、中介者模式、中介者模式中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种
17、模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。2222、备忘录模式、备忘录模式备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。应用实例:应用实例:1、后悔药。2、打游戏时的存档。3、Windows 里的 ctri+z。4、IE 中的后退。4、数据库的事务管理。2323、原型模式、原型模式原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。应用实例:应用实例:1、细
18、胞分裂。2、JAVA 中的 Object clone()方法。3、Java 序列化与反序列化可以实现深度克隆2424、访问者模式、访问者模式访问者模式拥有访问者类,与被访问元素类。元素类通过接受访问者类对象,并且将自身的引用交给访问者,这样访问者就可以使用元素类。总结总结如何学习设计模式:在了解了设计模式的历史和分类后,应该如何学习设计模式呢?在学习设计模式之前,读者一定要树立一种意识,那就是:设计模式并不只是一种方法和技术,它更是一种思想、一个方法论。它和具体的语言没有关系,学习设计模式最主要的目的就是要建立面向对象的思想,尽可能地面向接口编程、低耦合、高内聚,使你设计的程序尽可能地复用。有
19、些软件开发人员,在程序设计时,总想着往某个设计模式上套,其实这样是不对的,并没有真正掌握设计模式的思想。其实很多时候读者用了某种设计模式,只是自己不知道这个模式叫什么名字而已。因此,在程序设计时,要根据自己的理解,使用合适的设计模式。而有另外一些软件开发人员,在程序设计时,动不动就给类起个类似模式的名字,比如叫某某Facade、某某Factory 等,其实类里面的内容和设计模式根本没有一点关系,只是用来标榜自己懂设计模式而已。因此,学习设计模式,首先要了解有哪些方面的设计模式可以供开发人员使用,然后再分别研究每个设计模式的原理,使用时机和方法,也就是说要在什么情况下才使用某个设计模式,在了解某个设计模式的使用时机时,还要了解此时如果不使用这个设计模式,会造成什么样的后果。当对每个模式的原理和使用方法都了解了以后,更重要的是,学习面向对象的思想方式,在掌握面向对象的思想方式后,再回过头来看设计模式,就会有更深刻的理解,最后,学习设计模式,一定要勤学多练。
限制150内