分享

设计模式本质探讨

 北方天空A 2020-06-04

设计模式是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。

它主要有两层含义:其一它对应一个问题,其二它对应解决一个问题的最佳方法。

设计模式有什么作用呢?

为了代码可重用性,减少模块间耦合。

<1>创建型

1.单例模式

一个类只能有一个实例,这就是单例模式。

2.简单工厂

一个工厂可以生产多个种类产品,这就是简单工厂模式。如一个饭店既可以做西红柿炒

鸡蛋这个菜也可以做酸辣土豆丝还可以做豆腐皮,这就是简单工厂模式的例子。

3.工厂方法

一个工厂只能生产一类产品,这就是工厂方法模式。如鸡公煲店只能做鸡公煲这个菜,

排骨米饭店只能做排骨米饭,一个卖油饼的只能做油饼,馒头店只能做馒头等。

4.抽象工厂

一个工厂只能生产一个系列或一个品牌产品,这就是抽象工厂模式。如海尔集团生产的

产品种类很多,但都是海尔牌子的,如电冰箱、洗衣机、彩电等,澳柯玛海信等也能生产电冰箱、洗衣机、彩电。

5.建造者模式

生产一个产品或者组装一个产品需要很多步骤,把这些步骤封装,这就是建造者模式。

它分为抽象建造者、具体建造者、指导者角色。抽象建造者负责声明方法,具体建造者

实现这些方法,指导者调用具体建造者中方法。如你去科技市场组装一台电脑,老板就

是指导者角色,具体负责组装的员工就是具体建造者角色,是老板让员工去组装他才去

组装,也就是说有指导者调用具体建造者中的方法。

6.原型模式

简单说就是复制模式。如孙悟空拿自己的一根头发可以生成一个孙悟空来,我们去复印

资料时候用的也是原型模式。

<2>结构型

1.适配器模式

把现有接口改变成客户需要的接口,这就是适配器模式。它有三个角色:源角色、目标

角色、适配器角色。适配器模式分为两类:类适配器和对象适配器。类适配器和对象适

配器都是有适配器将源角色转换成目标角色,但是方法不一样。类适配器继承源角色和

目标角色类,在目标角色方法中调用源角色方法,对象适配器光继承目标角色,但是需要

定义源角色变量,也是在目标角色方法中调用源角色方法来实现适配功能。

2.桥接模式

桥接模式就是抽象部分和实现部分分开的一种设计模式,这里的抽象实现不是指的接口

和实现接口类的抽象实现,也不是抽象类和实现抽象类的类的抽象实现,而是指一个类

和类中的方法,类就是抽象部分,类中的方法就是实现部分,如果一个方法在类中有具

体实现,需求变更需要修改方法时候不符合开闭原则,所以把实现单独作为一个类,这

样需求有变更时不需要改变抽象类,只需要改变实现类就可以了,这样抽象和实现可以

独立变化了,减少了耦合。也就是说类中函数定义还是存在的,函数体调用别的类中的方法。

3.装饰者模式

对一个元素进行装饰,就是装饰者模式。比如装修房子,比如新买了手机,安装了手机

壳和贴了钢化膜。装饰者模式实现时候需要调用被装饰者方法和调用装饰者自身方法。

4.代理模式

有时候我们不想或者没有能力去干一件事情,就需要有人代替我们去干,这就是代理设

计模式。代理模式分为抽象主题角色、具体主题角色、代理角色。在实现时候代理模式

负责创建具体主题角色并调用具体主题角色中相关方法,当然也可能调用代理者自己方

法如果有的话。

5.组合模式

组合模式处理简单对象和复杂对象的关系,两者接口必须一致。有两种方法设计接口,

按照复杂对象设计接口和按照简单对象设计接口。如果按照复杂对象设计接口有些方法

简单对象不需要,简单对象实现这些方法时候就得抛出错误,如果以简单对象设计接口

,复杂对象中有些方法在接口中不存在,就需要单独在复杂对象中添加这些方法。

