【设计模式】纸上谈兵之设计模式导论

最近很闲,打算随便重温下设计模式,虽然是个CRUD掏粪咸鱼,但是人还是要有点理想不是?

GOF

在1994年,由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 四人合著出版了一本名为 Design Patterns - Elements of Reusable Object-Oriented Software(中文译名:设计模式 - 可复用的面向对象软件元素) 的书,该书首次提到了软件开发中设计模式的概念。

设计模式总览

创建型模式(Creational Patterns)

创建型模式关注点:怎样创建出对象?
将对象的创建和使用相分离,降低了系统耦合性。
使用者无需关注对象的创建细节:

  • 对象的创建由相关的工厂来完成(各种工厂模式
  • 对象的创建由一个建造者来完成(建造者模式
  • 对象的创建由原来对象克隆完成(原型模式
  • 对象始终在系统中只有一个实例(单例模式
结构型模式(Structural Patterns)

结构型模式关注点:怎样组合对象/类?

  • 类结构型模式(类的组合),由多个类可以组合成一个更大的(继承)
  • 对象结构型模式(类与对象的组合),通过关联关系在一个类中定义另一个类的实例对象(组合)

根据“合成复用原则”,在系统中尽量使用关联关系来替代继承关系,因此大部分结构型模式都是对象结构型模式。

  • 适配器模式(Adapter Pattern):两个不兼容接口之间适配的桥梁
  • 桥接模式(Bridge Pattern):相同功能抽象化与实现化解耦,抽象与实现可以独立升级。
  • 过滤器模式(Filter、Criteria Pattern):使用不同的标准来过滤一组对象
  • 组合模式(Composite Pattern):相似对象进行组合,形成树形结构
  • 装饰器模式(Decorator Pattern):向一个现有的对象添加新的功能,同时又不改变其结构
  • 外观模式(Facade Pattern):向现有的系统添加一个接口,客户端访问此接口来隐藏系统的复杂性。
  • 享元模式(Flyweight Pattern):尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象
  • 代理模式(Proxy Pattern):一个类代表另一个类的功能
行为型模式(Behavioral Patterns)

行为型模式关注点:怎样运行对象/类

  • 行为型模式用于描述程序在运行时复杂的流程控制,
  • 描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。
  • 行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。

  • 模板方法(Template Method)模式:父类定义算法骨架,某些实现放在子类
  • 策略(Strategy)模式:每种算法独立封装,根据不同情况使用不同算法策略
  • 状态(State)模式:每种状态独立封装,不同状态内部封装了不同行为
  • 命令(Command)模式:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开
  • 职责链(Chain of Responsibility)模式:所有处理者封装为链式结构,依次调用
  • 备忘录(Memento)模式:把核心信息抽取出来,可以进行保存
  • 解释器(Interpreter)模式:定义语法解析规则
  • 观察者(Observer)模式:维护多个观察者依赖,状态变化通知所有观察者
  • 中介者(Mediator)模式:取消类/对象的直接调用关系,使用中介者维护
  • 迭代器(Iterator)模式:定义集合数据的遍历规则
  • 访问者(Visitor)模式:分离对象结构,与元素的执行算法

除了模板方法模式和解释器模式是类行为型模式,其他的全部属于对象行为型模式

设计模式和组件生命周期

在这里插入图片描述

设计的7大原则

开闭原则(Open Closed Principle,OCP)
  • 软件实体应当对扩展开放,对修改关闭
    Software entities should be open for extension,but closed for modification
  • 合成复用原则、里氏替换原则相辅相成,都是开闭原则的具体实现规范
  • 简单理解:扩展新类而不是修改旧类
里氏替换原则(Liskov Substitution Principle,LSP)
  • 继承必须确保超类所拥有的性质在子类中仍然成立
    Inheritance should ensure that any property proved about supertype objects also holds for subtype objects
  • 简单理解:继承父类而不去改变父类
依赖倒置原则(Dependence Inversion Principle,DIP)
  • 高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象
    High level modules shouldnot depend upon low level modules.Both should depend upon abstractions.Abstractions should not depend upon details. Details should depend upon abstractions
单一职责原则(Single Responsibility Principle,SRP)
  • 一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分
    There should never be more than one reason for a class to change)
  • 简单理解:每个类只负责自己的事情,而不是变成万能
接口隔离原则(Interface Segregation Principle,ISP)
  • 一个类对另一个类的依赖应该建立在最小的接口上
    The dependency of one class to another one should depend on the smallest possible interface)
  • 简单理解:各个类建立自己的专用接口,而不是建立万能接口
迪米特法则(Law of Demeter,LoD)
  • 最少知识原则(Least Knowledge Principle,LKP)
  • 只与你的直接朋友交谈,不跟陌生人说话
    Talk only to your immediate friends and not to strangers)
合成复用原则(Composite Reuse Principle,CRP)
  • 又叫组合/聚合复用原则(Composition/Aggregate Reuse Principle,CARP)
  • 软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现
  • 简单理解:优先组合,其次继承
小结

1. 对接口编程而不是对实现编程。
2. 优先使用对象组合而不是继承。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

总在寒冷清秋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值