23种设计模式

上传人:新** 文档编号:466198807 上传时间:2023-03-16 格式:DOCX 页数:17 大小:614.21KB
返回 下载 相关 举报
23种设计模式_第1页
第1页 / 共17页
23种设计模式_第2页
第2页 / 共17页
23种设计模式_第3页
第3页 / 共17页
23种设计模式_第4页
第4页 / 共17页
23种设计模式_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《23种设计模式》由会员分享,可在线阅读,更多相关《23种设计模式(17页珍藏版)》请在金锄头文库上搜索。

1、23 种设计模式(Design Patterns )设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类 编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易 被他人理解、保证代码可靠性。项目中合理的运用设计模式可以完美的解决很多 问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在 我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛 应用的原因。一、总体来说设计模式分为三大类:创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模 式、原型模式。结构型模式,共七种:适配器模式、装饰器模式、代理模式

2、、外观模式、桥 接模式、组合模式、享元模式。行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模 式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、 解释器模式。还用两类模式:并发型模式和线程池模式。二、设计模式六大原则:总原则:开闭原则开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候, 不能去修改原有的代码,而是要扩展原有代码,实现一个热插拔的效果。所以一 句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果, 我们需要使用接口和抽象类等。1、单一职责原则不要存在多于一个导致类变更的原因,也就是说每个类应该实现单一的职 责,

3、如若不然,就应该把类拆分。2、里氏替换原则(Liskov Substitution Principle)里氏代换原则(Liskov Substitution Principle LSP)是面向对象设计的基 本原则之一。里氏代换原则中说,任何基类可以出现的地方,子类一定可以出 现。LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能 不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的 行为。里氏代换原则是对“开-闭”原则的补充。实现“开闭”原则的关键步骤 就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原 则是对实现抽象化的具体步骤的规范。3

4、、依赖倒置原则(Dependence Inversion Principle)开闭原则的基础,面向接口编程,依赖于抽象而不依赖于具体。写代码时用 到具体类时,不与具体类交互,而与具体类的上层接口交互。4、接口隔离原则(Interface Segregation Principle)每个接口中不存在子类用不到却必须实现的方法,如果不然,就要将接口拆 分。使用多个隔离的接口,比使用单个接口(多个接口方法集合到一个的接口) 要好。5、迪米特法则(Demeter Principle)一个类对自己依赖的类知道的越少越好。也就是说无论被依赖的类多么复 杂,都应该将逻辑封装在方法的内部,通过public方法

5、提供给外部。这样当被 依赖的类变化时,才能最小的影响该类。类之间只要有耦合关系。6、合成复用原则(Composite Reuse Principle)尽量首先使用合成/聚合的方式,而不是使用继承。三、23种设计模式1、工厂方法模式(Fac tory Met hod)创建一个工厂接口和创建多个工厂实现类,这样一旦需要增加新的功能,直 接增加新的工厂类就可以了,不需要修改之前的代码。2、抽象工厂模式工厂方法模式和抽象工厂模式不好分清楚,他们的区别如下:工厂方法模式:一个抽象产品类,可以派生出多个具体产品类。一个抽象工厂类,可以派生出多个具体工厂类。每个具体工厂类只能创建一个具体产品类的实例。抽象工

6、厂模式:多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。一个抽象工厂类,可以派生出多个具体工厂类。每个具体工厂类可以创建多个具体产品类的实例,也就是创建的是一个产品线下 的多个产品。区别:工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可 以创建多个。抽象工厂就像工厂,而工厂方法则像是工厂的一种产品生产线。3、单例模式单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保 证在一个JVM中,该对象只有一个实例存在。这样的模式有几个好处:1、某些类创建比较频繁,对于一些大型的对象,这是一

7、笔很大的系统开销。2、省去了 new操作符,降低了系统内存的使用频率,减轻GC压力。3、有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个 的话,系统完全乱了。(比如一个军队出现了多个司令员同时指挥,肯定会乱成 一团),所以只有使用单例模式,才能保证核心交易服务器独立控制整个流程。4、建造者模式(Builder Principle)5、原型模式(Pro tot ype)原型模式虽然是创建型的模式,但是与工厂模式没有关系,从名字即可看出, 该模式的思想就是将一个对象作为原型,对其进行复制、克隆,产生一个和原对 象类似的新对象。浅复制:将一个对象复制后,基本数据类型的变量都会重新创

