设计模式
文章平均质量分 58
阿泽的学习笔记
微信公众号:阿泽的学习笔记
展开
-
设计模式入门——策略模式
OO原则:封装、继承、多态 封装:隐藏类的内部实现机制,在不影响使用者的前提下改变内部结构,同时保护了数据 继承:可以使得好东西多次被利用,同时为多态做准备 多态:方法重写、重载、动态连接构成多态性。 背景: 我们设计父类Duck并实现各种方法(如游泳swim(),呱呱叫quack(),外貌dispaly()),每个鸭子都会继承Duck来实现自己各自的方法(如不同鸭子不同的外貌)。由于业...原创 2018-07-23 15:43:12 · 177 阅读 · 0 评论 -
设计模式入门——外观模式
背景: 妹子拍照后需要修图,磨皮、瘦脸、大眼等等一系列操作,一修一个小时,急需一键美化(涵盖所有功能)。 设计: 改变接口的原因是为简化接口 最少知识原则:只和你的密友谈话。 实现:不要让太多的类耦合在一起,免得修改系统中的一部分,会影响到其他部分。 优点:省去很多维护成本,不会因为太复杂而不容易被其他人了解。 方针:只应该调用属于以下范围的方法: 该对象本身 被当作方法的参数而...原创 2018-08-03 11:29:02 · 182 阅读 · 0 评论 -
设计模式入门——适配器模式
背景: 欧洲的插座和美式的接口不同,买了美式的电脑,如何在欧洲使用,这就需要一个适配器。 设计: 不改变原来对象的接口,而实现想转换成的类型的接口。 实现: 以鸭子为例,现在有一只火鸡也想接收针对鸭子的请求。 // 鸭子接口 public interface Duck { public void quack(); public void fly(); } // 绿...原创 2018-08-03 11:05:10 · 176 阅读 · 0 评论 -
设计模式入门——复合模式(携手合作)
模式通常会被一起使用,并被组合在同一个设计解决方案中。 复合模式在一个解决方案中结合两个或多个模式,以解决一般或者重复发生的问题。 一、 首先我们想建立一个鸭子模拟器 1. 首先我们创建一个Quackable接口: // 接口 public interface Quackable { public void quack(); } 2. 其次我们再实现某些鸭子: // 标准绿头鸭...原创 2018-08-11 21:35:49 · 337 阅读 · 0 评论 -
设计模式入门——命令模式
背景: 我们需要设计一个多卡槽的遥控器来控制各种家具设备,注意会有很多厂商类,并且每个类还会有各式各样的方法。 设计: 关注点:遥控器应该知道如何解读按钮被按下的动作,然后发出正确的请求,但遥控器不需要知道这些家电自动化的细节,即将“动作请求者”从“动作的执行者”对象中解藕。 我们先来看餐厅的工作模式: 顾客生成订单并把订单交给服务员 服务员拿走订单放在柜台上通知厨师,不用关心订单内容...原创 2018-08-02 10:33:44 · 141 阅读 · 0 评论 -
设计模式入门——组合模式
背景: 继上一集俩餐厅合并了菜单之后,现在我们有想在午餐的菜单中加一份子菜单——甜点。 设计: 需要树形结构可以容纳菜单、子菜单和菜单项; 需要确定能够在每个菜单的各个项之间游走,要像迭代器一样方便; 需要更加弹性的游走,如指遍历甜点或者可以遍历餐厅的整个菜单。 实现: // 抽象类 实现菜单组件 public abstract class MenuComponent { p...原创 2018-08-06 21:57:05 · 236 阅读 · 0 评论 -
设计模式入门——迭代器模式
背景: 两个餐厅要合并啦,但是一家餐厅菜单用的是数组,另一家用的是ArrayList,两家餐厅都不想改自己的代码,因为牵一发动全身。 方案一:用一个新的菜单,将原有的两个菜单写到里面,用两个不同的循环去便利 不可行:万一再加一个菜单,是不是还要继续遍历,这样代码将难以维护、难以扩展。其次新的菜单需要知道每个菜单如何表达(如何遍历),违反了封装。 设计: 我们应该针对接口编程,而不是针对具...原创 2018-08-06 20:58:53 · 205 阅读 · 0 评论 -
设计模式入门——模版方法模式
背景: 我们要实现冲泡饮料的程序: 泡茶的过程为:1)把水煮沸 2)用沸水浸泡茶叶 3)把茶倒进杯子 4)加柠檬; 冲咖啡的过程为:1)把水煮沸 2)用沸水冲泡咖啡 3)把咖啡倒进杯子 4)加糖和咖啡。 设计: 冲饮料的过程大致一样,所以我们可以将共同的部分取出来放进基类里,不同的部分尽量抽象出来,不能抽象的就算了。 所以基类设计为: // 模版方法 void prep...原创 2018-08-06 10:58:18 · 139 阅读 · 0 评论 -
设计模式入门——单例模式
背景: 有一些对象只需要一个,比如:线程池、缓存、对话框、处理偏好设置、注册表等等。如果制造出多个实例就会导致许多问题产生,如:程序的行为异常、资源使用过量等。 设计: 私有化构造器同时定义一个类方法去初始化构造器。 实现: // 最简单的实现 public class Singleton { private static Singleton uniqueInstance; /...原创 2018-08-01 09:42:01 · 177 阅读 · 0 评论 -
设计模式入门——工厂模式(抽象工厂)
背景: 在工厂方法中,PizzaStore类依赖于所有的具体实现(所有继承它的类,需要依靠它完成实例化),故每增加一个Pizza种类,就等于让PizzaStore多了一个依赖。如果具体类改变了,就必须修改抽象类(PizzaStore),所以我们需要去减少对于具体类的依赖。 设计: 依赖倒置原则:要依赖抽象,不要依赖具体类。 实现一:PizzaStore类的强依赖主要因为它依赖每个Pizza...原创 2018-07-31 23:15:19 · 169 阅读 · 0 评论 -
设计模式入门——工厂模式(工厂方法)
背景: Pizza店开始允许加盟,在推广SimpleFactory时,你发现加盟店的缺采用了你的工厂创建pizza,但其他部分却开始采用他们自创的流程,烘烤方法有差异,不需要切片,使用其他厂商的盒子。 我们想建立一个框架,把加盟店和创建比萨捆绑在一起又保持一定的弹性。 SimplePizzaFactory代码,制作pizza的代码绑在PizzaStore里,这么做没有弹性(不能在制作Pizz...原创 2018-07-31 11:12:00 · 164 阅读 · 0 评论 -
设计模式入门——工厂模式(简单工厂)
背景: 前面提到,我们不应该针对实现编程,而应该针对接口编程,但我们每次new一个对象时,都是在针对实现编程。 Duck duck = new MallardDuck(); 我们使用了接口让代码更具有弹性,但是还是得建立具体的实例,当有一堆相关具体类时,通常会写出这样的代码: Duck duck; if (picnic) { duck = new MallardDuck(); ...原创 2018-07-31 10:21:43 · 180 阅读 · 1 评论 -
设计模式入门——装饰者模式
背景: 买咖啡的订单系统,所有的饮品都要继承Beverage抽象类,在购买饮品时也可以加入其他配料(如豆浆、摩卡、奶泡等)。 方案一:在Beverage中添加配料的布尔值,并通过set、get方法获取,利用cost方法计算总体价格。 不可行:如果要添加新配料的话或者改价格需要修改原先代码,且没办法买双倍的配料(用int计算调料数) 设计: 原则一:类应该对扩展开发,对修改关闭。 实现一...原创 2018-07-24 13:20:19 · 193 阅读 · 0 评论 -
设计模式入门——观察者模式
背景: 气象站可以获取到新的气象数据,WeathData类用来追踪来自气象站的数据,并更新布告板,布告板用与显示布告信息。一旦WeatherData有新的测量会立即执行measurementsChanged()方法,布告马上会更新。 方法一:直接在measurementsChanged()方法中写代码用于更新布告板的数据 不可行: 要实现接口编程而不是具体实现编程 无法动态增删布告板 ...原创 2018-07-23 22:30:17 · 165 阅读 · 0 评论 -
设计模式入门——状态模式
背景: 糖果机有四种状态——有钱、没钱、售出糖果、糖果售完,客户有四种行为:投钱、退钱、转动曲柄、发放糖果。现在需要设计一个能够尽量有弹性而且好维护的控制器。 方案一:创建四个方法对应客户四种行为,并用if/esle语句判断糖果机的状态,以执行不同回应。 不可行:一旦多增加一个状态(如玩游戏),则需要修改全部方法,不符合“对修改关闭,对扩展打开”原则;不符合面向对象原则。 设计: 定义一...原创 2018-08-08 14:41:30 · 224 阅读 · 0 评论