当前位置: 首页 > news >正文

面向对象之设计模式大全

面向对象基本概念

三大特性:封装-继承-多态

一些相关的重要概念:抽象-组合-动态绑定-消息传递

由面向对象基本特性得来的设计模式包括四类几十种,如下所示:

A.设计原则

  • OCP-开放封闭原则:开放扩展,封装更改
  • LSP-里氏代换原则:子类必须能够替换其父类
  • DIP-依赖倒转原则:抽象不应依赖细节,细节应依赖抽象(面向接口)
  • ISP-接口隔离原则:一个类对另外一个类的依赖应当建立在最小的接口上
  • CARP-合成/聚合复用原则:尽量使用合成/聚合,尽量不要使用继承(因继承是强偶合)
  • LoD-迪米特法则:若两个类不必直接通信,则不应直接交互。成员该私有要私有
  • SRP-单一职责原则:就一个类而言,应该仅有一个引起它变化的原因

B.创建型模式

  • 简单(静态)工厂模式:由一个工厂对象决定创建出哪种实例
  • 工厂方法模式(虚拟构造子模式/多态性工厂模式):定义一个创建实例对象的工厂接口,将实际创建工作推迟到子类中。
  • 抽象工厂模式:最为抽象最具一般性,向客户端提供一个接口,使客户端在不必指定实例的具体类型的情况下创建多个实例族的实例对象。
  • 单例模式:只能得到一个对象实例,构造方法私有。
  • 建造者模式:将复杂对象的构建与其表示分开,使同样的构建过程可以创建不同的表示。
  • 原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象

C.结构型模式

  • 适配器模式:将一个接口转换成客户希望的另一个接口
  • 缺省适配模式:为接口提供缺省实现以供扩展。使得子类只需覆盖这个缺省实现的个别方法,而无须去实现中的每个方法。JDK1.8中了提供了为接口添加默认实现的新特性
  • 组合(部分-整体)模式:将对象组合成树形结构以表示“部分-整体”的层次结构
  • 装饰器模式:动态给对象添加额外职责,比通过生成子类来增加功能更加灵活
  • 代理模式:提供代理以控制对原对象的访问。关键:代理与原对象共用一个接口
  • 享元模式:运用共享技术有效地支持大量的细粒度对象
  • 外观(门面)模式:为一组接口提供一个一致的接口,体现了DIP和LoD原则
  • 桥接模式:将抽象部分与其实现部分分离,使它们都可以独立变化,可实现多角度分类

D.行为型模式

  • 不变模式:对象在创建之后就不在变化
  • 策略模式:定义一系列形式相同实现不同的算法,减少耦合,封装变化
  • 模板方法模式:定义一个操作中算法的骨架,而将一些具体步骤延迟到子类
  • 观察者模式(发布-订阅模式):定义一种一对多的依赖关系,让多个观察者对象同时监听某一个通知者对象
  • 迭代器模式:提供顺序访问一个聚合中元素的方法。不常用,因为语言本身已内置
  • 职责链模式:使多个对象都有机会获得机会处理请求。这些对象连成一条链。减少请求得与接收者的耦合。如过滤器
  • 命令模式:将请求封装成一个对象,以使你可用不同的请求对客户端进行参数化;可对请求进行排除、记录日志、或撤销操作
  • 备忘录模式:在不破坏封装的前提下捕获一个对象的内部状态,并在该对象外部保存此状态
  • 状态模式:当一个状态改变时,允许改变其行为,看其来像是改变了其类。(将复杂的条件判断转移到多个小类中)
  • 访问者模式:表示一个作用于某对象结构中的各元素的操作。把数据处理与数据结构分开
  • 解释器模式:对一个语言定义一个文法的表示,并定义一个解释器,来解释语言中的句子,如正则表达式,浏览器。通过解释执行
  • 中介者(调停者)模式:用一个中介对象来封装一系列的对象交互。应用于星形结构的对象关系中

转载于:https://www.cnblogs.com/yepei/p/5650453.html

相关文章:

  • 关于win10配置MAVEN问题
  • php进阶整理
  • Bootstrap速学教程之简要介绍
  • CentOS如何查看端口是被哪个应用/进程占用
  • MFT的0x10标准属性数据结构
  • 一个简单的AXIS远程调用Web Service示例
  • 用五种以上的方式调试php
  • 使用System.Drawing.Imaging.dll进行图片的合并
  • Java中Collection和Iterator接口
  • ubuntu之修改ls显示颜色
  • FindBugs规则整理
  • python的加密模块(md5,sha,crypt)学习
  • bond安装
  • javascript中的数据类型转换
  • 【转】MySQL5.5的my.cnf 参数详解
  • 【React系列】如何构建React应用程序
  • 77. Combinations
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • Computed property XXX was assigned to but it has no setter
  • django开发-定时任务的使用
  • es的写入过程
  • gitlab-ci配置详解(一)
  • Git初体验
  • JavaScript的使用你知道几种?(上)
  • javascript数组去重/查找/插入/删除
  • jdbc就是这么简单
  • JWT究竟是什么呢?
  • learning koa2.x
  • Shadow DOM 内部构造及如何构建独立组件
  • vue:响应原理
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • 构造函数(constructor)与原型链(prototype)关系
  • 如何编写一个可升级的智能合约
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • ​第20课 在Android Native开发中加入新的C++类
  • #Linux(帮助手册)
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • (AngularJS)Angular 控制器之间通信初探
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (附源码)计算机毕业设计ssm电影分享网站
  • (十一)手动添加用户和文件的特殊权限
  • (一)appium-desktop定位元素原理
  • (正则)提取页面里的img标签
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .net 调用php,php 调用.net com组件 --
  • .Net 中Partitioner static与dynamic的性能对比
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • .net专家(高海东的专栏)
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面