二哈谈设计模式之总结

设计模式



一、 设计模式分类

  • 创建型模式:对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离。
    (5种) 工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式

记忆口诀:创工原单建抽(创公园,但见愁)

  • 结构型模式:关注于对象的组成以及对象之间的依赖关系,描述如何将类或者对象结合在一起形成更大的结构。就是通过组成形成复杂的、功能更为强大的结构。
    (7种) 适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式

记忆口诀:结享外组适代装桥(姐想外租,世代装桥)

  • 行为型模式:关注对象的行为问题,是对在不同的对象之间划分责任和算法的抽象化;不仅仅关注类和对象的结构,而且重点关注它们之间的相互作用。
    (11种) 策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、
    备忘录模式、状态模式、访问者模式、中介者模式、解释器模式

记忆口诀:行状责中模访解备观策命迭(形状折中模仿,戒备观测鸣笛)

二、 六大设计原则

  • 单一职责原则(Single Responsibility Principle):系统中的每一个对象都应该只有一个单独的职责,而对于所有对象所关注的就是自身职责的完成。
  • 里氏替换原则(Liskov Substitution Principle):在任何父类出现的地方都可以用它的子类来替代。
  • 依赖倒置原则(Dependence Inversion Principle):依赖于抽象,不要依赖于实现。
  • 接口隔离原则(Interface Segregation Principle):一个接口不需要提供太多行为,
  • 迪米特法则(Law of Demeter):一个对象应该对其他对象有最少的了解,也就是说一个类要对自己需要耦合或者调用的类知道的最少。
  • 开闭原则(Open Closed Principle):一个软件实体,比如类,模块,函数应该对扩展开放,对修改关闭。

三、23种设计模式

1.创建型模式

工厂模式

在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过一个共同接口来指向新创建的对象。

定义一个创建对象的接口,让其子类决定实例化哪个工厂类,工厂模式使其创建过程延迟到子类进行。

应用实例:您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。而至于需要哪个牌子的汽车,就到哪牌子的工厂。

抽象工厂模式

在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定他们的类。每个生成的工厂都能按照工厂模式提供对象。

提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。

应用实例:假如一个汽车工厂只能制造一类型的汽车(具体工厂),而不同类型的汽车需要不同工厂去产出,则这些汽车工厂都是总工厂的(抽象工厂)的其中一个。

单例模式

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

保证一个类仅有一个实例,并提供一个访问它的全局访问点。

应用实例:一个班级只能有一个班主任。

建造者模式

一个Builder类会一步步构造最终的对象,该Builder类是独立于其他对象的。

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

应用实例:
1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的“套餐”;
2、Java 中的StringBuilder。

原型模式

实现一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,采用这种模式。

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

应用实例:
1、细胞分裂;
2、Java中的 Object clone() 方法。

2.结构型模式

适配器模式

这种模式涉及到单一的类,该类负责加入独立的或不兼容的接口功能。

将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

应用实例:
1、读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡;
2、美国电器110V,中国220V,就要有一个变压器将110V转化为220V。

装饰者模式

这种模式创建了一个装饰类,用来包装原有的类,并保持类方法签名完整性的前提下,提供了额外的功能。

动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。

应用实例:
1、孙悟空有72变,当他变成"庙宇"后,他的根本还是一只猴子,但是又有了庙宇的功能;
2、将一个形状装饰上不同的颜色,同时又不改变形状。
3、IO流中BufferInputStream() …

代理模式

在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。

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

应用实例:
1、Windows里面的快捷方式;
2、买火车票不一定在火车站买,也可以去代售点;
3、一张支票或银行存单是账户中资金的代理。支票在市场交易中用来代替现金,并提供对签发人账号上资金的控制;
4、Spring AOP。

外观模式

这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。

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

应用实例:
以抽屉问题为例,假设我们把文件放在了第二个抽屉里面,而第二个抽屉的钥匙放在了第一个抽屉里面。假如是n个抽屉呢?客户要取出这个文件,客户不需要知道取钥匙的过程。他们只需要一个按钮,然后文件就会被取出。

桥接模式

这种模式涉及到一个作为桥接的接口,使得实体类的功能能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。

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

