设计模式概述

设计模式和设计原则

软件领域的4人帮总结出设计模式,但他们不说“人话”,害的这些概念都很难读懂。其实这些东西很简单。只是需要一个正确的方法去学习。其实,做任何事情都需要先把知识框架理清楚,就像面前有很多门,但是我们一次只能进入一个门。话不多说,开始!

学习设计模式,我的想法是抓住主线,向外延伸。
高内聚,低耦合(核心) >> 设计原则 >> 设计模式
模式基于原则,原则基于核心。
1.(Single …)单一职责原则
一个类只负责一件事,如果能拆分就让他拆。
2.(Open …)开闭原则
对扩展开放,对修改封闭。当需求有更改了,尽量用继承、组合、注入等方式扩展类功能,而不是直接修改类代码。当然,如果可以保证增加的代码对整体没有影响,那就直接改吧。
3.(Liskov …)里氏替换原则。代码中可以把父类替换成子类不会出错。反过来就不行。这启示我们对象声明,函数入参的形参,尽量用父类声明,这样有利于后来的需求继承做扩展。有个有趣的小故事,为什么叫里氏呢?因为该原则最早由 麻神理工的 Barbara Liskov 提出,她是第一个获得计算机博士的女性,曾经获得图灵奖。
4.(Least …)最小知识原则

廖雪峰网站
设计模式分为三种类型,共23种:
创建型模式:单例模式、抽象工厂模式、建造者模式、工厂模式、原型模式。
结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。
行为型模式:模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式(责任链模式)、访问者模式。

单例模式
保证一个进程中,某个类只有一个实例。

实现方法:静态字段引用唯一实例,通过静态方法返回实例。
饿汉式,懒汉式。推荐饿汉式。直接创建。

装饰器模式
动态地给一个对象添加一些额外的职责。

把一个一个的附加功能,用Decorator的方式给一层一层地累加到原始数据源上。

// 创建原始的数据源:
InputStream fis = new FileInputStream("test.gz");
// 增加缓冲功能:
InputStream bis = new BufferedInputStream(fis);
// 增加解压缩功能:
InputStream gis = new GZIPInputStream(bis);


最顶层的Component是接口,对应到IO的就是InputStream这个抽象类。ComponentA、ComponentB是实际的子类,对应到IO的就是FileInputStream、ServletInputStream这些数据源。Decorator是用于实现各个附加功能的抽象装饰器,对应到IO的就是FilterInputStream。而从Decorator派生的就是一个一个的装饰器,它们每个都有独立的功能,对应到IO的就是BufferedInputStream、GZIPInputStream等。

Decorator模式有什么好处?它实际上把核心功能和附加功能给分开了。核心功能指FileInputStream这些真正读数据的源头,附加功能指加缓冲、压缩、解密这些功能。如果我们要新增核心功能,就增加Component的子类,例如ByteInputStream。如果我们要增加附加功能,就增加Decorator的子类,例如CipherInputStream。两部分都可以独立地扩展,而具体如何附加功能,由调用方自由组合,从而极大地增强了灵活性。

外观模式
为子系统中的一组接口提供一个一致的界面。Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

桥接模式
抽象和实现分离。解决类爆炸的问题。
未使用桥接的UML图

使用桥接的UML图。
在这里插入图片描述
责任链模式
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

在实际场景中,财务审批就是一个责任链模式。假设某个员工需要报销一笔费用,审核者可以分为:

Manager:只能审核1000元以下的报销;
Director:只能审核10000元以下的报销;
CEO:可以审核任意额度。
用责任链模式设计此报销流程时,每个审核者只关心自己责任范围内的请求,并且处理它。对于超出自己责任范围的,扔给下一个审核者处理,这样,将来继续添加审核者的时候,不用改动现有逻辑。

中介模式
用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

中介模式(Mediator)又称调停者模式,它的目的是把多方会谈变成双方会谈,从而实现多方的松耦合。

在这里插入图片描述
这个小系统有4个参与对象:

多选框;
“选择全部”按钮;
“取消所有”按钮;
“反选”按钮。
它的复杂性在于,当多选框变化时,它会影响“选择全部”和“取消所有”按钮的状态(是否可点击),当用户点击某个按钮时,例如“反选”,除了会影响多选框的状态,它又可能影响“选择全部”和“取消所有”按钮的状态。

所以这是一个多方会谈,逻辑写起来很复杂:

命令模式
命令的创建和执行分离。

解释器模式
给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。比如我们用的 SQL语句,它本身很简单,解释SQL语句执行的程序就是一个解释器。但对使用者来说,只要写出SQL语句即可。

迭代器模式
java中遍历ArrayList时,不应该用索引去遍历,因为这样需要知道集合内部的存储结构,而应该使用迭代器,这样可以让调用者使用统一的接口遍历不同类型的集合。

备忘录模式
备忘录模式是为了保存对象的内部状态,并在将来恢复。其实设计上很简单。一般只需添加一个getState和setState函数即可。保存的方式可以是放在内存里,放在文件系统里等等。都OK。

观察者模式
观察者模式(Observer)又称发布-订阅模式(Publish-Subscribe:Pub/Sub)。它是一种通知机制,让发送通知的一方(被观察方)和接收通知的一方(观察者)能彼此分离,互不影响。

状态模式
允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。比如QQ状态有在线、离线、忙碌等等。

访问者模式
表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值