随笔分类 - 设计模式
摘要:前言 在学开发的第二年就开始听说要想代码写得好,一定要会设计模式。于是就兴致冲冲的啃了《Head First 设计模式》,看完之后对于策略模式映像很深刻,觉得这个模式好,易上手,应用广,我又能优化一波代码了(装波逼了),于是兴致冲冲的打开了我的 IDEA,开整!!! 策略模式初体验(错误示范) 在讲
阅读全文
摘要:解释器模式 定义:这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。 使用场景:如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。
阅读全文
摘要:访问者模式 定义:将作用于某种数据结构中的各元素的操作分离出来封装为独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作,为数据结构中的每个元素提供多种访问方式。 使用场景: 对象结构很少改变,但是需要经常在结构上定义新的操作。 需要对一个对象结构中的对象进行很多不同并且不相关的操
阅读全文
摘要:模板方法 定义:定义一个过程中的算法骨架,而将算法的一些步骤延迟到子类中。 这么做是为了将不变的部分封装到父类中实现,而将可变部分的算法由子类继承实现,便于扩展。 模板结构: 抽象模板 模板方法:定义了算法的骨架,按某种顺序调用其包含的基本方法。 基本方法: 抽象方法:在抽象类中声明,由具体子类实现
阅读全文
摘要:策略模式 定义:定义了一系列算法,并将每一个算法封装起来,而且他们之间还可以相互替换。 注意解决多种算法相似的i情况下,使用if/else带来的复杂和难以维护。 使用场景:1. 一个对象有很多行为,这些行为使用了多重条件选择语句实现。2.一个系统需要动态的在几种算法中选择一种。 可以使用策略模式+工
阅读全文
摘要:状态模式 定义:当一个对象得内在状态改变时,他的行为也会改变。对有状态的对象,把复杂的"判断逻辑"提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。 使用场景:代码中包含大量与对象状态有关的条件语句。 注意事项:在行为受状态约束的时候使用,且状态不超过5个。 模式的结构: 环境类
阅读全文
摘要:观察者模式 定义:观察者模式(发布-订阅模式),指多个对象之间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都得到通知并被自动更新。 使用场景: 一个对象的改变会导致其他一个或多个对象的改变 一个对象必须通知其他对象 结构: 抽象主题(Subject):抽象目标类,它提供了一个用
阅读全文
摘要:备忘录模式 定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。 使用场景:需要保存、恢复数据的相关场景。提供可回滚的操作。如游戏中的存档、应用软件里的Ctrl+Z等。 注意事项:为了符合迪米特法则,还需增加一个管理备忘录的类。为了节约内存还可使用原型模式+备忘录模式。
阅读全文
摘要:中介者模式 定义:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式的相互引用,从而使耦合松散,而且可以独立的改变他们之间的交互。 使用场景:多个类相互耦合,形成了网状结构。比如想租房,不用和每个房东联系,而是跟一个中介联系就行。 缺点:中介者模式把多个对象之间的相互依赖改成了中介和多个
阅读全文
摘要:迭代器模式 定义:提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露该对象的内部表示。 如果我们需要遍历一个聚合对象中的各个元素,通常的做法是把遍历方法写在对象这个类里,这样做如果要更改遍历方法需要修改这个对象类,违背了“开闭原则”。迭代器模式能较好的克服这个缺点。 使用场景:需要遍历一个聚
阅读全文
摘要:命令行模式 定义:将一个请求封装为一个对象,使发出的请求的对象和执行请求的对象分割开。这两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。 顺序:请求者->命令->执行者 优点: 降低系统耦合度 扩展性好,增加或删除命令不会影响其他类 方便实现Undo和Redo操作,
阅读全文
摘要:责任链模式 也叫职责链模式 定义:为了避免请求发送者和多个请求处理者之间的耦合,于是将所有请求的处理者通过前一对象记住其后一对象的引用。当有请求来时,可将请求沿着链传递,直到有处理者处理它为止。 优点: 降低了对象之间的耦合度,该模式使得一个对象无须知道到底是哪一个对象处理其请求。 责任链简化了对象
阅读全文
摘要:代理模式 定义:由于某些原因需要给某对象提供一个代理以控制该对象的访问 结构: 抽象主题(Subject): 接口声明要实现的业务方法 真实主题 (Real Subject): 实现抽象主题里的业务方法 代理类(Proxy):提供了与真实主题相同的接口,它可以扩展、控制真实主题的功能。 代理模式的结
阅读全文
摘要:享元模式 定义:使用共享物件,来减少内存使用量。通常物件中的部分状态时可以分享的,常见的做法时将他们放在外部数据结构中,当需要使用时再将它们传递给享元。能够避免重复创建。 应用实例:Java里的String字符串缓存池。数据库的数据池 使用场景:系统里有大量相似对象,需要用到缓存的场景 需要注意线程
阅读全文
摘要:外观模式 定义:他为子系统中的一组接口提供一个统一的高层接口,这使得子系统更加容易使用。 外观模式是"迪米特法则"的典型应用。只要是高层模块需要调度多个子系统时,我们都自觉地编写一个新的类封装,提供出精简的接口。 Facade类封装了子系统,可以提供出多个接口,简化客户角色的调用。 代码示例: pa
阅读全文
摘要:装饰器模式 定义:不改变原类文件和继承关系的情况下,动态扩展一个对象的功能。他是通过创建一个包装对象。 使用场景:不想使用继承,但又要在原有基础上增加额外功能。如一部手机,给他增加一个手机壳,再增加一个保护膜。 结构: 抽象构件(Component):定义一个抽象接口 具体构件(ConcreteCo
阅读全文
摘要:组合模式 定义:将对象组合成树形结构以表示部分整体得层次结构。组合模式使用户对单一对象和组合对象使用具有一致性。 使用场景:希望用户忽略组合对象和单个对象的不同,统一的使用组合结构中的所有对象。如文件、文件夹的管理。 有两种方式: 透明方式: 由于抽象构件声明了所有子类中的全部方法,所以客户端无须区
阅读全文
摘要:桥接模式 定义:在软件系统中,某些类型由于自身的逻辑,它具有两个纬度的变化,那么如何应对这种多维度的变化呢?就是使他的抽象部分和实现部分分离开,使他们可以独立变化。 使用场景:需要按两个维度区分的情况。比如奶茶,按杯型分为大中小,按温度分为常温、加冰。那么如果按照普通接口实现要定义3*2=6个类才能
阅读全文
摘要:适配器模式 定义:将一个类的接口转为客户需要的另一个接口。目的是使原本不兼容而不能一起工作的那些类可以一起工作。 适配器模式从实现方式上分为两种,类适配器和对象适配器。这两种的区别在与实现方式的不同,一种采用继承,一种采用组合。 另外从使用目的也为分了两种,特殊适配器和缺省适配器。一种是为了复用原有
阅读全文
摘要:原型模式 定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 Java 中的 Object 类提供了浅克隆的 clone() 方法,他执行得是浅拷贝,也就是说如果是引用类型得对象,只是会拷贝引用。 使用场景: 初始化很花时间,很废资源的时候,通过原型拷贝可以避免这些消耗 通过ne
阅读全文