是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。
设计模式的本质是面向对象设计原则的实际运用,是对类的封装性、继承性和多态性以及类的关联关系和组合关系的充分理解。正确使用设计模式具有以下优点。
1. 模式名称
每一个模式都有自己的名字,通常用一两个词来描述,可以根据模式的问题、特点、解决方案、功能和效果来命名。模式名称(PatternName)有助于我们理解和记忆该模式,也方便我们来讨论自己的设计。
2. 问题
问题(Problem)描述了该模式的应用环境,即何时使用该模式。它解释了设计问题和问题存在的前因后果,以及必须满足的一系列先决条件。
3. 解决方案
模式问题的解决方案(Solution)包括设计的组成成分、它们之间的相互关系及各自的职责和协作方式。因为模式就像一个模板,可应用于多种不同场合,所以解决方案并不描述一个特定而具体的设计或实现,而是提供设计问题的抽象描述和怎样用一个具有一般意义的元素组合(类或对象的 组合)来解决这个问题。
4. 效果
描述了模式的应用效果以及使用该模式应该权衡的问题,即模式的优缺点。主要是对时间和空间的衡量,以及该模式对系统的灵活性、扩充性、可移植性的影响,也考虑其实现问题。显式地列出这些效果(Consequence)对理解和评价这些模式有很大的帮助。
组合复用原则
多用组合少用继承,找到变化的部分,抽象封装变化的部分,然后把抽象的具体实现带进去。
has A------组合 is A------继承
依赖导致原则
依赖:成员变量,方法参数,返回值,依赖抽象不要依赖具体
高层模块不应该依赖低层模块,两者都应该依赖其抽象,抽象不应该依赖具体,具体应该依赖抽象。
针对接口编程,不要针对实现编程
以抽象为基础搭建的结构比就提类搭建的结构要稳定的多。
在java中抽象指的是接口或者抽象类,具体就是具体的实现类
开放原则
对扩展开放,对修改关闭,保证稳定性和延续性
里氏替换原则
所有引用基类的地方必须能透明地使用其子类对象
子类扩展父类功能时。不能破坏父类原有的功能,使用继承时遵循里氏替换原则,子类可以实现父类的抽象方法,但是不能覆盖父类的非抽象方法,当子类重载父类方法时,方法的形参要比父类的方法参数要宽松。
当子类实现父类的抽象方法时,方法的返回值要比父类更严格。
里氏替换原则是设计整个集成体系的原则
迪米特原则(最小知识原则)
一个对象应该与其他对象保持更少的了解,至于直接朋友交谈
成员变量,方法参数,方法返回值中需要的类为直接朋友,类与类之间的关系越密切,了解越多,耦合度就越大,尽量降低类与类之间的耦合。
接口隔离原则:一个类对另一个类的依赖应该建立在最小的接口上
单一职责原则
类应该只有一个导致类变更的理由,即一个类只负责一项职责。
降低类的复杂度,提高系统的可维护性,修改时降低风险溢出。
设计模式的分类:
设计模式介绍 模式:在某些场景下,针对某类问题的某种通用解决方案。
主要关注点是“怎样创建对象?”,它的主要特点是“将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节,对象的创建由相关的工厂来完成。就像我们去商场购买商品时,不需要知道商品是怎么生产出来一样,因为它们由专门的厂商生产。
创建型模式分为以下几种。
描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。
由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。
结构型模式分为以下 7 种:
用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。
行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。
行为型模式是 GoF 设计模式中最为庞大的一类,它包含以下 11 种模式。
参考:
http://c.biancheng.net/view/1357.
https://blog.csdn.net/yu_shao/article/details/88052233