- 博客(32)
- 资源 (2)
- 收藏
- 关注
原创 空对象模式(三十)
一、定义 空对象模式(NullObjectPattern)是通过实现一个默认的无意义对象来避免 null 值出现。 简单地说,就是为了避免在程序中出现 null 值判断而诞生的一种常用设计方法。二、实例 我们直接通过一个例子来看看空对象模式是怎么回事吧。1. 模拟一个动物叫声的程序// 定义动物接口public interface Animal { public voi...
2018-06-28 09:49:04 620
原创 黑板模式(二十九)
一、定义 黑板模式(BlackboardDesignPattern)是观察者模式的一个扩展,知名度并不高,但是我们使用的范围却非常广。黑板模式的意图如下: 允许消息的读写同时进行,广泛地交互消息。 简单地说,黑板模式允许多个消息读写者同时存在,消息的生产者和消费者完全分开。这就像一个黑板,任何一个教授(消息的生产者)都可以在其上书写消息,任何一个学生(消息的消费者)都可以从黑板上...
2018-06-28 08:24:48 2138
原创 雇工模式(二十八)
一、定义 雇工模式也叫做仆人模式(ServantDesignPattern),是行为模式的一种,其意图是: 为一组类提供通用的功能,而不需要类实现这些功能,它是命令模式的一种扩展。二、类图1. IServiced 被服务者 定义“一组类”所具有的通用功能。public interface IServiced { // 具有的特质或功能 public void se...
2018-06-27 21:15:19 749
原创 Java线程池介绍和使用
一、背景一张网络图片需要展示在页面上,通常需要开启一个线程去执行下载任务。然而当存在几十上百张图片的时候,每张图片都去开启一个独立的线程去进行下载任务,虽然可行但这并不是一个很好的做法,因为创建一个线程本身就是一个比较大的开销,其次一直创建新的线程,内存也会猛增。那么怎么做比较好呢?对,就是使用线程池来优化,通过重复利用线程对象,既可以避免创建新线程带来的开销问题,也可以通过控制池...
2018-06-27 08:57:16 2234
原创 对象池模式(二十七)
一、定义 对象池模式,或者称为对象池服务,其意图如下: 通过循环使用对象,减少资源在初始化和释放时的昂贵损耗。 简单地说,就是用的时候从池中取,不用的时候放回池中,等待下一次需要用到的时候再取出去。典型的应用就是 连接池 和 线程池。二、类图 其中 checkOut() 负责从池中取出对象,checkIn() 负责回收对象(很多时候回收已经自动处理,不需要显性声明,如连接池...
2018-06-25 17:05:06 882
原创 规则模式(二十六)
一、定义 规格模式(SpecificationPattern)可以认为是组合模式的一种扩展。 通常在查询、过滤等场景中,可以制定一些条件规则,这些规格也可以以 与、或、非 进行组合,从而灵活地对业务逻辑进行定制。二、场景分析 假设有一个用户类,同时还需要提供一个操作用户的辅助类,做一些查询工作。1. User 类public class User { private ...
2018-06-23 17:20:37 1833
原创 桥梁模式(二十五)
一、定义 桥梁模式(BridgePattern)也叫做桥接模式,是一个比较简单的模式,其定义如下: 将抽象和实现解耦,使得两者可以独立地变化。二、类图及角色 桥梁模式是一个非常简单的模式,它只是使用了类间的聚合关系、继承、覆写等常用功能,但是它却提供了一个非常清晰、稳定的架构。1. Abstraction 抽象化角色 它的主要职责是定义出该角色的行为,同时保存一个对实现化角...
2018-06-23 10:53:31 559
原创 享元模式(二十四)
一、定义 享元模式(FlyweightPattern)是池技术的重要实现方式,其定义如下: 使用共享对象可有效地支持大量的细粒度的对象。 Flyweight 是拳击比赛中的特用名词,意思是“特轻量级”。用到设计模式中是指我们的类要轻量级,粒度要小。享元模式的定义为我们提出了两个要求:细粒度的对象和共享对象。我们知道分配太多的对象到应用程序中将有损程序的性能,同时还容易造成内存溢出...
2018-06-22 21:11:32 536
原创 解释器模式(二十三)
一、定义 解释器模式(Interpreter Pattern)是一种按照规定语法进行解析的方案,例如解析四则运算、SQL语句等,现在项目中使用较少,其定义如下: 给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。二、类图和角色1. AbstractExpression 抽象解释器 具体解释任务由具体实现类完成。public abstra...
2018-06-22 09:19:51 530
原创 状态模式(二十二)
一、定义 当一个对象内在状态改变时允许其改变行为,这个对象看起来像改变了其类。 怎么理解这句话呢,就比方水有不同的状态,气体、液体和固体,不同的状态拥有的行为和特征也不一致,例如水可以用来洗衣服,冰可以冷藏东西,水蒸气有遇冷会液化的行为,它们还是同一个对象,但是在不同的状态看起来像改变了其类。二、角色1. State 抽象状态角色 接口或抽象类,负责对象状态定义,并且封装环境角色...
2018-06-21 21:43:17 407
原创 访问者模式(二十一)
一、定义 封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。二、类图及角色1. Visitor 抽象访问者 抽象类或者接口,声明访问者可以访问哪些元素,具体到程序中就是 visit 方法的参数定义哪些对象是可以被访问的。public interface IVisitor { // 可以访问哪些对象 public vo...
2018-06-19 20:05:19 460
原创 备忘录模式(二十)
一、定义 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。二、角色Originator 发起人角色记录当前时刻的状态,负责定义哪些属于需要备份的状态,负责创建和恢复备忘录数据。Memento 备忘录角色负责存储发起人的状态Caretaker 备忘录管理员角色对备忘录进行管理和保存三、使用场景需要保存和恢复数据的相关状态场景...
2018-06-18 19:47:44 1079
原创 门面模式/外观模式(十九)
一、定义 门面模式(FacadePattern)也叫做外观模式,是一种比较常用的封装模式,其定义如下: 要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。二、示意图 简单地说,门面对象是外界访问子系统内部的唯一通道,外部模块不用管子系统内部是多么复杂以及如何实现的。1. Facade 门面角色 客户端可以调用这...
2018-06-18 14:46:20 592
原创 NDK工具链的生成和配置(图文解说)
一、NDK 工具链是什么简单的说,就是 NDK 编译工程使用的东西,我们的目的就是把它抽出来在任何地方都可以直接、方便的使用。二、步骤1. 下载 NDK,并切到 /build/tools/ 目录,例如2. 执行如下命令 ./make-standalone-toolchain.sh --platform=android-21 --install-dir=$TARGET...
2018-06-17 20:22:01 8431 1
原创 如何在Android系统上运行C++程序
一、前言有两种方式:使用 NDK,通过 JNI 的方式来调用 C++ 的方法。这部分知识点很多,可以参考:Android NDK 从入门到精通(汇总篇) Android 的本质是基于 Linux 系统的,我们是可以直接运行 C++ 的程序关于第二点,是需要我们有 root 权限的。但是它也是很方便的,例如有一个 C++ 的 SDK,需要运行在 Android 系统上测试,直接编写一个可...
2018-06-17 17:42:53 31828 8
原创 观察者模式(十八)
一、定义 观察者模式(ObserverPattern)也叫做发布订阅模式(Publish/subscribe),其定义如下: 定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。二、角色1. Subject 被观察者 定义被观察者必须实现的职责,它必须能够动态地增加、取消观察者。它一般是抽象类或者是实现类,仅仅完成作为被观察者必...
2018-06-17 15:31:14 695
原创 Markdown语法介绍(详细)
一、什么是 Markdown Markdown 是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式。 二、下载和使用1. 客户端 我使用的是 作业部落 出品的 Cmd Markdown,下面演示也是使用该 IDE 作为演示。2. 网页插件 如果你使用的是 chrome 游览器,那么可以安装一款叫做 Mark...
2018-06-17 11:01:55 272928 13
原创 组合模式(十七)
一、定义 组合模式(Composite Pattern)也叫合成模式,有时又叫做部分-整体模式(Part-Whole),主要是用来描述部分与整体的关系,其定义如下: 将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。二、角色Component是组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理C...
2018-06-17 09:12:44 748
原创 迭代器模式(十六)
一、定义 提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节。二、角色1. Iterator 抽象迭代器 抽象迭代器负责定义访问和遍历元素的接口,而且基本上是有固定的3个方法:first() 获得第一个元素,next() 访问下一个元素,isDone() 是否已经访问到底部(Java 叫做 hasNext() 方法)。public interface Iterator...
2018-06-16 16:28:07 454
原创 适配器模式(十五)
一、定义 将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。适配器模式又叫做变压器模式,也叫做包装模式(Wrapper),但是包装模式可不止一个,还包括了之前的装饰者模式。 扩展: 适配器模式最开始的应用实在工业上,如下图A、B两个图框代表已经塑模成型的物体A和物体B,那现在要求把A和B安装在一起使用,如何安装?两者的接口不一致...
2018-06-16 14:55:58 744
原创 策略模式(十四)
一、定义 策略模式(Strategy pattern)也叫政策模式(Policy Pattern),其定义为:定义一组算法, 将每个算法都封装起来, 并且使它们之间可以互换。二、类图及角色1. Context 封装角色 类似于锦囊妙计的锦囊,它也叫做上下文角色, 起承上启下封装作用, 屏蔽高层模块对策略、 算法的直接访问,封装可能存在的变化。public class Context {...
2018-06-14 21:56:22 635
原创 装饰者模式(十三)
一、定义 动态地给一个对象添加一些额外的职责。就增加功能来说, 装饰模式相比生成子类更为灵活。二、类图及各角色1. Component 抽象组件(公共接口/抽象类) 装饰者模式必须要有这样一个抽象的组件,被装饰者和装饰者都是这个抽象的具体实现。往往定义我们最核心、最原始、最基本的对象。public abstract class Component { //抽象的方法 p...
2018-06-14 08:43:32 653
原创 责任链模式(十二)
一、引子 古代女子有“三从四德”之说,“三从”即指“未嫁从父、既嫁从夫、夫死从子”。也就是说,一位女性在结婚之前要听从于父亲,结婚之后要听从于丈夫,如果丈夫死了还要听从于儿子。举例来说,如果一位女性要出去逛街,在她出嫁前必须征得父亲的同意,出嫁之后必须获得丈夫的许可,那丈夫死了怎么办?那就得问问儿子是否允许自己出去逛街。估计你接下来马上要问:“要是没有儿子怎么办?”那就请示小叔子、侄...
2018-06-13 13:20:49 2029 1
原创 智能指针 unique_ptr 详解
一、智能指针1.什么是智能指针简单地说,C++智能指针是包含重载运算符的类,其行为像常规指针,但智能指针能够及时、妥善地销毁动态分配的数据,并实现了明确的对象生命周期,因此更有价值。2.常规指针存在的问题C++在内存分配、释放和管理方面向程序猿提供了全面的灵活性。但是这种灵活性是把双刃剑,一方面它使C++成为一种功能强大的语言,另一方面它让程序猿能够制造与内存相关的问题,比如内存泄...
2018-06-12 20:28:54 18785
原创 命令模式(十一)
一、定义 将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求的日志,可以提供命令的撤销和恢复功能。 简单的说,命令模式是实现的 “行为请求者(Invoker)” 与 “行为实现者(Receiver)” 间的解耦,将请求封装成一个命令,调用者只需要执行相应的 “命令(Command)” 即可。二、类图和成员角色1. Receiver 接受者 该角...
2018-06-12 08:24:09 633
原创 判断一个数是不是质数(素数),3种方式介绍
一、概念介绍 大家中学都学过,就不过多介绍了,大致提两点: 质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数。 0和1既不是质数也不是合数,最小的质数是2二、方法介绍1.最直观,但效率最低的写法public static boolean isPrime(int n){ if (n <= ...
2018-06-10 09:56:59 283912 51
原创 中介者模式(十)
一、引子1.场景模拟 假设有一家商店。采购员负责采购商品,销售负责出售商品,商店的库存负责存储商品。他们彼此都存在一定的依赖关系,那么他们之间的关系大致可以如下图描述:2.场景扩大 我们知道迪米特法则认为“每个类只和朋友类交流”,然而这个朋友类并非越多越好,朋友类越多,耦合性越大,想要修改一个就得修改一片。这不是我们所期望的。 上面那个场景还很简单,假如我们再扩大一点,引入供应商...
2018-06-10 09:15:01 529
原创 原型模式与浅复制深复制(九)
一、定义 用原型实例指定创建对象的种类, 并且通过拷贝这些原型创建新的对象。原型模式是和单例模式一样很简单的一种设计模式。二、优点 1.性能优良 原型模式是在内存二进制流的拷贝, 要比直接new一个对象性能好很多, 特别是要在一个循环体内产生大量的对象时, 原型模式可以更好地体现其优点。 2.避免了反复的相同赋值操作 例如有一个 Mail 类,现在创建了一个实例对象 ...
2018-06-07 09:15:51 622
原创 静态代理和动态代理(八)
一、代理模式 关于代理模式,以及代理模式的组成元素、类图关系、优点以及应用场景可以参考我的上一篇博文 代理模式简介二、静态代理1.定义 所谓静态代理,即是代码编译时已经写好了代理类。例如我们上一章介绍的例子就是静态代理。2.举个例子 现在又一个共有接口如下public interface ActionA { void action1(); void action2...
2018-06-03 12:28:07 471 1
原创 代理模式简介(七)
一、定义 为其它对象提供一种代理,以控制对这对象的访问。二、类图三、代理三要素 1.Subject 抽象主题角色(共同接口) 可以是抽象类或者接口,是一个最普通的业务类型定义,无特殊要求。public interface Subject { //定义一个方法 public void request();} 2.RealSubject 具体主题角色(真实对象...
2018-06-03 12:07:49 1040
原创 C/C++ 函数指针
一、定义 函数指针是指向函数的指针变量。 因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。扩展:函数指针和指针函数的区别? 他们只是名字比较像。函数指针是指向函数的指针变量,本质是一个指针。而指针函数是返回值为指针的一个函数,本质是一个函数。二、声明方法 返回值类型 ( * 指针变量名) ([形参列表]); 例如:int func(int x); /* 声明...
2018-06-02 17:01:19 6529 8
原创 建造者模式(六)
一、定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。二、角色 1.Product 产品类:建造者最后要构建出来的复杂对象。 2.Builder 抽象构建者:为创建一个复杂对象各个组建指定抽象接口,规范产品的组建。 3.ConcreteBuilder 具体建造者:实现抽象类返回的所有方法。 4.Director 导演类:执行者,指导构建过...
2018-06-02 14:07:21 685
设计模式之禅第二版
2018-06-25
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人