⾯向对象设计模式核⼼要点整理
⼀、为什么要学习设计模式?
1.概念
设计模式(Design Pattern)是⼀套被反复使⽤、多数⼈知晓的、经过分类的、代码设计经验的总结。
2.⽬的
使⽤设计模式的⽬的:为了代码可重⽤性、让代码更容易被他⼈理解、保证代码可靠性。其核⼼⽬的就是为了让系统更有弹性,能够⾯对改变,如需求变更,系统升级等。
⼆、⾯向对象编程的设计原则
1.最少知识原则
1)概念:也叫迪⽶特法则。即⼀个对象应对其他对象有尽可能少的了解。2)⽬的:为了降低类与类之间的耦合度。耦合越⾼,当⼀个类发⽣改变时,对另⼀个类的影响也越⼤。3)使⽤:在⼀个类的⽅法中只引⽤类⾃⾝的成员变量或⽅法以及通过参数传递进来的参数对象。
2.开闭原则
概念:模块应对扩展开放,⽽对修改关闭。模块应尽量在不修改原有代码的情况下进⾏扩展。
3.⾥⽒代换原则
概念:使⽤⽗类型或超类型的地⽅都可以⽤其⼦类型进⾏替换。
4.依赖倒置原则
1)概念:抽象不应该依赖于细节,细节应依赖于抽象。要针对接⼝编程,⽽不是针对实现编程。2)针对具体实现类编程是静态的,在代码编译过程中就已经确定好,程序运⾏过程中⽆法修改。3)针对接⼝编程是动态的,依据⾥⽒代换原则,使⽤超类型的地⽅都可以⽤其⼦类型替换,在程序运⾏过程中可以传递超类型的不同⼦类实现,让系统更有弹性。所以在传递参数,或者使⽤组合聚合关系中,尽量引⽤层次⾼的类。
5.合成复⽤原则
1)概念:多⽤组合,少⽤继承。2)使⽤:在⼀个新的对象中使⽤⼀些已有的对象,达到复⽤已有功能的⽬的。3)通过继承来实现代码复⽤,⼀旦⽗类中的代码进⾏修改,其所有的⼦类都将受到影响。
6.接⼝隔离原则
1)概念:⼀个类对另⼀个类的依赖应建⽴在最⼩的接⼝上,不应该依赖它不需要的接⼝。2)使⽤:建⽴单⼀接⼝,不要建⽴庞⼤臃肿的接⼝,尽量细化接⼝,接⼝中的⽅法尽量少。
三、设计模式分为三种类型,共23种。
1.创建型模式5种
单例模式、抽象⼯⼚模式、建造者模式、⼯⼚模式、原型模式。
2.结构型模式7种
适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。
3.⾏为型模式11种
模版⽅法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、模式、状态模式、策略模式、职责链模式、访问者模式。
四、创建型模式:
1.Singleton(单例模式)
1)概念:保证⼀个类仅有⼀个实例,并提供⼀个访问它的全局访问点。
2)实现:实现单例模式⼀般需要私有化构建⽅法,⼀个静态变量存放单例对象和⼀个静态⽅法提供全局访问点。3)多线程情况下保证单例⽅法:1.使⽤synchronize将getInstance()变成同步⽅法。2.使⽤静态初始化器创建单例对象,也称急切的单例模式。3.使⽤双重检查加锁的⽅式。4)优点:1.减少内存开⽀。2.减少创建对象所需系统的性能开销。3.避免资源的多重占⽤。5)缺点:1.扩展困难,只能直接对代码进⾏修改。6)适⽤场景:1.要求⽣成唯⼀序列号的环境。2.整个项⽬中只需要⼀个共享访问点。3.创建⼀个对象需要消耗的资源过多。
2.Prototype(原型模式)
单例模式的几种实现方式⽤原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象。
1)实现:在Java中已有实现,通过实现Cloneable和重写clone()⽅法实现。2)浅克隆与深克隆:1.浅克隆,只负责克隆按值传递的数据(⽐如基本数据类型、String类型),⽽其他对象的引⽤都仍然指向原来的对象。2.深克隆,除了浅克隆要克隆的值外,还负责克隆引⽤类型的数据。浅克隆与深克隆建议分开实现。3)优点:1.创建新对象⽐较复杂时,可以简化对象的创建过程。2.利⽤深克隆可以保持对象的状态。4)缺点:1.每⼀个类都必须配备⼀个克隆⽅法。对于已经存在的类需要进⾏改造。2.深度克隆时可能需要⽐较复杂的代码。5)适⽤场景:1.当⼀个类的实例只能有⼏个不同状态组合中的⼀种时。2.对象创建成本较⼤时,可以利⽤拷贝来创建。
3.Builder(建造者模式)
将⼀个复杂对象的构建与它的表⽰分离,使得同样的构建过程可以创建不同的表⽰。
1)原因:复杂对象通过new直接创建,⽐较⿇烦,可读性不好,参数意思不明确,容易产⽣错误。2)表⽰:⼀个产品常有不同的组成成分作为产品的零件,它们叫做产品的内部表象,不同的产品可以有不同的内部表象。3)实现:通过建造者⾓⾊将产品的内部表象与创建分离,将产品的内部表⽰的设置和构建都放在建造者⾓⾊内,要创建复杂的产品对象,先设置产品的内部表⽰最后创建对象。4)优点:1.建造者独⽴,便于扩展。2.提⾼代码的可读性。5)缺点:1.会创建多余的Builder对象。6)适⽤场景:1.需要⽣成的产品对象有复杂的内部结构。2.需要⽣成的产品对象的属性相互依赖,建造模式可以强制实⾏⼀种分步骤进⾏的建造过程。
4.Factory Method(⼯⼚⽅法模式)
定义⼀个⽤于创建对象的接⼝,让⼦类决定将哪⼀个类实例化。Factory Method使⼀个类的实例化延迟到其⼦类。
1)实现:利⽤继承,在⽗类中定义⼀个抽象⼯⼚⽅法,在⼦类中进⾏实现,通过⼦类来创建对象。这样,客户只需要知道超类型即可,⽽由⼦类负责决定具体类型。2)优点:1.扩展性好,在增加产品类时,只需要适当修改或新增具体⼯⼚类即可。2.⾼层模块只需要知道产品的抽象类,不需要关注具体产品实现类,降低耦合度。3)缺点:1.当需要添加新的产品类时需要添加对应的具体⼯⼚类,增加代码复杂度。4)适⽤环境:1.⼯⼚⽅法模式是new⼀个对象的替代品2.需要可扩展的框架,⼀个类不知道它所需要的对象的类,⼀个类通过其⼦类来指定创建哪个对象。
5.Abstract Factory(抽象⼯⼚模式)
提供⼀个创建⼀系列相关或相互依赖对象的接⼝,⽽⽆需指定它们具体的类。
1)实现:利⽤组合,在⽗类中定义创建⼀系列相关对象的抽象⼯⼚⽅法,通过⼦类去指定具体创建的对象。2)优点:1.⼀个⼯⼚可以创建出⼀个产品族中的所有对象。2.分离接⼝和实现,客户端使⽤抽象⼯⼚来创建需要的对象,⽽不需要知道具体的实现,降低耦合度。3.使切换产品族变得容易;4.产品族内的约束为⾮公开状态。3)缺点:1.不太容易扩展新的产品;如果需要给整个产品族添加⼀个新的产品,那么就需要修改抽象⼯⼚,这样就会导致修改所有的⼯⼚实现类。4)适⽤场景:1.这个系统的产品有多于⼀个的产品族,⽽系统只消费其中某⼀族的产品。2.同属于同⼀个产品族的产品是在⼀起使⽤的,这⼀约束必须在系统的设计中体现出来。
五、结构型模式
1.Adapter(适配器模式)
将⼀个类的接⼝转换成客户希望的另外⼀个接⼝。Adapter模式使得原本由于接⼝不兼容⽽不能⼀起⼯作的那些类可以⼀起⼯作。
1)⽬的:将⼀个接⼝--被适配者转换成⽬标接⼝,使得通过⽬标接⼝便可以调⽤被适配接⼝的对象。根据实现⽅式分为类适配器和接⼝适配器,类适配器通过组合的⽅式,适配器类直接引⽤被适配对象。接⼝适配器通过继承或实现的⽅式,适配器类同时实现⽬标接⼝与被适配接⼝,可以通过重写重定义Adaptee的部分⾏为 。2)优点:1.可以让接⼝不合的系统现有类,功能得到复⽤。2.在实现适配时,可以对适配的接⼝进⾏扩展。3.可以让两个没有任何关系的类在⼀起运⾏。3)缺点:过多的使⽤适配器,会让系统⾮常零乱,不易整体进⾏把握。⽐如调⽤A接⼝,其实内部被适配成B的接⼝实现。4)适⽤场景:它不是为了解决还处在开发阶段的问题,⽽是解决正在服役的项⽬问题。5)缺省适配器:为⼀个接⼝提供缺省实现,这样⼦类型可以从这个缺省实现进⾏扩展,⽽不必从原有接中进⾏扩展。⽤意是为了⽅便建⽴⼀个不平庸的类⽽提供的⼀种平庸实现。
2.Bridge(桥接模式)
将抽象部分与它的实现部分分离,使它们都可以独⽴地变化。
3.Decorator(装饰模式)
动态地给⼀个对象添加⼀些额外的职责。就扩展功能⽽⾔, 它⽐⽣成⼦类⽅式更为灵活。
1)⽬的:为了扩展对象的功能,是继承的⼀个替代⽅案。装饰模式有透明和半透明两种:透明装饰者模式增强功能、不改变接⼝。半透明装饰者模式增强功能、改变接⼝。适配器模式:不增加功能、改变接⼝。2)优点:1.扩展对象的功能⽐继承更好的灵活性。2.通过使⽤不同的装饰类及对它们的排列组合,可以创造出许多不同⾏为的组合。3)缺点:1.造成类数量太多。2.增加代码复杂度。3.调。4)适⽤场景:1.需要扩展⼀个类的功能, 或给⼀个类增加附加功能。
4.Composite(组合模式)
将对象组合成树形结构以表⽰“部分-整体”的层次结构。它使得客户对单个对象和复合对象的使⽤具有⼀致性。
5.Facade(外观模式)
为⼦系统中的⼀组接⼝提供⼀个⼀致的界⾯, Facade模式定义了⼀个⾼层接⼝,这个接⼝使得这⼀⼦系统更加容易使⽤。
1)⽬的:其⽬的简化接⼝。能够有选择性地暴露⽅法。,保护⼦系统中的接⼝。2)优点:1.减少系统的相互依赖。2.提⾼了灵活性;只要⼦系统的变化不影响到门⾯对象,外界便不需要发⽣变化。3.提⾼安全性;外界只能访问门⾯上开通的⽅法。4.简化接⼝,易于使⽤。5.更好的划分访问层次;通过合理使⽤Facade,有些⽅法是对系统外的,有些⽅法是系统内部使⽤的。3)缺点:1.不符合开闭原则,可能需要修改外观⾓⾊代码。2.外观类⾼耦合,⼀旦有变更,只能对外观类进⾏修改。修改外观类需要⾮常谨慎。4)适⽤场景:1.简化并统⼀⼀个很⼤的接⼝或者⼀复杂的接⼝时。2.⼦系统相对独⽴,外界对⼦系统只要⿊箱操作即可。
6.Flyweight(享元模式)
运⽤共享技术有效地⽀持⼤量细粒度的对象。
7.Proxy(代理模式)
为其他对象提供⼀个代理以控制对这个对象的访问。
1)动态代理之所以被称为动态,是因为运⾏时才将它的类创建出来。代码开始执⾏时,还没有proxy类,它是根据需要从你传⼊的接⼝集创建的。2)代理种类:代理模式为另⼀个对象提供代表,以便控制客户对对象的访问,管理访问的⽅式有许多种。1.远程代理管理客户和远程对象之间的交互。2.虚拟代理控制访问实例化开销⼤的对象。3.保护代理基于调⽤者控制对象⽅法的访问。3)缺点:代理会造成你的设计中类的数⽬增加。4)⽐较:代理在结构上类似装饰者,但是⽬的不同。装饰者模式为对象加上⾏为,⽽代理则是控制访问。
六、⾏为型模式
1.Template Method(模板⽅法模式)
定义⼀个操作中的算法的⾻架,⽽将⼀些步骤延迟到⼦类中。Template Method使得⼦类可以不改变⼀个算法的结构即可重定义该算法的某些特定步骤。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。