设计模式入门学习
ffengz
恰如猛虎卧荒丘,潜伏爪牙忍受。他日若遂凌云志,敢笑黄巢不丈夫。
展开
-
状态模式
一句话定义一个类的内在状态发生改变引起行为发生改变,即 不同的状态 对应 不同的行为。使用场景1. 一个对象的行为由所在的状态决定,状态改变行为也发生改变2. 一个类含有大量类似的if-else进行状态判断实现要点1. 将具体的状态类抽象出来2. 具体状态类中方法名相同,实现不同3. 通过改变设置状态类,达成对行为的修改情景假设页面提供分享和转发按钮功能,在已登陆情况下可以使用,未登录的原创 2016-12-26 15:24:47 · 327 阅读 · 0 评论 -
模版模式
一句话定义定义操作的算法框架,将具体实现步骤延迟到子类实现,使得子类可以不改变结构算法而改变特定的步骤。使用场景1. 多个子类含有相同逻辑方法,能够提出2. 重要、复杂算法,提出成模版模式实现要点1. 具体流程方法抽象出来2. 流程操作定义为final方法,杜绝子类操作情景假设把大象放入冰箱,分为几个步骤?实现步骤1. 创建放入冰箱模版,规定执行步骤以及顺序/** * 模版抽象类原创 2017-02-14 17:40:05 · 277 阅读 · 0 评论 -
中介者模式
一句话定义在多个对象关系交错复杂的情况中,提供中介类进行关系处理,降低类之间的耦合使用场景1. 多个类关系复杂、交错2. 使用中间类进行处理,形成星状结构实现要点1. 将所有交互集中到中介者2. 交互对象不互相依赖情景假设张三趁着房价上涨买房,新房限购只能购买暂时不限购的二手房,同时委托中介进行处理,中介就需要处理购房者、卖房者(李四)、贷款银行三者的交互,而三者不互相交互,所有的相关事宜原创 2017-03-29 17:16:56 · 470 阅读 · 0 评论 -
代理模式
一句话定义为其他对象提供代理方式控制这个对象的访问。使用场景1. 不能或不想直接访问某个对象2. 对一个类的访问增加控制实现要点1. 代理对象和代理实现同一个接口2. 添加中间层进行控制情景假设代理上网,包含真实上网的对象和代理上网者。实现步骤1. 共同接口,包含共同基本功能/** * 上网接口 * * @author fengzhen * @version 1.0, 2017原创 2017-03-30 13:48:01 · 337 阅读 · 0 评论 -
组合模式
一句话定义又叫部分整体模式,将树形结构的每一个节点作为对象,组合成为整个树形结构。使用场景树形结构,分层分组的情况。各个元素节点具有类似的属性。实现要点1.所有的节点实现同一个接口,内部并组合该接口2.安全的组合模式元素抽象只包含简单共同结构,根、叶具体逻辑自己实现3.透明的组合模式元素抽象机构完全一致,根、叶在内部判断子节点类型情景假设实现一个简单树型结构。这里使用透明的组合模式。原创 2017-05-22 15:11:35 · 221 阅读 · 0 评论 -
适配器模式
一句话定义作为两个不兼容的接口或对象的中间层桥梁使用场景1.需要使用现有的类,但又不符合使用的条件2.需要一个统一的输出接口,而输入类型不可预知,类似listview3.创建可以使用的类,应对没有关联的一些类实现要点适配器继承或依赖已有的对象,实现想要的目标接口。情景假设GTX10系显卡不支持VGA接口,需要一个VGA转HDMI的转换线,即适配器。实现步骤1.创建VGA接口/** *原创 2017-05-23 16:55:08 · 260 阅读 · 0 评论 -
装饰模式
一句话定义动态的为一个对象添加额外的功能职责,不成为其子类使用场景对类的功能进行扩展,又不想直接成为子类实现要点1、本质类提出抽象角色,不应该具体实现。 2、修饰类引用和继承抽象类,具体扩展类重写父类方法。情景假设洗了一张自拍照需要对这张照片进行装饰。比如封胶、加框之类实现步骤1.创建抽象照片类,定义照片的基本/** * 照片抽象类 * * @author fengzhen *原创 2017-05-24 14:44:26 · 275 阅读 · 0 评论 -
享元模式
一句话定义运用共享技术有效地支持大量细粒度的对象。使用场景1.系统有大量相似的对象2.需要缓冲池实现要点1.创建工厂加以控制,使用HashMap存储2.注意划分可变外部状态和固化内部状态情景假设卖出火车票,火车票拥有起点、终点的固化状态,车厢的外部状态。不可能每一次卖出车票都new一个。实现步骤1.创建共享元的接口/** * 车票接口 * * @author fengzhen原创 2017-05-25 17:56:07 · 464 阅读 · 0 评论 -
外观模式
一句话定义隐藏系统复杂性,提供统一的接口访问。使用场景功能模块比较单一,提供外部接口访问。第三方的SDK很常见,例如ImageLoader等。实现要点1.在调用者与复杂系统之间添加外观层2.外观类与复杂系统耦合3.外观持有复杂系统的接口类情景假设实现拍照、上网、电话的功能,通过手机统一封装直接使用。否则需要一个拍照设备,上网设备,电话设备。实现步骤1.创建复杂系统功能模块接口/**原创 2017-05-31 16:41:27 · 248 阅读 · 0 评论 -
观察者模式
一句话定义定义对象间一对多的依赖关系,状态发生改变所有依赖的对象都会收到通知并自动更新。使用场景1. 事件多级触发2. 一个对象改变引起一系列改变发生。实现要点1. 将观察者和被观察者几乎完全解耦,弱化依赖关系2. 避免循环调用情景假设简单的观察模式,被观察者绑定多个观察者,被观察者发出通知,通知所有观察者发生改变。实现步骤1. 创建抽象观察者类,提供自我更新方法接口/** * 抽象原创 2017-02-09 16:41:22 · 152 阅读 · 0 评论 -
桥接模式
一句话定义将多纬度进行分离,使能够独立的各自变化。如抽象和实现分离使用场景一个类存在多个需要扩展的的维度实现要点1.抽象类依赖实现2.不同的子类、不同的实现类,分别实现扩展情景假设进行基金定投,投入金额可扩展,投的基金也是动态的,这里就可以使用桥接模式。实现步骤1.创建金额接口/** * 金额接口 * * @author fengzhen * @version 1.0, 2017原创 2017-06-01 13:53:48 · 213 阅读 · 0 评论 -
迭代器模式
一句话定义提供方法顺序访问容器(Array、List...)的元素,同时不暴露对象内部细节。使用场景容器对象需要遍历,同时不暴露内部。实现要点1. Iterator:迭代器接口,定义访问和遍历元素的接口。2. ConcreteIterarot:具体迭代器,遍历,并保存当前位置。3. Container:容器接口,创建迭代器接口。4. ConcreteContainer:具体容器。情景假设原创 2017-02-13 16:42:53 · 159 阅读 · 0 评论 -
备忘录模式
一句话定义在对象外保存对象的状态,且不破坏封闭,方便恢复保存状态。使用场景1. 需要保存对象状态,方便恢复2. 通过中间对象间接的提供内部状态的访问实现要点1. 提供中间实体类,只负责储存数据情景假设游戏状态包括生命、魔法、关卡三种状态,用户退出进行保存,下次游戏读取存档。实现步骤1. 创建备忘录,只保存数据。/** * 游戏备忘录 * 生命、魔法、关卡 三个属性数据 * *原创 2017-02-10 16:28:02 · 157 阅读 · 0 评论 -
策略模式
一句话定义:定义一系列算法并单独封装,使他们可以相互替换。使用场景:1. 不同的类实现方式不同,通过直接行为进行区分2. 之间具有内在的相似联系实现要点:1. 实现同一个接口2. 每一个方法封装成一个类情景假设:放春节有很多种回家的方式,火车、汽车、飞机,每一种方式都对应一种策略。实现步骤:1. 创建策略接口/** * Created by ffengz. * * 回家策略接口原创 2016-12-23 18:27:28 · 362 阅读 · 0 评论 -
抽象工厂模式
一句话定义定义一个 创建 一系列相关或相互依赖对象 的接口,而不指定具体类。使用场景具有多个相关的类型,且只会使用其中之一。实现要点1. 在一个工厂里面聚合多个同类产品2. 主要解决接口选择问题3. 实际就是工厂模式的工程模式,一个生产工厂的工厂。情景假设每一个图形都有 形状 和 颜色 两个属性,通过不同的搭配,生产不同的图形。实现步骤1. 创建形状和颜色的接口/** * 形状接口类原创 2016-12-19 17:47:54 · 269 阅读 · 0 评论 -
工厂方法模式
一句话定义:定义一个用于创建对象的接口,让其子类决定实例化哪个工厂类,将创建延迟到子类进行。使用场景:1. 复杂的对象的创建2. 明确知道不同条件创建不同的对象实现要点:1. 子类实现工厂接口,返回的也是一个抽象的产品2. 创建过程在子类执行情景假设:工厂模式的常见例子。汽车工程,能够生产奥迪和宝马两种汽车。实现步骤:1. 创建汽车抽象类 /* * 汽车工厂 汽车抽象类 */p原创 2016-12-17 14:14:15 · 319 阅读 · 0 评论 -
单例模式
一句话定义:确保一个类只有**自我创建**的**单独实例**并提供接口**供整个系统使用**。使用场景:避免产生多个对象消耗过多的资源(类似数据库的连接);某种类型的对象有且只有一个类型(生成唯一序列号)。实现要点:1. 构造函数私有2. 线程安全原创 2016-12-15 11:21:29 · 217 阅读 · 0 评论 -
建造者模式
一句话定义:将复杂对象的构建与表示分离,同样的构建过程可以创建不同的具体表示。使用场景:1. 相同的方法,不同的执行顺序,产生不同的结果;2. 基本部件不发生改变,有很多默认参数,组合顺序常常发生改变。实现要点:1. 将变与不变分离;2. 创建者:创建提供实例;3. 管理者:管理创建出实例的依赖关系。4. 相比工厂模式,更加关注装配的顺序细节。情景假设:模拟一份快餐(meal)的产出过原创 2016-12-15 19:34:01 · 304 阅读 · 0 评论 -
原型模型
一句话定义用原型实例制定创建类型的种类,通过拷贝原型创建新对象。使用场景1. 类的初始化需要消耗很多资源,通过原型拷贝避免消耗。2. 通过new 创建需要繁锁初始化数据以及需要权限。3. 一个对象需要提供给其他对象访问、修改。实现要点1. 通过对现有对象拷贝生成新对象;2. 浅拷贝实现Cloneable接口,克隆;3. 深拷贝实现Serializable接口,读取二进制流。情景假设首先原创 2016-12-16 15:00:12 · 757 阅读 · 0 评论 -
责任链模式
一句话定义将请求发送给请求处理链,请求在链上传递,链上的每个节点都可以进行处理,实现发送者和接收者解耦。使用场景1. 多个对象处理同一个请求,根据请求状态进行处理2. 动态指定一组对象处理,不清楚具体的处理对象3. 需要对请求进行层层过滤、筛选实现要点1. 多个节点实现(继承)同一个接口(父类)2. 节点聚合接口(父类)自己,通过set方法设置下一个传递情景假设上学期间自习课偷传小纸条。原创 2016-12-27 17:11:11 · 330 阅读 · 0 评论 -
解释器模式
一句话定义:定义一个解释器,将固定格式的文本固定解释,来解释对应的语句。使用场景:1. 特定问题高频发生,将该领域的问题转化为对应的语句2. 简单语言需要解释执行,可表示为抽象语法树(简单的加减运算)实现要点:1. 构件语法树,定义终结符与非终结符。2. 构件环境类,包含解释器之外的一些全局信息,一般是 HashMap。3. 将复杂的问题简单化、模块化、分离实现、解释执行,方便进行扩展情原创 2017-01-05 16:38:48 · 323 阅读 · 1 评论 -
命令模式
一句话定义:将一系列操作请求封装成一个命令对象,用户使用不同请求操作,支持记录、撤销等操作。使用场景:1.需要对行为进行记录、撤销或重做、事务等处理时2.行为请求者与行为实现者通常是一种紧耦合的关系需要解耦时实现要点:1.定义三个角色:received:真正的命令执行对象;Command:命令;invoker 使用命令对象的入口2.通过命令调用类调用接收者接收命令。调用者→接受者→命令3.原创 2017-02-07 17:06:19 · 207 阅读 · 0 评论 -
访问者模式
一句话定义封装-对于某种数据结构中数据的操作或访问-成为访问者,此访问者能够在不改变数据结构的情况下进行数据访问使用场景1. 数据结构稳定,但是数据的操作时常发生变化2. 对同一数据结构进行互不相关的操作实现要点1. 定义Visitor抽象接口,给出对数据的操作方法接口2. 在数据结构中添加访问接收方法,传入自身情景假设春节返岗,公司组织相亲团队互相查看成员信息。实现步骤1. 创建访问者原创 2017-02-17 10:53:14 · 292 阅读 · 0 评论 -
WindowManager——悬浮在所有app之上
目标WindowManager效果实现目标类似于某鱼、某猫直播平台的悬浮窗功能,能够在APP切换到后台后进行播放直播。 是不是很酷炫? WindowManager很简单就能实现将一个View悬浮在系统上。WindowManagerWindowManaget是Android最重要的服务之一,WindowManager是全局唯一的。 其将View和屏幕联系起来,用户的交互操作也传递给它,作为桥原创 2017-07-14 19:11:09 · 5799 阅读 · 1 评论