自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(15)
  • 收藏
  • 关注

原创 复合模式2:MVC模式

目录 1. 简单认识MVC模式 2. 深入一点观察 3. 再深入一点 4. 利用MVC模式解决实际问题 5. 适配模式、 6. MVC与Web 1. 简单认识MVC模式 我们简单看一下一个MP3播放器的MVC模式 2. 深入一点观察 视图:用来呈现模型、视图通常直接从模型中取得它需要显示的状态与数据; 控制器:取得用户的输入并解读其对模型的意思; 模型:持有所有的数据,状态和程序逻辑,模型没有注意到视图和控制器,虽然提供了操纵和检索状态的接口,并发送状态改变通知给观察者。

2020-11-17 20:24:07 364

原创 复合模式1:简单的复合模式

复合模式在一个解决方案中结合两个或多个模式,以解决一般或重复发生的问题。 1. 面向接口编程 2. 适配器加入 3. 装饰器加入 4. 抽象工厂加入 5. 组合加入 6. 观察者加入 1. 面向接口编程 2. 适配器加入 当鸭子出现的附近,鹅也应该在附近,我们设计了一个鹅类 鹅其实是和鸭子差不多的,我们想在所有使用鸭子的地方使用鹅。 我们需要鹅适配器,将鹅转换为Quackable接口 所以呢,我们同样的可以像对待鸭子一样使用鹅了。 3. 装饰器模式 如果我们想

2020-11-17 17:21:13 381

原创 redis分布式锁

一般而言,在对数据进行“加锁”时,程序首先要获取锁来得到对数据进行排他性访问的能力,然后才能对数据执行一系列操作,最后还要将锁释放给其他程序。 传统上,redis采用一种称之为“乐观锁”的方式对数据进行加锁,采用watch命令来监视数据,watch只会在其他客户端抢先修改了的情况下通知执行这个命令的客户端,然后这个客户端进行相应的操作。(这种情况下,所有客户端都能访问数据,并进行修改) 性能问题:一般而言,如果watch的数据改变,那么监视的客户端,会重新定位watch处重新运行,那么之前运行过的命令就

2020-11-14 20:39:06 246

原创 redis构建两个前缀匹配自动补全程序

本章首先会构建两个自动补全函数,它们可以分别用于在较短或较长的联系人列表中快速查找到指定的用户。 1. 较短的联系人列表,自动补全 1.1 第一个操作 1.2 第二个操作 第二个操作,就是在用户不想看见某个联系人的时候,将指定的联系人从联系人列表中删除! 1.3 最后一个操作 将列表返回给客户端,让客户端获取符合前缀条件的联系人 2. 较长的联系人列表,自动补全 简单,想要做到这个结果,我们要知道一个条件; 当有序集合的分值都为0时,有序集合会以key值进行顺序排序

2020-11-14 16:35:26 428

原创 状态模式:允许对象在内部状态改变时改变它的行为,对象看起来好像改变了他的类。

1. 问题引入; 2. 第一版代码实现; 3. 问题指出; 4. 问题解决; 5.第二版代码实现; 6. 定义状态模式与解释; 7. 总结; 8. 解决赢家状态问题。 1. 问题引入 糖果机状态改变图 上面状态变化图的含义是,圆圈是状态,箭头是状态变换的行为。 2. 第一版代码实现 我们要实现上图的糖果转换机这个类,包含它的各个状态以及行为! 我们看看我们需要一些什么?(记住:在不同的状态,针对行为调用,状态会有不同的反应) 现在让我们看看投入25分钱这个动作 我.

2020-11-13 21:15:12 678

原创 迭代器与组合模式

目录: 1. 问题引入 2. 可以封装遍历吗? 3. 引入迭代器模式 4. 定义迭代器模式,类图 5. 单一责任原则 6. 问题引入2 7. 定义组合模式 8. 利用组合模式解决问题 9. 回到迭代器 1. 问题引入 这里提出了两个类,一个是菜单项,一个是菜单,让我们看看怎么实现? 我们看到这里有两种不同的菜单实现方式,这会让事情变得复杂化,我们接着看下去! 我们先从实现printMenu方法开始 2. 可以封装遍历吗? 两个不同的菜单,都不喜.

2020-11-12 15:24:15 422 1

原创 redis 数据安全与性能保障

目录: 1. 将数据持久化到硬盘; 2. 将数据复制到其他机器; 3. 处理系统故障; 4. Redis事务; 5. 非事务型流水线; 6. 诊断性能问题。 1. 将数据持久化到硬盘 Redis提供了两种不同的持久化方法将数据存储到硬盘:快照、只追加文件(AOF)。 快照:将存在于某一时刻的所有数据都写入硬盘; AOF:在执行写命令时,将被执行的写命令存储到硬盘种。 注:这两种方法既可以同时使用,又可以单独使用,某些情况下两种都不使用。 在执行快照时,Redis程序,系统以及

2020-11-11 20:07:18 258

原创 模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤。

目录 1. 问题引入; 2. 第一版解决问题; 3. 第二版解决问题; 4. 模板方法初窥; 5. 定义模板方法; 6. 好莱坞原则; 7. 实际中的模板方法; 8. 总结。 1. 问题引入 咖啡和茶问题 我们扮演“师傅”,写一些代码来创建咖啡和茶: 咖啡 茶 2. 第一版解决问题; 上面两种类的实现,出现了重复代码,我们重新编写一种解决方法。 这种方法解决了一部分问题,但是我们是不是忽略了某些共同点呢? 3. 第二版解决问题; 我们可以将prepare

