随笔分类 -  设计模式

摘要:访问者模式 表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 数据操作与数据结构分离的设计模式。是 23 种设计模式中比较复杂的一个,使用频率不高但是一旦需要使用,就是迫切的需要。 类结构图 Vistior 是一个接口定义了每一个元素(Ele 阅读全文
posted @ 2019-04-09 18:37 一定要细心 阅读(124) 评论(0) 推荐(0)
摘要:解释器模式 定义一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 类结构图 Context 包含解释之外的一些全局信息。 AbstractExpression 声明一个抽象的解释操作,这个接口为抽象语法树中所有的节点所共享。 TerminalExpress 阅读全文
posted @ 2019-03-20 20:32 一定要细心 阅读(118) 评论(0) 推荐(0)
摘要:享元模式 运用共享技术有效的支持大量细粒度的对象。 类结构图 FlyweightFactory 一个享元类,用来创建并管理 Flyweight 对象。它主要是用来确保合理地共享 Flyweight,当用户请求一个 Flyweight 时,FlyweightFactory 对象提供一个已创建的实例。 阅读全文
posted @ 2019-03-18 15:22 一定要细心 阅读(135) 评论(0) 推荐(0)
摘要:中介者模式 用一个中介对象来封装一系列的对象的交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 类结构图 Mediator 抽象中介者,定义了同事对象到中介者对象的接口。 ConcreteMediator 具体的中介者对象,实现抽象类的方法,它需要知道所 阅读全文
posted @ 2019-03-16 10:05 一定要细心 阅读(122) 评论(0) 推荐(0)
摘要:责任链模式 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。 类结构图 Handler 定义一个处理请示的接口。 ConcreteHandlerA、ConcreteHandlerB 具体的处理类,处理它所 阅读全文
posted @ 2019-03-13 01:15 一定要细心 阅读(138) 评论(0) 推荐(0)
摘要:命令模式 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化。 类结构图 Invoker 要求该命令执行这个请求。 Command 用来声明执行命令的接口。 ConcreteCommand 将一个接收者对象绑定于一个动作,调用接收者相应的操作,以实现 Execute。 Receiver 阅读全文
posted @ 2019-03-11 11:24 一定要细心 阅读(99) 评论(0) 推荐(0)
摘要:桥接模式 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?这就要使用桥接模式。而具体使用的方式,则是将抽象部分与他们的实现部分分离,使得它们都可以独立的变化。 什么才是抽象部分与它的实现分离呢,并不是说将抽象类和实现类分离。实现指的是抽象类和它的实 阅读全文
posted @ 2019-03-05 19:56 一定要细心 阅读(127) 评论(0) 推荐(0)
摘要:单例模式 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 类结构图 单例模式有两种实现方式:恶汉式、懒汉式。 饿汉式代码示例 public class Singleton { private static final Singleton SINGLETON = new Singleton() 阅读全文
posted @ 2019-03-04 16:47 一定要细心 阅读(139) 评论(0) 推荐(0)
摘要:迭代器模式 提供一种方法顺序访问到一个聚合对象中的各个元素,而又不暴露该对象的内部表示。 类结构图 Aggregate 聚集抽象类。 ConcreteAggregate 具体的聚集类,继承 Aggregate。 Iterator 迭代抽象类,用于定义得到开始对象、得到下一个对象、判断是否到结尾、当前 阅读全文
posted @ 2019-03-04 14:26 一定要细心 阅读(111) 评论(0) 推荐(0)
摘要:组合模式 将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。 类结构图 Component 组合中的对象声明接口,在适当情况下,实现所有类共有的接口默认行为。声明一个接口用于访问和管理 Component 的子部件。 Composite 定义节 阅读全文
posted @ 2019-03-02 15:55 一定要细心 阅读(150) 评论(0) 推荐(0)
摘要:备忘录模式 在不破坏封装性的前提下,捕获一个对象内部的状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。 类结构图 Originator 负责创建一个备忘录 Memento,用以记录当前时刻它的内部状态,并可使用备忘录恢复内部状态,Originator 可根据需要决定 Me 阅读全文
posted @ 2019-02-28 03:04 一定要细心 阅读(108) 评论(0) 推荐(0)
摘要:适配器模式 将一个类的接口转换成客户希望的另外一个接口。Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 Adapter 模式的宗旨:保留现有类所提供的服务,向客户提供接口,以满足客户的期望。 首先应该明白一点,适配器是最后的补救措施,应该在功能设计的时候尽量避免。所以 阅读全文
posted @ 2019-02-27 14:53 一定要细心 阅读(109) 评论(0) 推荐(0)
摘要:状态模式 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。 上面是百度百科的解释,看起来有点难以理解其实可以理解为:它说当状态改变时,这个对象的行为也会变,而看起来就像是这个类改变了一样。 类结构图 Context 含有状态的类,维护一个 State 的实例。 State 状 阅读全文
posted @ 2019-02-25 17:55 一定要细心 阅读(133) 评论(0) 推荐(0)
摘要:抽象工厂模式 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。 类结构图 Creator 抽象工厂接口,里面应该包括所有的产品创建的抽象方法。 ConcreteCreator1、ConcreteCreator2 具体的工厂,创建具有特定实现的产品对象。 ProductA、Prod 阅读全文
posted @ 2019-02-24 00:19 一定要细心 阅读(100) 评论(0) 推荐(0)
摘要:观察者模式 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有的观察者对象,使它们能够自己更新自己。 **简单点概括就是:**一个类管理着所有依赖于它的观察者类,并且在这个类自身发生变化的时候主动给依赖于它的观察者类发出通知。 结构 阅读全文
posted @ 2019-02-21 00:04 一定要细心 阅读(153) 评论(0) 推荐(0)
摘要:建造者模式 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 类结构图 Director 构建一个使用 Builder 接口的对象。 Builder 为创建一个产品对象各个部件指定的抽象接口。 ConncreteBuilder 具体的建造者,需实现 Builder 接口,构 阅读全文
posted @ 2019-02-13 17:38 一定要细心 阅读(106) 评论(0) 推荐(0)
摘要:外观模式 外观模式(Facade),为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一子系统更加容易使用。 类结构图 Facade 外观类,知道哪些子系统类负责处理请求,将 Client的请求代理给适当的子系统对象。 子系统角色 实现具体的功能类,处理 Facade 对象指派 阅读全文
posted @ 2019-02-13 17:12 一定要细心 阅读(134) 评论(0) 推荐(0)
摘要:模板方法模式 定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 结构图 应用 比如把大象放入冰箱需要3步 打开冰箱门 把大象塞进去 关上冰箱门 代码实现 public class Elephant { public void 阅读全文
posted @ 2019-02-02 15:40 一定要细心 阅读(90) 评论(0) 推荐(0)
摘要:原型模式 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 结构图 Prototype:原型类,声明一个克隆自身的接口 ConcretePrototype:具体原型类,实现一个克隆自身的操作 Client:客户端,让一个原型克隆自身从而创建一个新的对象 代码实现 public cla 阅读全文
posted @ 2019-02-01 16:47 一定要细心 阅读(116) 评论(0) 推荐(0)
摘要:上一章我们学习了静态代理,举个栗子比如我想在一批Controller里进行入参和出参的打印。那么静态代理就会创建若干个Controller的代理类。 再比如我除了要出参入参打印,我还需要在出参入参之后在打印出每个函数的耗时,那么就需要重新在每个函数里在加上耗时的日志打印。动态代理则会帮我们省了很多代 阅读全文
posted @ 2019-02-01 00:37 一定要细心 阅读(157) 评论(0) 推荐(0)