装饰者模式可以使用对象组合的方式,做到在运行时装饰类,能够在不修改任何底层代码的情况下,给对象赋予新的职责。本章可以称为:给爱用继承的人一个全新的设计眼界。下面我们就来学习下这个模式。
场景描述
书中描述了一个制作饮料的场景,比如星巴克的咖啡,制作一杯咖啡可以加其他配料,而最终的价格会根据调料的不同而不同。装饰者模式的实现方式是以咖啡为基底,使用配料装饰器来装饰,最终形成的就是一杯我们需要的咖啡。概念说不太清楚,直接看下面代码会更直观。
装饰者模式可以使用对象组合的方式,做到在运行时装饰类,能够在不修改任何底层代码的情况下,给对象赋予新的职责。本章可以称为:给爱用继承的人一个全新的设计眼界。下面我们就来学习下这个模式。
书中描述了一个制作饮料的场景,比如星巴克的咖啡,制作一杯咖啡可以加其他配料,而最终的价格会根据调料的不同而不同。装饰者模式的实现方式是以咖啡为基底,使用配料装饰器来装饰,最终形成的就是一杯我们需要的咖啡。概念说不太清楚,直接看下面代码会更直观。
观察者模式的核心是订阅、通知,是个非常有用的设计模式,我们下面就来学习下。
书中描述了一个气象数据更新的场景。大概意思是,气象站数据会不定时更新,有好几种布告板需要实时显示,而且必须可扩展,可以随时添加、删除布告板。这种情况下就可以使用到订阅通知模式了。这个场景比较简单,实现起来也不复杂,下面就直接看看代码。
最近打算巩固下设计模式,顺便记录下学习笔记,供日后查阅以及分享给需要的道友。参考书籍为《Head First设计模式》中文版,读书笔记的内容绝大部分来自书籍,同时会添加一些自己的理解。如涉及侵权行为,会立即停止更新,并删除所有所有文章。至于为什么要学设计模式,我也说不清。当你觉得自己的代码怎么写的那么蠢、那么臃肿,怎么改一个小需求到处都要改,这个时候就需要考虑下设计模式了。这本书的代码示例语言使用的是Java,这没啥好说的了,下面就直接开始学习吧。
书中使用了一个构造不同类型的鸭子的场景,一步步由浅入深地来讲解该模式,建议去读一下原著,带入感比较强。这里我们就只简述下该场景,我们要构造不同类型的鸭子,每种鸭子都有一些共有的行为;另外其中某一种鸭子可能会有特殊的行为。比如说:呱呱叫(quack),每种鸭子都会叫,但是叫声可能会不一样;飞(fly),像野鸭子会飞,普通的鸭子就不会。这种时候我们该怎样去设计一个可以扩展的鸭子模型呢。最容易想到的是,继承。写一个鸭子父类,定义两个抽象方法,子类去重写。(或者实现接口,这两种方式在策略模式面前没有本质区别)这样能暂时解决问题,但是可能会带来如下缺点:
我们在学习程序是如何执行的时候,不免会涉及到栈空间的相关知识,有些地方会通俗地说分配栈空间时,栈是向下增长的,那么这句话到底是什么意思,下面我们就以X86架构为例来看一下。
我们先来看一下向下增长的理解是什么样的,假设给执行一个方法分配的地址空间为10000~10007,栈空间如下图:
逻辑删除在项目中也是很常见的,比较常见的方式是添加一个deleted
的标记位,当然也有其他的实现方式。本章节的插件针对的是添加标记位的方式来实现逻辑删除的。如果说没有和deleted
标记位一起的唯一联合索引,那是很容易实现的,标志位只要两个值:0、1,然后通过updateByExampleSelective
修改就可以了。但是往往我们表中会有唯一索引在,比如说名字不能重复之类的。这个时候我们采取的简单的处理方式是set deleted = deleted + 1
来避免无法删除已经删除过的数据的问题。索性这个插件就提供了两个方法:logicDelete
和logicDeleteWithUIndex
。