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