设计模式小秘密

Posted darling君

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式小秘密相关的知识,希望对你有一定的参考价值。

设计模式概述

设计模式(Design Pattern):设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。是一套被反复使用、多数人知晓的、经过分类的代码设计经验的总结。

使用设计模式的目的:为了代码可重用性、让代码更容易维护、保证代码可靠性。代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。


设计模式分类

1.创建型模式(主要用于创建对象)

抽象工厂模式:提供一个创建相关或依赖对象的接口,而不指定对象的具体类。

工厂方法模式:允许一个类的实例化推迟到子类中进行。

生成器模式:将一个复杂对象的创建与它的表示分离,使同样的创建过程可以创建不同的表示。

原型模式:使用原型实例指定要创建的对象类型,通过复制原型创建新的对象。

单例模式:保证一个类只有一个实例,并且提供对这个实例的全局访问方式。

2、结构型模式(主要用于处理类或者对象的组合)

外观模式:对于已有的界面建立一个简化的界面以简化使用共任务。

适配器模式:将一个物件的界面‘转接’成当事人预期的样子。

桥接模式:将一个抽象与实现解耦,以便两者可以独立的变化。

组合模式:树状结构的物件,每个物件有相同的界面。

修饰模式:对一个执行的类别,若使用继承方式加上新功能可能会新类别的数量呈指数型地增加,可使用此模式来解决。

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

3、行为型模式(主要用于描述类或者对象交互行为)


策略模式:在执行时依需求而选择算法。

观察者模式:亦即发行/订阅或事件聆听者。物同件注册去聆听由另一个物作所引发的事件。

命令模式:命令物件将动作及参数封装起来。

解释器模式:实作特制化的编程语言以解决一系列特殊的问题。

迭代器模式:迭代器用于存取包含器中元素而不用透露底层实作的方式。

备忘录模式:使一个物件还原到前一个状态的能力(rollback)。

状态模式:在执行可以部分改变物件的一种方法。

责任链模式:处理命令物件或将之传到下一个可以处理的物件。

模板方法模式:描述一个程式的骨架。


面向对象(OO)设计原则

单一职责原则 (Single Responsiblity Principle SRP)

开闭原则(Open Closed Principle,OCP)

里氏代换原则(Liskov Substitution Principle,LSP)

依赖倒转原则(Dependency Inversion Principle,DIP)

接口隔离原则(Interface Segregation Principle,ISP)

合成/聚合复用原则(Composite/Aggregate Reuse Principle,CARP)

最小知识原则(Principle of Least Knowledge,PLK,也叫迪米特法则)。


1.观察者模式

定义

定义对象之间一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。


模式结构(四种角色)

主题Subject(接口):包含添加、删除观察者以及通知观察者更新数据的方法;

具体主题(ConcreteSubject): 实现主题接口的一个实例,通常需要使用一个

集合ArrayList存放观察者引用,以便数据变化时通知具体观察者。

观察者Observe(接口):规定具体观察者用来更新数据的方法;

具体观察者(ConcreteObserver):实现观察者接口的一个实例,包含主题接口

变量,以便让具体观察者本身添加到具体主题集合中,成为它的观察者。



观察者模式特点

①在观察者模式中,会改变的是主题的状态,以及观察者的数目和类型;

②主题与观察者都使用接口,观察者利用主题接口向主题注册,而主题利用

观察者接口通知观察者,具有松耦合特点;

③该模式利用组合将许多观察者组合进主题中,对象之间的关系不是通过

继承产生的,而是在运行时利用组合的方式而产生的。



设计原则:

为了交互对象之间的松耦合设计而努力。


2.装饰模式

定义

动态地将职责附加到对象上.若要扩展功能,装饰者提供了比更有弹性的替代方案


模式结构(四种角色)

抽象组件(Component):是一个抽象类,定义被装饰者需要进行”装饰”方法

具体组件(ConcreteComponent):是抽象组件的子类,其实例被称为”被装饰者”

