14种设计模式
- 策略模式( Strategy )
定义个策略接口,不同的实现类提供不同的具体策略算法, 同时它们之间可以互相替换.
IStrategy 接口定义了策略方法,Strategy1 和 Strategy2 通过实现 IStrategy 提供不同的策略,而 User 组合了 IStrategy ,可以通过给 User 对象设置不同具体实现类来让其获得不同的策略
- 简单工厂模式( Simple Factory )
定义一个用以创建对象的工厂, 根据不同的条件生成不同的对象
注意简单工厂模式与策略模式是不同的,工厂模式是根据给定的条件返回相应的对象,而策略模式是将不同的策略对象传递给使用者以实现不同策略,(好吧,我差点分不清了)详细不同点分析可转这里
- 工厂模式( Factory )
针对每一种产品提供一个工厂类,通过不同的工厂实例来创建不同的产品实例
与简单工厂模式不同点是它要为每一种产品提供一个工厂类,不同工厂类实现同一个工厂接口,返回不同产品,详细分析可转这里
- 抽象工厂模式( Abstract Factory )
应对产品族概念而生
与工厂模式相比,抽象工厂模式是为了应对产品族
- 装饰者模式( Decorator )
动态的给一个对象添加一些额外的功能
ComponentImpl 和 Decorator 类都实现了 IComponent 接口,不同的是 ComponentImpl 提供了具体实现,而 Decorator 是先聚合 ComponentImpl 接着在自己的实现方法即
operation()
方法中做些处理(即装饰)后再调用 ComponentImpl 对象的具体实现
- 代理模式( Proxy )
封装被代理对象并限制外界对被代理对象的访问
注意区分装饰者模式和代理模式的区别。在代理模式中,ComponentImpl 和 Proxy 类都实现了 IComponent 接口,Proxy 对象中虽然也维护着一个 ComponentImpl 对象,但一般情况下它是代理类自己初始化的,不像装饰者模式是通过
set
进去的,同时在接口方法即operation()
中代理对象会限制外界对被代理对象的访问,而装饰者模式是装饰者给被装饰者添加额外的行为,详细不同点分析可转这里
- 模板方法模式( Template )
定义一个操作的算法骨架, 并将一些步骤延迟到子类中
AbsTemplate 抽象类中定义了一系列的方法,其中外界唯一能调用的
operation()
方法是 final 的(即不可重写),在该方法中分别调用了first()
、second()
、third()
方法(即搭好算法框架),子类通过继承抽象类重写不同的方法来添加各自的行为
- 外观模式( Facade )
为系统向外界提供一个统一的接口
Fracade 为 ComponentA 、ComponentB 、ComponentC 向外即 ClientA 、ClientB 提供统一的接口
- 适配器模式( Adapter )
将一个类的接口转换成客户希望的另一个接口
比如项目引入第三方类库后应该先封装起来转换成自己需要的接口再使用,防止以后类库出现变更。AdapterA 先将 LibraryClass 封装起来,其对外提供的
operation()
方法中调用 LibraryClass 对象的方法,若以后换类库,只需改 AdapterA 类或者创建新的 Adapter 实现类即可
- 桥接模式( Bridge )
将抽象部分与实现部分分离,使它们都可以独立的变化
将原本要耦合的上下层抽象出来,上层和下层以组合的方式连接,然后上下层抽象可派生出许多不同方向的子类。AbsShape 封装了 IDrawProgram 接口,这样它的子类想从 DPA 切换到 DPB 或者别的,只需
set
进去就行啦(你看,这 UML 图多像座桥)
注: 适配器、桥接与外观三模式之间关系
- 建造者模式( Builder )
将一个复杂对象的构建与它的表示分离.
作为 Product 的内部类,Builder 统一了 Product 的整个构建过程,同时在
build
过程中,可以由于set
值顺序不同等原因产生不同的效果
- 观察者模式( Observer )
定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象,在它的状态发生变化时,会通知所有的观察者.
先将 Observer 注册到 Observable ,那么当 Observable 状态改变时会通知它持有的所有 Observer ,对了,最好 Observable 中的 mList 的泛型是
WeakReference<Observer>
,防止内存泄漏
- 单例模式( Singleton )
保证一个类仅有一个实例,并提供一个访问它的全局控制点.
下图是利用 Java 的语言特性实现的线程安全且能延迟初始化的单例模式,Singleton 中维护着静态私有的 SingleHolder 类, SingleHolder 类中持有个静态常量 sHolder ,Client 若通过 getSingleInstance 方法获取 Singleton 对象则直接返回 SingleHolder 类的 sHolder ,详细分析可转这里
- 命令模式( Command )
将一个请求封装成为一个对象, 使可以用不同的请求对客户进行参数化
Action 封装了具体行为,Command 封装了 Action 并提供空方法
execute()
,它的子类通过重写该方法可在方法里调用 mAction 不同行为达到封装命令的目的,最后 Client 封装了一系列的 Command 对象,并可以通过notify()
方法一个接着一个调用所持有 Command 对象们的execute()
方法达到给 Action 传达命令的目的
抄自链接:https://www.jianshu.com/p/bdf65e4afbb0
原文地址:https://www.cnblogs.com/cheng6018/p/12789567.html
- 3713: [PA2014]Iloczyn
- 洛谷P3195 [HNOI2008]玩具装箱TOY(单调队列优化DP)
- SQL Server 深入解析索引存储(下)
- 2751: [HAOI2012]容易题(easy)
- codevs3002 石子归并 3
- 算法模板——计算几何2(二维凸包——Andrew算法)
- 算法模板——splay区间反转 2
- 算法模板——Dinic网络最大流 2
- 1935: [Shoi2007]Tree 园丁的烦恼
- 1339 / 1163: [Baltic2008]Mafia
- 4010: [HNOI2015]菜肴制作
- 4052: [Cerc2013]Magical GCD
- ElasticSearch搜索引擎在SpringBoot中的实践
- 2292: 【POJ Challenge 】永远挑战
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- WPF 启动屏幕键盘
- dotnet 里的那些锁 AutoResetEvent 用法
- MySQL是如何实现事务的ACID
- 白话K8S核心组件概念
- k8s 架构、基本概念及命令
- Java API 连接 Hbase示例
- 点线图和阶梯图的画法
- 添加直线的两种方式
- nginx fastcgi模块ngx_http_fastcgi_module详细解析、使用手册、完整翻译
- Chrome代码调试指南
- Maven安装与配置
- CentOS7安装elk,并监控Nginx的access.log日志
- Aria2 + Rclone 实现离线下载 | 完美脚本配置 | 解决无法上传问题
- alpine使用的避坑指南
- elasticSearch学习(八)