8、建,而引用类型, 指向的还是原对象所指向的。深复制:将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建 的。简单来说,就是深复制进行了完全彻底的复制,而浅复制不彻底。6、适配器模式适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消 除由于接口不匹配所造成的类的兼容性问题。主要分为三类:类的适配器模式、 对象的适配器模式、接口的适配器模式。(1) 类的适配器模式method 1()met.hod2()TargetableAdaptermethod1(/method2/Source methodi JAdspiterTest核心思想就是:有一个Source类,拥有一个方

9、法,待适配,目标接口是Targe table,通过 Adap ter 类,将 Source 的功能扩展到 Targe table 里,(2)对象的适配器模式基本思路和类的适配器模式相同,只是将Adapter类作修改,这次不继承 Source类,而是持有Source类的实例,以达到解决兼容性的问题。o-met h od 10meth od2)Targ etablemethodl Qmethod2()Wrapper SourceSourcemethod1(AdapterTest(3)接口的适配器模式接口的适配器是这样的:有时我们写的一个接口中有多个抽象方法,当 我们写该接口的实现类时,必须实现该接

10、口的所有方法,这明显有时比较浪 费,因为并不是所有的方法都是我们需要的,有时只需要某一些,此处为了 解决这个问题,我们引入了接口的适配器模式,借助于一个抽象类,该抽象类实现了该接口,实现了所有的方法,而我们不和原始的接口打交道,只和 该抽象类取得联系,所以我们写一个类,继承该抽象类,重写我们需要的方 法就行。三种适配器模式的应用场景:类的适配器模式:当希望将一个类转换成满足另一个新接口的类时,可以使用类 的适配器模式,创建一个新类,继承原有的类,实现新的接口即可。对象的适配器模式:当希望将一个对象转换成满足另一个新接口的对象时,可以 创建一个Wrapper类,持有原类的一个实例,在Wrappe

11、r类的方法中,调用实例 的方法就行。接口的适配器模式:当不希望实现一个接口中所有的方法时,可以创建一个抽象 类Wrapper,实现所有方法,我们写别的类的时候,继承抽象类即可。7、装饰器模式装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被 装饰对象实现同一个接口,装饰对象持有被装饰对象的实例,关系图如下:Source类是被装饰类,Decora tor类是一个装饰类,可以为Source类动态的添 加一些功能。应用场景:(1)需要扩展一个类的功能。(2)动态的为一个对象增加功能,而且还能动态撤销。(继承不能做到这一点, 继承的功能是静态的,不能动态增删。)缺点:产生过多相似的

12、对象,不易排错!8、代理模式(Proxy)代理模式就是多一个代理类出来,替原对象进行一些操作。代理模式的应用场景:如果已有的方法在使用的时候需要对原有的方法进行改进,此时有两种办法:1、修改原有的方法来适应。这样违反了 “对扩展开放,对修改关闭”的原则。2、就是采用一个代理类调用原有的方法,且对产生的结果进行控制。这种方法 就是代理模式。使用代理模式,可以将功能划分的更加清晰,有助于后期维护!9、外观模式(Facade)外观模式是为了解决类与类之家的依赖关系的,像spring 一样,可以将类和类 之间的关系配置到配置文件中,而外观模式就是将他们的关系放在一个Facade 类中,降低了类类之间的

13、耦合度,该模式中没有涉及到接口,看下类图:CPUMemorystartupf)shutdownf)罕startup()shutdownQstart shutdownComputerstart up)shutdownQUser10、桥接模式(Bridge)桥接模式就是把事物和其具体实现分开,使他们可以各自独立的变化。桥接的用 意是:将抽象化与实现化解耦,使得二者可以独立变化,像我们常用的JDBC桥 DriverManager 一样,JDBC进行连接数据库的时候,在各个数据库之间进行切换, 基本不需要动太多的代码,甚至丝毫不用动,原因就是JDBC提供统一接口,每 个数据库提供各自的实现,用一个叫做

14、数据库驱动的程序来桥接就行了。11、组合模式组合模式有时又叫部分-整体模式在处理类似树形结构的问题时比较方便,看看关系图:使用场景:将多个对象组合在一起进行操作,常用于表示树形结构中,例如二叉 树,树等。12、享元模式(Flyweigh t)享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候 可以减少内存的开销,通常与工厂模式一起使用。FlyWeightFactory丄丄FlyWeightFlyWeightFactory负责创建和管理享元单元,当一个客户端请求时,工厂需要 检查当前对象池中是否有符合条件的对象,如果有,就返回已经存在的对象,如 果没有,则创建一个新对象,FlyW

15、eight是超类。一提到共享池,我们很容易联 想到Java里面的JDBC连接池,想想每个连接的特点,我们不难总结出:适用于 作共享的一些个对象,他们有一些共有的属性,就拿数据库连接池来说,url、 driverClassName、username、password 及 dbname,这些属性对于每个连接来说 都是一样的,所以就适合用享元模式来处理,建一个工厂类,将上述类似属性作 为内部数据,其它的作为外部数据,在方法调用时,当做参数传进来,这样就节 省了空间,减少了实例的数量。例子:关系模式13、策略模式(St ra tegy)策略模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换, 且算法的变化不会影响到使用算法的客户。需要设计一个接口,为一系列实现类 提供统一的方法,多个实现类实现该接口,设计一个抽象类(可有可无,属于辅 助类),提供辅助函数,关系图如下:图中ICalculator提供同意的方法,AbstractCalculator是辅助类,提供辅助 方法。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 机械/制造/汽车 > 电气技术

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号