装饰(Decorator):是抽象组件的一个子类(通常用抽象类),其中还包含一个抽象组件声明变量用来保存“被装饰者”的引用

具体装饰(ConcreteDecorator):是装饰的非抽象子类,其实例称为”装饰者”;可以把”装饰者”作为一个”被装饰者”。


装饰模式特点

1.被装饰者和装饰者是松耦合关系。具体装饰只知道它要装饰的对象是

抽象组件某一个子类实例,不需要知道是哪一个具体子类;

2.装饰模式满足“开-闭原则”;不必修改被装饰者,就可以增加新的装饰对被装饰者进行具体装饰;

3.可以使用多个具体装饰来装饰被装饰者;

4.利用继承达到”类型匹配”,而不是利用继承获得“行为”

5.利用装饰者模式,常常造成设计中有大量的小类,数量实在太多。



设计模式小秘密


3.工厂方法模式

定义

定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。 


模式结构(四种角色)

①抽象产品(Product):抽象类或接口,负责定义具体产品必须实现的方法;

②具体产品(ConcreteProduct):具体产品是Product子类或实现接口方法类;

③构造者(Creator):抽象类或接口,定义一个称为工厂方法的抽象方法,该

方法返回具体产品类的实例;

④具体构造者(ConcreteCreator):是Creator的子类或实现接口方法类,它重写

工厂方法使工厂方法返回具体产品的实例。


工厂方法模式特点

①使用工厂方法帮助我们将产品的“实现”从“使用”中解耦;

②使用户不必知道它所使用对象怎么被创建,只需知道该对象有哪些方法即可。


4.抽象工厂模式

定义

抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类


模式结构(四种角色)

①抽象产品(Product):抽象类或接口,负责定义具体产品必须实现的方法;

②具体产品(ConcreteProduct):具体产品是Product子类或实现接口方法类;

③抽象工厂(AbstractFactory):抽象类或接口,定义若干个抽象方法;

④具体工厂(ConcreteFactory):是AbstractFactory的子类或实现接口方法类,它重写抽象工厂中抽象方法,使该方法返回具体产品的实例。


抽象工厂模式特点

①抽象工厂模式可以为用户创建一系列相关的对象,使用户和创建这些对象的类解耦;

②可以方便为用户配置一系列对象;

③在抽象工厂模式中,可以随时增加“具体工厂”为用户提供一组相关对象

工厂模式比较

工厂方法:把一个抽象方法当成“工厂”,通过继承完成

抽象工厂:把一个抽象类或接口当成“工厂”,通过对象组合来完成

两者关系:工厂方法是潜伏在抽象工厂里面,即抽象工厂的方法经常以工厂方法的方式实现。


5.单件模式

定义

单件模式(单例模式):确保应用程序中一个类只有一个实例,并提供一个全局访问点。


特点

①单件类中包含用自身声明的类变量,且类变量是单件类唯一的实例

②单件类的构造方法访问权限是private

③单件类负责创建自己唯一的实例,并提供public访问该实例的类方法。


命令模式

命令模式:将”请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其它对象以及支持可撤消的操作。


模式结构(四种角色)

接收者Receiver:是一个类的实例,负责执行与请求相关的具体操作;

②命令接口Command:封装请求的若干个方法;

③具体命令ConcreteCommand:实现命令接口类的实例;

④请求者Invoker:是一个包含Command接口变量的类的实例。请求者负责

调用具体命令,让具体命令执行那些封装了请求的方法。

设计模式小秘密


6.适配器模式

定义

适配器模式: 将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作。


模式结构(三种角色)

①目标(Target):是一个接口,该接口是客户想使用的接口;

②被适配者(Adaptee):是一个已经存在的接口或抽象类,它需要被适配;

③适配器(Adapter):是一个类,实现了目标接口,并包含被适配者的引用。

特点

①目标Target和被适配者Adaptee是完全解耦的关系;

②满足“开-闭原则”,当添加一个实现Adaptee接口的新类时,不必修改Adapter,就能对这个新类的实例进行适配

设计模式小秘密