2020-11-06 20:56:15 560

原创 适配器模式、外观模式以及和装饰者模式的区别

目录: 1. 生活中的适配器; 2. 代码实现简单的适配器模式; 3. 适配器模式定义及解析; 4. 适配器模式的两种结构 5. 枚举器和迭代器的适配 6. 外观模式引出; 7. 外观模式的定义及解析; 8. “最少知识原则”; 9. 适配器模式、外观模式以及装饰者模式之间的区别。 1. 生活中的适配器 上图,中间的适配器改变了插座的接口,最后成功让电脑能够使用充电。 接下来让我们看看,现有系统、适配器和厂商类之间的关系。 2. 代码实现简单的适配器模式; 下面举出.

2020-11-05 21:01:38 1794

原创 命令模式:将“请求”封装为对象,以便使用不同的请求,队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。

命令模式把方法调用封装起来,通过封装方法调用,我们可以把运算块包装成形。所以调用此运算的对象不需要关心事情是如何进行的,只要知道如何使用包装成形的方法来完成它就可以。 问题描述 上面的问题描述,看上去一头雾水,我们只要记住命令模式的3个角色:调用者:按钮;接收者:具体的装置;命令:绑定给调用者的行为。 1. 让我们看看遥控器 整体的业务流程是:按钮按下后,命令就调用action()函数,然后action()函数就会调用接收者的行为。 2. 仔细看看装置的类 思考一下:如果按照正常的写

2020-11-04 21:47:39 739 1

原创 单件模式:确保一个类只有一个实例,并提供一个全局访问点。

问题: 一个类只有一个实例的用处? 线程池、缓存、对话框、处理偏好设置以及注册表等。 全局变量的缺点? 1. 程序一开始就要创建好对象,一直未使用的话,就会浪费资源; 2. 全局变量只能约定只有一个实例,但是如果new新的实例,也是可以办到的。 1. 单件模式 正常来说,对一般的类而言, 可以多次实例化,如果是非公开的类,只有同包内的类可以实例化,但仍然可以多次实例化。 如果,构造函数是私有的呢? 那么只有类的实例的方法可以调用构造器,但是类的实例又如何生成呢? 鸡生蛋,蛋生鸡?

2020-11-03 20:20:52 1757

原创 简单工厂模式,工厂方法模式和抽象工厂模式。

1. 问题引出 当使用到“new”,就会想到“具体” 2. 找出会变化的部分,把它们从不变部分分离出来 但是如果需要更多地比萨类型 看见了吗,根据比萨的类型,我们实例化正确的具体类。 如果呢?我们需要添加Clam Pizza和Veggie Pizza比萨类型,我们也要将这些风味加入我们的菜单,同时删除一些卖的不好的比萨 很明显的,如果实例化“某些具体类”,将不断地修改orderPizza,导致无法对修改关闭,所以此时我们已经知道了,哪些会改变,哪些不会改变,该是使用封装的时候了。

2020-11-02 18:42:13 367

原创 装饰者模式:动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

以下是目前的订单系统的类图: 1. 购买咖啡,要求在其中加入各种调料,例如都将、摩卡以及奶泡等等。 我们将所有的种类的咖啡的类图加入之前的结构中去: 很明显,上面造成维护噩梦,如果牛奶价钱上扬或者新增一种焦糖调料风味时,怎么办?需要修改很多代码! 2. 我们尝试修改基类试试 父类cost用于计算调料的价钱,子类cost用饮料的价钱+父类的cost,接下来加入子类 问题:1. 调料价钱或者增加调料类型的改变会改变cost、has和set方法;2. 以后开发出新饮料,某些调料并不适合

2020-10-31 16:25:15 365

原创 观察者模式:定义了对象之间的一对多依赖,这样依赖,当一个对象改变状态时,它的所有依赖者都会受到通知并自动更新。

问题描述:建立一个气象观测站,该气象站必须建立在WeatherData对象上。由WeatherData对象负责追踪目前的天气状况(温度、湿度、气压)。我们希望建立一个应用,有三种布告板,分别显示目前的状况,气象统计以及简单的预报。 同时希望公布一组API,让开发人员可以写出自己的气象布告板,并插入应用中。 1. 气象监测应用概况 如上图简单的设计,一旦气象站更新measurementsChanged()将会被调用。 2. 我们按要求完成measurementsChanged()方法 上

2020-10-30 22:06:33 1074

原创 策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户端。

1. 先设计一个模拟鸭子的游戏,游戏中会出现各种鸭子,一遍游泳戏水,一边呱呱叫。 2. 现在鸭子需要添加飞的功能,我们给超类加上新的fly功能,子类继承并实现 3. 如果某一种子类不会飞,那么继承就不是合适的选择方式,如下: 、 如上,有两个问题,1. RubberDuck覆盖了quack();2. RubberDuck不会飞,缺继承了fly()。 一种简单的解决方案是,将fly()覆盖为什么也不做。但是如果又有新的子类不会叫也不会飞呢,那么是不是得继续覆盖新的子类的quack()和...

2020-10-30 20:37:24 727

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除