1.设计模式概念
设计模式(Design )是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。
2.设计模式的六大原则
单一职责原则
单一职责原则(Single Responsibility Principle,SRP):就一个类而言,应该仅有一个引起它变化的原因。即一个类应该只负责一个功能领域中的相应职责。
单一职责原则是实现高内聚、低耦合的指导方针,它是最简单但又最难运用的原则,需要设计人员发现类的不同职责并将其分离,而发现类的多重职责需要设计人员具有较强的分析设计能力和相关实践经验。
开闭原则
开闭原则(Open-Closed Principle,OCP): 是指软件实体(类、模块、函数等等)应该可以扩展,但是不可修改。即软件实体应该尽量在不修改原有代码的情况下进行扩展。
为了满足开闭原则,需要对系统进行抽象化设计,抽象化是开闭原则的关键。
里氏替换原则
里氏替换原则(Liskov Substitution Principle,LSP):所有引用父类的地方必须能够透明的使用子类的对象。即子类型必须能够替换掉它们的父类型。
里氏替换原则告诉我们,在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立,如果一个软件实体使用的是一个子类对象的话,那么它不一定能够使用基类对象。因此在程序中尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型,用子类对象来替换父类对象。同时,里氏代换原则是实现开闭原则的重要方式之一。
依赖倒置原则
依赖倒置原则(Dependency Inversion Principle,DIP):抽象不应该依赖细节,细节应该依赖于抽象。即应该针对接口编程,而不是针对实现编程。
在大多数情况下,我们会同时使用开闭原则、里氏代换原则和依赖倒转原则,开闭原则是目标,里氏代换原则是基础,依赖倒转原则是手段。
接口隔离原则
接口隔离原则(Interface Segregation Principle,ISP):使用专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。
根据接口隔离原则,当一个接口太大时,我们需要将它分割成一些更细小的接口,使用该接口的客户端仅需知道与之相关的方法即可。每一个接口应该承担一种相对独立的角色,不干不该干的事,该干的事都要干。
迪米特法则
迪米特法则(Law of Demeter,LoD):一个软件实体应当尽可能少地与其它实体发生相互作用。
迪米特法则又称为最少知识原则(LeastKnowledge Principle,LIP)。
如果一个系统符合迪米特法则,那么当其中某一个模块发生修改时,就会尽量少地影响其他模块,扩展会相对容易,这是对软件实体之间通信的限制,迪米特法则要求限制软件实体之间通信的宽度和深度。迪米特法则可降低系统的耦合度,使类与类之间保持松散的耦合关系。
合成复用原则
合成复用原则(Composite Reuse Principle):原则是尽量使用合成/聚合的方式, 而不是使用继承。
3. ****23种经典设计模式可以通过下表一目了然如下
创建模式:对类的实例化过程的抽象。一些系统在创建对象时,需要动态地决定怎样创建对象,创建哪些对象,以及如何组合和表示这些对象。创建模式描述了怎样构造和封装这些动态的决定。包含类的创建模式和对象的创建模式。
结构模式:描述如何将类或对象结合在一起形成更大的结构。分为类的结构模式和对象的结构模式。类的结构模式使用继承把类,接口等组合在一起,以形成更大的结构。类的结构模式是静态的。对象的结构模式描述怎样把各种不同类型的对象组合在一起,以实现新的功能的方法。对象的结构模式是动态的。
行为模式:对在不同的对象之间划分责任和算法的抽象化。不仅仅是关于类和对象的,并是关于他们之间的相互作用。类的行为模式使用继承关系在几个类之间分配行为。对象的行为模式则使用对象的聚合来分配行为。
来源: https://blog.csdn.net/longronglin/article/details/1454315
[图片上传失败...(image-26276a-1522381137909)]
创建型模式(5种):单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。
结构型模式(7种):代理模式、适配器模式、装饰器模式、门面模式、桥接模式、组合模式、享元模式。
行为型模式(11种):策略模式、责任链模式、模板方法模式、观察者模式、迭代子模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
[图片上传失败...(image-5f7c01-1522381137907)]
关系图:
[图片上传失败...(image-36ba29-1522381137909)]
4.总结
一、创建型模式
1、单例模式(Singleton): 确保一个类只有一个实例, 并提供全局访问点.
2、工厂方法模式(factorymethod ): 定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个. 工厂方法让类把实例化推迟到子类.
3、抽象工厂模式(Abstract factory): 提供一个接口, 用于创建相关或依赖对象的家族,而不需要指定具体类.
4、生成器模式(Builder): 使用生成器模式封装一个产品的构造过程,并允许按步骤构造. 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.
5、原型模式(prototype): 当创建给定类的实例过程很昂贵或很复杂时,就使用原形模式.
6、多例模式(Multition): 在一个解决方案中结合两个或多个模式,以解决一般或重复发生的问题.
二、结构型模式
1、代理模式(Proxy): 为另一个对象提供一个替身或占位符以控制对这个对象的访问.
2、适配器模式(Adapter ): 将一个类的接口, 转换成客户期望的另一个接口.适配器让原本接口不兼容的类可以合作无间. 对象适配器使用组合, 类适配器使用多重继承.
3、装饰者模式(decorator): 动态地将责任附加到对象上, 若要扩展功能, 装饰者提供了比继承更有弹性的替代方案.
4、外观模式(facade): 提供了一个统一的接口, 用来访问子系统中的一群接口. 外观定义了一个高层接口, 让子系统更容易使用.
5、桥接模式(Bridge): 使用桥接模式通过将实现和抽象放在两个不同的类层次中而使它们可以独立改变.
6、组合模式(composite): 允许你将对象组合成树形结构来表现"整体/部分"层次结构. 组合能让客户以一致的方式处理个别对象以及对象组合.
7、亨元模式(Flyweight): 如想让某个类的一个实例能用来提供许多"虚拟实例", 就使用蝇量模式.
三、行为型模式
1、策略模式(strategy): 定义了算法族, 分别封闭起来, 让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户.
2、责任链模式(Chain of responsibility): 通过责任链模式, 你可以为某个请求创建一个对象链. 每个对象依序检查此请求并对其进行处理或者将它传给链中的下一个对象.
3、模板方法模式(Template): 在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中. 模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤.
4、观察者模式(observer): 在对象之间定义一对多的依赖,这样一来, 当一个对象改变状态,依赖它的对象都会收到通知, 并自动更新.
5、迭代器模式(iterator): 提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示.
6、命令模式(Command): 将"请求"封闭成对象, 以便使用不同的请求,队列或者日志来参数化其他对象. 命令模式也支持可撤销的操作.
7、解释器模式(Interpreter): 使用解释器模式为语言创建解释器.
8、中介者模式(Mediator) : 使用中介者模式来集中相关对象之间复杂的沟通和控制方式.
9、备忘录模式(Memento): 当你需要让对象返回之前的状态时(例如, 你的用户请求"撤销"), 你使用备忘录模式.
10、状态模式(State): 允许对象在内部状态改变时改变它的行为,对象看起来好象改了它的类.
11、访问者模式(visitor): 当你想要为一个对象的组合增加新的能力,且封装并不重要时, 就使用访问者模式.