为何需要设计模式:
模式是做事的方法,是实现目标,研磨技术的方法。这种对高效技术不懈追求的思想,广泛见于诸多领域,例如制作精美佳肴的过程。对于任何一种迈向成熟的全新技艺,身处这个行业的人都需要寻找通用而有效地的方法,达到我们的目标,解决不同场景的问题。
设计模式是一种模式,在面对对象的语言中,它运用类与他们的方法来达到目标。开发人员通常会在学习编程语言,并在编写一段时间的代码之后才会考虑设计。我们羡慕某些人代码的简洁而实用,我们想学习他们让代码拥有简洁之美,需要用到设计模式,设计模式可以提升代码的水准,使用更少的类完成目标。模式是思想的提现,而非具体的实现。
按照意图可以将设计模式分为5类,
接口型模式:适配器模式,外观模式,合成模式,桥接模式
类的接口是允许其他类对象访问的方法与字符集。接口通常代表一种承诺,即方法需要实现接口方法名表示的操作,遵循代码注释、测试和其他文档说明,类的实现就是位于方法体中的代码。接口的功能在于它描述了在类协作中它所期望与不期望的行为。接口与抽象类很相似,定义行为却不提供实现。
适配器模式:适配类的接口以匹配客户端期待的接口。
外观模式:为一组类提供一个简单接口。
合成模式:为当个对象与复合对象提供统一的接口。
桥接模式:解除抽象与实现之间的耦合,使得二者能够独立演化。
每个设计模式都是解决不同场景的问题,面向接口的模式适用于需要对一个类或一组类的方法进行定义或重定义的场景。例如某个类实现了我们需要的服务,但是方法名称却和客户端的期望不符合,这就需要适配器模式。
职责型模式:单例模式,观察者模式,中介者模式,代理者模式,职责链模式,享元模式
无论一个类如何限制它的成员,面对对象开发通常将职责分散到各个独立的对象中,面对对象促进了封装,封装是指基于自己的数据进行操作。
单例模式:将责任集中到某个类的单个实例中。
观察者模式:将对象从依赖于它的对象中解耦。
中介者模式:将职责集中在某个类,该类可以监督其他对象的交互。
代理模式:让一个对象扮演其他对象的行为。
职责链模式:允许将请求传递给职责链的其他对象,直到这个请求被某个对象处理。
享元模式:将共享的、细粒度的对象职责集中管理。
构造型模式:构建者模式,工厂方法模式,抽象工厂模式,原型模式,备忘录模式
一般情况下,你需要为自己开发的类提供构造函数使其能够被初始换,这些构造函数可能相互调用协作,而且类中的每个构造函数最终都会调用超类的构造函数,调用构造函数常规的做法是new操作符,但是也可以使用反射来初始化和适用对象。在设计一个新类时,只有在类的用户知道该如何初始化类以及传递所需的参数时,构造函数才是有效的。
构建者模式:在请求创建对象前,逐步收集创建对象需要的信息。
工厂方法模式:决定推迟实例化类对象。
抽象工厂模式:创建一族具有某些共同特征的对象。
原型模式:根据现有对象创建一个新的对象。
备忘录模式:通过包含了对象内部状态的静态版本重新构建一个对象。
操作型模式:模板方法模式,状态模式,策略模式,命令模式,解释器模式
理解操作型模式之前先要理解 算法 多态 方法 操作。操作是一个服务的规格说明,他可以被类的实例调用。
方法是操作的实现。操作表示类做了什么,还表示服务提供的接口。不同的类可能用不同的方法实现同样的操作。例如很多类都是实现了自己的toString 操作。
算法是已经定义好的计算程序,将数据或者数据集作为输入,将产生的数据或者数据集作为输出,算法是一个过程,一个有输入和输出的指令序列,算法需要多个方法来执行。算法完成一些事情,他可能是方法的一部分,也可能调用了很多方法。在面向对象的设计中,需要多个方法参与的算法通常依赖于多态,因为多态机制允许一个操作具有不同的实现。多态是一个既依赖于调用的操作,又依赖于调用接收者类型的一种方法调用的原则。比如:执行表达式m.cmd(),如果m是Machine类的实例,调用Machine.cmd()。如果m是MachineComposite 调用MachineComposite.cmd()。多态是指合适的对象调用合适的方法。
模板方法模式:在方法中实现算法,推迟对算法步骤的定义使得子类能够重新实现。
状态模式:将操作分散,使得每个类都能够表示不同的状态。
策略模式:封装操作,使得实现是可以互相替换的。
命令模式:用对象来封装方法调用
解释器模式:将操作分散,使得每个实现能够运用到不同类型的集合中。
扩展型模式:装饰器模式,迭代器模式,访问者模式
编写代码的主要目的是扩展新的功能,这需要重新组织代码,改善代码的质量。
装饰器模式:让开发者动态组合对象的行为。
迭代器模式:提供一个方法来顺序访问集合中的元素。
访问者模式:允许开发者定义一个新的操作,而无须改变分层体系中的类。