小言_互联网的博客

浅谈23种设计模式

300人阅读  评论(0)


  • 总体来说,设计模式分为三大类:
    创建型模式(五种):工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式
    结构型模式(七种):适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式
    行为型模式(十一种):策策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

一.设计模式的六大原则

1、开闭原则(Open Close Principle)

开闭原则的意思是:对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,
实现一个热插拔的效果。

2、里氏代换原则(Liskov Substitution Principle)

在一个软件系统中,子类应该可以替换任何基类能够出现的地方,并且经过替换以后,代码还能正常工作。

3、依赖倒转原则(Dependence Inversion Principle)

这个原则是开闭原则的基础,具体内容:针对接口编程,依赖于抽象而不依赖于具体。

4、接口隔离原则(Interface Segregation Principle)

这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。
它还有另外一个意思是:降低类之间的耦合度。
它强调降低依赖,降低耦合。

5、迪米特法则,又称最少知道原则(Demeter Principle)

最少知道原则是指:一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。

6、合成复用原则(Composite Reuse Principle)

合成复用原则是指:尽量使用合成/聚合的方式,而不是使用继承。


二. 创建型模式

工厂方法模式

工厂模式就是帮我们实例化对象的,实现创建者和调用者分离。

  • 简单工厂模式:用来生产同一等级结构中的任意产品。
  • 工厂方法模式:用来生产统一等级结构中的固定产品。
  • 抽象工厂模式:又来生产不同产品族的全部产品。
    应用场景:批量生产对象
    eg:Android中的Resource factory

单例模式

单例模式只生成一个实例,减少了系统的开销。方便访问数据
保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。
应用场景:系统中要去一个类仅有一个实例,可以用来存储数据。全局访问
eg:LibData存储用户数据

建造者模式

使用多个简单的对象一步一步构建成一个复杂的对象。
应用场景:生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员属性。
内部互相依赖,有顺序
eg:Android画页,包含了很多内部东西。画页管理器,资源等

原型模式

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
应用场景:创建新的对象比较复杂时,可以利用原型模式简化对象的创建过程,同时也能够提高效率。
eg:大结构体拷贝


三. 结构型模式

##适配器模式
将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。
应用场景:系统需要使用现有的类,而这些类的接口不符合系统的需要。想要建立一个可以重复使用的类,
用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
eg:Android多样的Adpter

装饰器模式

允许向一个现有的对象添加新的功能,同时又不改变其结构
eg:python装饰器,在一个对象中添加一个子对象,或者继承。

代理模式

给某一个对象提供一个代 理,并由代理对象控制对原对象的引用。
eg:对外封装代理类

外观模式

外观模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
外观模式又称为门面模式,它是一种对象结构型模式。
eg;复杂软件模块内部调用

桥接模式

将抽象部分与它的实现部分分离,使它们都可以独立地变化。

补充:
桥接是先有桥,才有两端的东西 适配是先有两边的东西,才有适配器 。
桥接是在桥好了之后,两边的东西还可以变化。

设想如果要绘制矩形、圆形、椭圆、正方形,我们至少需要4个形状类,但是如果绘制的图形需要具有不同的颜色,如红色、绿色、蓝色等,此时至少有如下两种设计方案:
第一种设计方案是为每一种形状都提供一套各种颜色的版本。
第二种设计方案是根据实际需要对形状和颜色进行组合
对于有两个变化维度(即两个变化的原因)的系统,采用方案二来进行设计系统中类的个数更少,且系统扩展更为方便。
设计方案二即是桥接模式的应用。
桥接模式将继承关系转换为关联关系,从而降低了类与类之间的耦合,减少了代码编写量。
eg:对于两个独立变化的维度,使用桥接模式再适合不过了。

组合模式

是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。
这种类型的设计模式属于结构型模式,它创建了对象组的树形结构
eg:在 JAVA AWT 和 SWING 中,对于 Button 和 Checkbox 是树叶,Container 是树枝。

享元模式

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


四.行为型模式

策略模式

一个类的行为或其算法可以在运行时更改。
定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。
策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy)。
eg:JAVA AWT 中的 LayoutManager。

模板方法模式

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

观察者模式

定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。
eg:observe通知别的类,需要注册观察者

迭代子模式

是 Java 和 .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。
eg:暂无

责任链模式

为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。
这种类型的设计模式属于行为型模式。
eg:JS 中的事件冒泡

命令模式

将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。命令模式是一种对象行为型模式,
其别名为动作(Action)模式或事务(Transaction)模式。
命令模式的五个对象

命令Command:
真实命令RealCommand:
行为执行者Receiver:
行为请求者Invoker:
eg:暂无

备忘录模式

保存一个对象的某个状态,以便在适当的时候恢复对象。
eg:数据库的事务管理。Windows 里的 ctri + z

状态模式

类的行为是基于它的状态改变的。
eg:状态机

访问者模式

我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,
这样访问者对象就可以处理元素对象上的操作。

eg:访问一个聚合对象

中介者模式

用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
中介者模式又称为调停者模式,它是一种对象行为型模式。
eg:MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。

解释器模式

提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,
该接口解释一个特定的上下文。
eg:这种模式被用在 SQL 解析、符号处理引擎等。


转载:https://blog.csdn.net/hiwoshixiaoyu/article/details/102470150
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场