7.外观模式

定义

提供一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。


模式结构(两种角色)

①子系统(Subsystem):是若干类的集合,这些类的实例协同合作为用户提供所需要的功能,子系统中任何类不包含外观类的实例引用

②外观(Facade):是一个类,包含子系统中全部或部分类的实例引用,客户只需和外观类实例打交道。


特点

①使客户与子系统中的类无耦合,使子系统用起来更加方便;

②外观只是提供一个更加简洁的界面,并不影响用户使用子系统中的类;

③子系统中的任何类对其方法的修改不影响外观的使用。


适配器模式与外观模式比较

适配器模式

外观模式

当需要使用一个现有类而其接口并不符合需要时

当需要简化并统一一个很大接口或一群复杂接口时

可以改变接口以符合客户的期望

将客户从一个复杂子系统中解耦

一个对象包装起来以改变其接口

将一群对象“包装”起来以简化其接口


8.模板方法模式

定义

在一个方法中定义一个算法的骨架(算法框架),而将一些步骤延迟到子类中。模板方法使得子类可以在不改变一个算法的结构的情况下,即可重新定义该算法中的某些步骤。


特点

①可以通过在抽象模板定义模板方法给出成熟的算法步骤;

②具体模板实现算法细节不会改变整个算法的骨架;

③在抽象模板类中,可以通过Hook方法对算法骨架中的某

些步骤进行挂钩,具体模板通过钩子可以选择算法骨架中的

某些步骤。


模式结构(两种角色)

①抽象模板:是一个抽象类,它包含了一个算法骨架称为模板方法;该算法中每一步骤可以由抽象方法(原语操作)与非抽象方法实现。抽象方法由其子类具体模板完成。

②具体模板:它是抽象模板的子类,实现抽象模板中的原语操作。


9.迭代器模式

定义

提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。


注意

①迭代器模式让我们能游走于聚合内的每一个元素,而又不暴露其内部的表示;

②把游走的任务放在迭代器上,而不是聚合上。这样简化聚合的接口和实现,也让责任各得其所。


四种角色

①集合(Aggregate):一个接口,定义具体集合需实现的操作

②具体集合(ConcreteAggregate):具体集合是实现集合接口的类的实例,具体集合按照一定结构存储对象,具体集合应当有一个方法,该方法返回一个针对该集合的具体迭代器

③迭代器(Iterator):一个接口,规定遍历具体集合的方法

④具体迭代器(ConcreteIterator):实现迭代器接口的类的实例


10.组合模式

定义

允许将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象(叶子节点)及对象组合(中间节点)。

组合模式关键在于无论是个体对象还是组合对象都实现了相同的接口或都是同一个抽象类的子类。


模式结构(三种角色)

①抽象组件(Component):是一个接口(抽象类),该接口定义了个体对象和组合对象需要实现的关于操作其子节点的方法或用于操作其自身的方法。

②Composite节点:实现Component接口类的实例,同时可以含有其它Composite节点或Leaf节点的引用

③Leaf节点:实现Component接口类的实例,不可以包含其它Composite节点或Leaf节点的引用

11.状态模式

定义

允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。


模式结构(三种角色)

①上下文(Context):是一个类,含有抽象状态State声明的变量,可以引用任何具体状态类的实例。GumballMachine

②抽象状态(State):是一个抽象接口或抽象类,定义了所有具体状态的共同方法。

③具体状态(ConcreteState):实现抽象状态State的类


12.策略模式

定义

定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得各个算法可独立于使用它的客户而变化。


优点

定义一系列算法

②避免多重条件语句

③更好的扩展性


缺点

①客户必须了解每种策略的不同

②增加对象的数目

③只适合扁平的算法结构



以上是关于设计模式小秘密的主要内容,如果未能解决你的问题,请参考以下文章

关于网站那些不得不说的小秘密

小程序码 - 设计篇菊花绽放

模式的秘密——观察者模式

模式的秘密之工厂模式

模式的秘密:单例模式

模式的秘密--工厂模式