面向对象编程-设计模式理解

187 阅读7分钟

编程常用设计模式

行为型模式

观察者

场景:

拍卖的时候,拍卖师观察最高标价,然后通知给其他竞价者竞价。

功能:

对象间的一对多关系。当主体对象(目标)状态发生改变时,其所有的依赖对象(观察者)将得到通知。

作用:

提高代码的易用性、低耦合、高度协作性。

实现:

www.runoob.com/design-patt…

访问者

场景:

您在朋友家做客,您是访问者,朋友接受您的访问,您通过朋友的描述,然后对朋友的描述做出一个判断,这就是访问者模式。

功能:

将数据节后与数据操作分离。

作用:

解决了稳定的数据结构和易变的操作耦合问题。

实现:

www.runoob.com/design-patt…

模板

场景:

在造房子的时候,地基、走线、水管等这些流程都一样,只有在建筑的后期才有加壁橱加栅栏等差异。

功能:

将操作的算法骨架定义好,简化代码开发和维护。

作用:

将操作的算法骨架/逻辑骨架 定义好,子类去实现即可。

实现:

www.runoob.com/design-patt…

策略

场景:

旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。

功能:

提供一个核心部分模块化的类,其核心可以任意替换。

作用:

在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。

状态

场景:

允许一个对象在其对象内部状态改变时改变它的行为。

备忘录

场景:

打篮球的时候运动员可以有正常状态、不正常状态和超常状态。

功能:

根据对象状态改变行为,主动通知

作用:

对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。

实现:

www.runoob.com/design-patt…

中介者

场景:

国加入 WTO 之前是各个国家相互贸易,结构复杂,现在是各个国家通过 WTO 来互相贸易。

功能:

解决对象之间的依赖。

作用:

将网状结构分离为星型结构。

实现:

www.runoob.com/design-patt…

迭代器

场景:

迭代器

功能:

迭代器

作用:

自己做一个迭代器。

实现:

www.runoob.com/design-patt…

解释器

场景:

编译器、运算表达式计算。

功能:

对于一些固定文法构建一个解释句子的解释器。

作用:

给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。

实现:

www.runoob.com/design-patt…

命令

场景:

将命令请求封装为一个对象,使得可以用不同的请求来进行参数化。

责任链

场景:

JAVA WEB 中 Apache Tomcat 对 Encoding 的处理,Struts2 的拦截器,jsp servlet 的 Filter。

功能:

将请求发送和处理分开。

作用:

职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。

实现:

www.runoob.com/design-patt…

创建型模式

单例

场景:

蒙娜丽莎的画像只有一个,保存在卢浮宫,谁想看去法国博物馆。

功能:

某个类只能有一个实例,提供一个访问该实例的的方法。

作用:

节约系统资源、提高了系统效率,同时也能够严格控制客户对它的访问。

实现:

www.runoob.com/design-patt…

工厂方法

场景:

超市想要买一批奥利奥饼干,工厂说:我给你供货。过了一个月就是中秋节了,超市说:我要买一批月饼,工厂说:我这也有,我给你供货。超市不用去考虑饼干怎么制作,只需要练习工厂即可,有新需求可以告诉工厂。

功能:

定义一个创建某一类功能对象的接口,由传递的参数决定生成哪种对象。

作用:

降低代码的维护难度。比如从mysql切到oracle,只需提供oracle的实现类等少量工作,即可完成。

实现:

www.runoob.com/design-patt…

抽象工厂

功能:生成工厂的超级工厂。

www.runoob.com/design-patt…

建造者

场景:

一个肯德基全家桶的组成,是由汉堡、可乐、薯条、炸鸡等食物组成。根据客户需求还可以拼凑成不同价格的套餐。

功能:

将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

作用:

通过定义功能(接口),扩展功能(抽象类),到具体实现(实体类),最后由构建类将不同的实现类(子类)进行组装到一块,完成一个复杂对象的创建。像这样复杂的对象构建,可以根据需求,变换子类组成。

实现:

www.runoob.com/design-patt…

原型

场景:

我怕我上课写的笔记弄丢了,我复制(打印)了一份以防万一,因为再重新写 代码太大(还要单独找老师)。

功能:

对实例进行深度或者浅度复制。

作用:

因为创建该对象的代码太大,我没可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。

实现:

mp.weixin.qq.com/s?__biz=MzI…

结构型模式

适配器

场景:

美国电器 110V,中国 220V,就要有一个适配器将 110V 转化为 220V。

功能:

向下兼容的扩展功能。

作用:

同在一个屋檐下,实现类-A满足不了需求,实现类-B作为适配器的角色帮助A完成任务,而不是为了代替。

实现:

www.runoob.com/design-patt…

桥接

场景:

猪八戒在天上是人形,在地上是猪型,但是他还是那个猪八戒,灵魂没变。

功能:

设计内部可以自由变化的实体类。

作用:

抽象和接口一块使用(该类的抽象和实现部分分离),对象内部两个维度独立变化,减少它们之间的耦合。

实现:

www.runoob.com/design-patt…

组合

场景:

老板手下由秘书、会计、财务、经理,经理下面有普通员工、组长。让你画一个与之对应的树状关系图。

功能:

树枝内部组合该接口,并且含有内部属性 List,里面放 Component,表示部分以及整体的层次结构。

作用:

使复杂对象内部解耦,外部操作简单。

装饰

场景:

我有一个10w的手机充电器,但现在有超级快充(45w)了,我想换掉原来的充电头。于是,启动淘宝、下单、更换成功。但是原来的充电头我最好不要扔掉,万一有其他手机或者设备会用呢?

功能:

安全的对某个对象进行功能扩展/升级。

作用:

对子类/实现类 A的功能感到不满。通过继承同一个抽象类或者实现同一个接口,设计了子类/实现类 B。保证了不修改原有代码的前提下,对类进行扩展。

实现:

参考Spring-AOP增强

外观

场景:

去医院看病,可能要去挂号、门诊、划价、取药,让患者或患者家属觉得很复杂,如果有提供接待人员,只让接待人员来处理,就很方便。

功能:

提供一个子系统的一个统一访问/使用 接口。

作用:

降低访问复杂系统的内部子系统时的复杂度,简化客户端与之的接口。

实现:

www.runoob.com/design-patt…

亨元(蝇量)

场景:

JAVA 中的 String,如果有则返回,如果没有则创建一个字符串保存在字符串缓存池里面。

功能:

减少对象的创建数量。

作用:

对包含字符串属性的对象,有相同字符串属性值,则实现共用。

实现:

www.runoob.com/design-patt…

代理

场景:

比如说手机怕摔地上,屏幕碎了,就买一个手机壳带上。

功能:

实现对实例的访问控制。

作用:

增加安全性,减少开销。

实现:

www.runoob.com/design-patt…