设计模式

原则1:找出应用中多变化之处,把他们独立出来,不要和不需要变化的代码混在一起

原则2:针对接口编程而不是针对实现编程

原则3:多用组合少用继承

原则4:高内聚,低耦合

原则5:类应该对扩展开放对修改关闭

依赖倒置原则:要依赖抽象,不要依赖具体类


观察者模式

java有自带的观察者模式:java.util.Observer  java.util.Observable

典型例子:各种监听器 listener

设计模式_第1张图片

四种角色:


设计模式_第2张图片

抽象主题/被观察者(Subject):维护一个观察者list;有注册观察者和注销观察者以及通知所有观察者的方法


抽象观察者Interface:有更新方法,在接受到主题的通知的时候,更新自己的状态


设计模式_第3张图片

具体主题(ConcreateSubject):继承抽象主题;在具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色又叫做具体被观察者(Concrete Observable)角色。


设计模式_第4张图片

具体观察者:存储与主体状态相关的状态属性,具体观察者角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。


装饰者模式


装饰者模式动态的将责任添加到对象上。如果要扩展功能,装饰者提供了比继承更富有弹性的替代方案。

典型例子:java I/O类


设计模式_第5张图片

四种角色:


抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。


设计模式_第6张图片

具体构件(ConcreteComponent)角色:定义一个将要接收附加责任的类。


抽象装饰(Decorator)角色:实现抽象构件接口。(若是抽象类则持有构建对象实例)


设计模式_第7张图片

具体装饰(ConcreteDecorator)角色:

持有一个构件(Component)对象的实例(被装饰),并负责给构件对象“贴上”附加的责任。


简单工厂模式

在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

角色:

客户:调用工厂对象

工厂:包含生产产品的方法,返回类型为抽象产品类

抽象产品类:接口或者虚类

具体产品类:实现抽象产品类

设计模式_第8张图片

抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

角色:

客户:调用抽象工厂的实现类的对象

抽象工厂:包含具体工厂的方法

具体工厂:实现抽象工厂接口,实现自己对应的方法,不是自己的生产方法则置空

抽象产品:接口或者虚类

具体产品:实现抽象产品


设计模式_第9张图片


设计模式_第10张图片
设计模式_第11张图片

单例模式

http://www.runoob.com/design-pattern/singleton-pattern.html

单件模式确保一个类只有一个实例,并且提供一个全局访问点。解决同一个对象频繁的创建和销毁的问题。


设计模式_第12张图片
设计模式_第13张图片

命令模式

命令模式是对命令的封装。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。

每一个命令都是一个操作:请求的一方发出请求要求执行一个操作;接收的一方收到请求,并执行操作。命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否被执行、何时被执行,以及是怎么被执行的。

命令允许请求的一方和接收请求的一方能够独立演化,从而具有以下的优点:

(1)命令模式使新的命令很容易地被加入到系统里。

(2)允许接收请求的一方决定是否要否决请求。

(3)能较容易地设计一个命令队列。

(4)可以容易地实现对请求的撤销和恢复。

(5)在需要的情况下,可以较容易地将命令记入日志。

设计模式_第14张图片

客户端(Client)角色:创建一个具体命令(ConcreteCommand)对象并确定其接收者。最终调用遥控器的action

抽象命令(Command)角色:声明了一个给所有具体命令类的抽象接口。execute

具体命令(ConcreteCommand)角色:定义一个接收者和行为之间的弱耦合;实现execute()方法,负责调用接收者的相应操作。execute()方法通常叫做执行方法。(按钮)

请求者(Invoker)角色:负责调用命令对象执行请求,相关的方法叫做行动方法。(遥控器)

接收者(Receiver)角色:负责具体实施和执行一个请求。任何一个类都可以成为接收者,实施和执行请求的方法叫做行动方法(接受者动作在execute方法中调用)绑定到命令上(按钮对应的内部实现)


设计模式_第15张图片

适配器模式

适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。

和装饰者模式的区别:

适配器模式主要是为了接口的转换,而装饰者模式关注的是通过组合来动态的为被装饰者注入新的功能或行为(即所谓的责任)。

适配器将一个对象包装起来以改变其接口;装饰者将一个对象包装起来以增强新的行为和责任;而外观将一群对象包装起来以简化其接口

现在书城卖道德经的书,有线装版,有精装版,有日文版,有英文版,其中线装版和精装版就是装饰模式,日文版和英文版就是适配器模式


设计模式_第16张图片

目标角色: 定义Client使用的与特定领域相关的接口。

客户:与符合Target接口的对象协同。

被适配者:定义一个已经存在并已经使用的接口,这个接口需要适配。

适配器:适配器模式的核心。它将对被适配Adaptee角色已有的接口转换为目标角色Target匹配的接口。对Adaptee的接口与Target接口进行适配.


模板模式

在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。


设计模式_第17张图片



设计模式_第18张图片

享元模式

享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。

享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。我们将通过创建 5 个对象来画出 20 个分布于不同位置的圆来演示这种模式。由于只有 5 种可用的颜色,所以 color 属性被用来检查现有的Circle对象。

介绍

意图:运用共享技术有效地支持大量细粒度的对象。

主要解决:在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建。

何时使用:1、系统中有大量对象。 2、这些对象消耗大量内存。 3、这些对象的状态大部分可以外部化。 4、这些对象可以按照内蕴状态分为很多组,当把外蕴对象从对象中剔除出来时,每一组对象都可以用一个对象来代替。 5、系统不依赖于这些对象身份,这些对象是不可分辨的。


设计模式_第19张图片

代理模式

意图:为其他对象提供一种代理以控制对这个对象的访问。

主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。


设计模式_第20张图片

抽象类:声明了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象的地方都可以使用代理对象。

目标对象:定义了代理对象所代表的目标对象。

代理对象:代理对象内部含有目标对象的引用,从而可以在任何时候操作目标对象;代理对象提供一个与目标对象相同的接口,以便可以在任何时候替代目标对象。代理对象通常在客户端调用传递给目标对象之前或之后,执行某个操作,而不是单纯地将调用传递给目标对象。


策略模式

在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。

在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。


设计模式_第21张图片

责任链模式

顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。

在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。层层处理


设计模式_第22张图片

你可能感兴趣的:(设计模式)