应用实例:
以OA系统中的消息处理的实际情况为例,业务类型包含:普通消息、加急消息、特急消息;发送消息方式包含:站内消息、手机消息、邮件。这是两个维度,当一个维度发生变化时,肯定会引起另一个维度的变化,所以为了程序的扩展性,需要将两个维度分开。

组合模式

这种模式创建了一个包含自己对象组的类,改类提供修改相同对象组的方式。

将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

应用实例:
1、算术表达式包括操作数、操作符和另一个操作数,其中,另一个操作数也可以是操作数、操作符和另一个操作数。
2、实现文件系统的“文件/目录”结构

享元模式

享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。

运用共享技术有效地支持大量细粒度的对象。

应用实例:
1、Java中的String,如果有则返回,如果没有则创建一个字符串保存在字符串缓存池里面;
2、数据库的数据池。
3、咖啡店有几种口味的咖啡,拿铁、摩卡、卡布奇诺…如果店家接到订单要十几杯咖啡,显然咖啡的口味可以设置为共享的,而不必每一杯单独生成。

3.行为型模式

策略模式

在策略模式中,我们创建表示各种策略对象和一个行为随着策略对象改变而改变的context对象。策略对象改变context对象的执行算法。

定义一系列的算法,把他们一个个封装起来,并且使它们可相互替换。

应用实例:
1、诸葛亮的锦囊妙计,每一个锦囊就是一个策略;
2、旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。

模板方法模式

在模板方法模式中,一个抽象类公开定义了执行它的方法/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

应用实例:
1、在造房子的时候,地基、走线、水管都一样,只有在建筑的后期才有加壁橱加栅栏等差异;
2.Thread类的run()方法和start()方法

观察者模式

当对象存在一对多关系时,则使用观察者模式。比如,当一个对象被修改时,则会自动通知他的依赖对象。

定义对象间一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到并被自动通知。

应用实例:
1、聊天室程序的,服务器转发给所有客户端
2、网络游戏(多人联机对战)场景中,服务器将客户端的状态进行分发
3、Servlet中,监听器的实现

迭代器模式

这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。

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

应用实例:JAVA中的iterator

责任链模式

这种模式给与请求的类型,对请求的发送者和接受者进行解耦,通常每个接受者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,以此类推。

避免请求发送者与接受者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。

应用实例:红楼梦中的"击鼓传花"

命令模式

请求以命令的形式包裹在对象中,并传给调用者对象。调用对象寻找可以处理该命令的合适的对象,并把命令传给相应的对象,该对象执行命令。

将一个请求封装成一个对象,从而使得可以用不同的请求对客户进行参数化。

应用实例:
电视机是请求的接收者,遥控器是请求的发送者,遥控器上有一些按钮,不同的按钮对应电视机的不同操作。抽象命令角色由一个命令接口来扮演,有三个具体的命令类实现了抽象命令接口,这三个具体命令分别代表三种操作:打开电视机、关闭电视机和切换频道。

备忘录模式

这种模式保存一个对象的某个状态,以便在适当的时候恢复对象。

在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。

应用实例:
1、棋类游戏中的,悔棋
2、普通软件中的,撤销操作
3、数据库软件中的,事务管理中的,回滚操作

状态模式

在状态模式中,我们创建表示各种状态对象和一个行为随着状态对象改变而改变的context对象。

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

应用实例:酒店系统中,房间的状态变化:已预订、已入住、空

访问者模式

这种模式主要是将数据结构与数据操作分离。

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

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

中介者模式

这种模式是用来降低多个对象和类之间的通信复杂性,提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。

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

应用实例:
假如没有总经理。下面三个部门∶财务部、市场部、研发部。财务部要发工资,让大家核对公司需要跟市场部和研发部都通气;市场部要接个新项目,需要研发部处理技术、需要财务部出资金。市场部跟各个部门打交道。虽然只有三个部门,但是关系非常乱。
实际上,公司都有总经理。各个部门有什么事情都通报到总经理这里,总经理再通知各个相关部门。这就是一个典型的“中介者模式”总经理起到一个中介、协调的作用

解释器模式

这种模式实现了一个表达式接口,该接口解释一个特定的上下文,这种模式被用在SQL解析、符号处理引擎等。

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

应用实例:编译器、运算表达式计算。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值