6.外观模式

如果没有外观模式,客户端需要访问多个类,这样增加了代码量,不方便维护。外观模

式就是解决这些问题的,专门定义一个类去和各个类进行交互,客户端只需要访问这一

个类就可以了,这就是外观模式。

7.享元模式

如果我们要去创建一个类,而现实中已经有类似的类了,只是类中方法参数不一样,其

它都是一样的,那么我们就不需要再创建类了,只需要修改完善以前类,把参数传递过去就

可以了。也就是说,在软件开发过程中,如果需要创建大量的细粒度类的实例,而这些

实例除了参数不一样外其它都是一样的,那么我们就可以把参数拿出来,需要时候给相

关方法传递参数就可以了。这就是享元设计模式。

<3>行为型

1.备忘录模式

用于备份数据。它又是怎样实现的呢?

备忘录模式分为备忘录角色、管理者角色、发起人角色。发起人创建备忘录并恢复备忘录数据,管理者保存备忘录,备忘录保存对象状态。

2.访问者模式

元素和对元素的操作分开。如果元素比较稳定,操作可能有变化,可以使用这种模式,

这样操作有变化时候不用修改元素,减少了元素和操作的耦合度。

3.责任链模式

一个请求需要多个审核就使用责任链模式。如请假,请假一天谁审批,请假3天谁审批

,请假7天呢。

4.策略者模式

一类问题,多个算法,每个问题对应一个算法。这时候就需要策略者模式,它是把算法

单独作为一个类。如税分个人所得税和企业所得税,这两个税的算法是不一样的,这时

候就需要用到策略者模式。

5.状态者模式

元素状态不同,它对应的行为也不一样,如果不用状态模式呢,就会有很多if else语

句,如果有新的条件还得增加else语句,不符合开闭原则,所以就引入了状态者模式,另

外如果用平常方法元素状态改变了它对应行为也没法做到自动改变。状态者模式就是解

决这些问题的,状态者模式把元素和元素状态分离开了,元素状态单独作为一个类,元

素的行为有状态类实现,这样元素状态改变时候将会自动改变元素对应行为。状态者模式有元素角色、抽象状态、具体状态组成,如果需要增加一个状态,只需要增加一个具体状态就可以了,满足了开闭原则。

6.中介者模式

我们通过中介来干一件事情。比如我们通过微信、QQ和好友聊天,这个微信和QQ就扮演

着中介角色,再举个例子,房产中介也是中介者模式例子。为什么要使用中介者模式呢,

因为干有些事情我们不专业、有风险或者别的原因。

7.观察者模式

比如订阅号,订阅号有新的内容更新,会通知所有关注了这个订阅号的人,这就是观察

者模式。

8.迭代器模式

什么是迭代器模式呢?迭代器模式就是列表和对列表的操作分开了,对列表操作单独作

为一个类存在。这样做有什么好处呢?如果不用迭代器模式当然也可以对列表进行操作

,但是会暴露列表内部数据。迭代器模式好处就是既不影响访问列表数据,又不会暴露

列表内部数据。

9.命令模式

命令模式就是发布命令时候用到的一个设计模式。它主要分为抽象命令角色、具体命令

角色、接收者角色、请求者角色、发起人角色。接收者就是需要谁执行命令,请求者就

是具体发布命令的人,发起人就是谁让请求者发的命令。举个例子,一个大学的校长需要

发布个命令“9月10日有个全体学生的会议”,就需要各个班主任通知各个班同学,那么校

长就是发起人,各班班主任就是请求者,学生就是接收者。发起人调用请求者方法,请

求者调用命令中方法,命令调用接收者方法。

10.模板方法模式

我们想要干一件事情,如果有现成模板,我们就可以使用,这就是模板设计模式。模板

中有些方法是固定的不能改,有些是可以改变的。举个例子,我们从网上下载个简历,

简历样式我们不能改,改了就不是模板了,但是有些内容需要换成我们自己的,这就是

模板设计模式。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多