
模式与重构
文章平均质量分 65
我是松哥
软件技术人员
展开
-
规格模式(Specification)
规格(Specification)即类/对象的属性,比如产品的颜色、尺寸和价格,如果业务规则的变化和组合很多,而且和规格相关,包括很多的条件判断,那么适合将这些业务规则放到专门的规格对象中,这就是规格模式。规模模式有三种形式:用于验证,验证一个对象的状态是否符合要求。 用于筛选过滤,从一个集合中筛选出符合指定要求的对象。Java 8可以stream 的filter方法实现。 按需创建指定规格的产品。案例:根据颜色、尺寸、价格等规格筛选出指定规格的产品。下面的代码设计Builder, Fac原创 2022-03-16 20:15:25 · 4560 阅读 · 0 评论 -
设计模式 - 策略模式(Strategy)
Strategy模式定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。类图: 案例: 不同的员工薪资计算不同。 没有实现Strategy模式的例子:public class Employee { public static final int ENGINEER = 0; public static final int SAL原创 2017-04-04 21:49:04 · 578 阅读 · 0 评论 -
设计模式 - 简单工厂模式(静态工厂模式)
简单工厂模式(静态工厂模式): 类提供一个公有的静态工厂方法,返回一个类的的实例.案例1: Java 中基本类型的包装类工厂方法:public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache原创 2017-04-01 17:40:54 · 452 阅读 · 0 评论 -
设计模式 - 原型模式(Prototype)
原型模式(Prototype) - 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 在Java中的可以通过实现Cloneable接口,并覆盖(Override) clone() 方法来实现。分为”浅克隆”和”深克隆”: 浅克隆: 对引用类型的成员变量只克隆引用,不克隆引用的对象。 深克隆: 对引用类型的成员变量也进行引用对象的克隆。类图: 案例: 深克隆public cl原创 2017-04-02 15:45:11 · 706 阅读 · 0 评论 -
设计模式 - 抽象工厂模式(Abstract Factory)
抽象工厂模式(Abstract Factory) 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。它可以看作是工厂方法模式(Factory Method)的扩展,相对于Factory Method创建一个对象, Abstract Factory 创建多个相关的对象。优点: 如果换产品系列,只需换相应的具体工厂即可; 客户代码与产品的具体实现分离。缺点:原创 2017-04-02 10:15:51 · 805 阅读 · 1 评论 -
设计模式 - 命令模式(Command)
Command模式将一个请求封装为一个命令对象(ConcreteCommand),并指明接收者(Receiver);调用者(Invoker)存储命令。当调用者Invoker请求命令对象(ConcreteCommand),命令对象(ConcreteCommand)将请求委托给接收者(Receiver)对象执行处理该请求的各操作。别名:动作(Action),事务(Transaction)。类图:原创 2017-04-03 20:39:33 · 426 阅读 · 1 评论 -
设计模式 - 访问者模式(Visitor)
Visitor模式表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。类图:原创 2017-04-04 22:26:07 · 463 阅读 · 0 评论 -
设计模式 - 工厂方法模式(Factory Method)
工厂方法模式 (Factory Method)定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。引入多态创建对象。一个层次中的类都有相似实现一个方法(AnOperation), 只是这个方法中对象创建的步骤不同。工厂方法通常在模板方法中被调用。下面的例子通过学习Log4j APIs,运用重构技术实现模板方法和工厂方法模式...原创 2017-04-01 19:18:30 · 787 阅读 · 0 评论 -
设计模式 - 桥接模式(Bridge)
Bridge模式将抽象部分与它的实现部分分离,使它们都可以独立地变化。Bridge模式创建了两个分离的类层次,目的就是允许分离的类层次一起工作,即使它们是独立演化的。类图: 示例:绘制一个圆(Circle),可以是红色的或绿色的public interface DrawImp { public void drawCircle(int radius, int x, int y);}publi原创 2017-04-02 20:02:21 · 985 阅读 · 0 评论 -
设计模式 - 解释器模式(Interpreter)
Interpreter模式,给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。当类中的许多方法组合成了一种隐式语言的元素,可以使用Interpreter模式为隐式语言的元素定义类,将方法转化成类组合解释语言。类图: 案例:搜索对象表达式会使用像 “and”, “not” 和 “or” (称为非终结表达式) 这样的词,也会使用像”$100”, “smal原创 2017-04-03 22:02:49 · 463 阅读 · 0 评论 -
设计模式 - 设计模式
面向对象编程(OOP)的基本概念有 封装,抽象,继承, 多态等,可复用的面向对象技术包括 类的继承,对象的组合 和参数化类型 (Generic), GoF的巨著《设计模式》总结出可复用的面向对象的23个设计模式, 并且归类成 创建型模式,结构型模式和行为型模式.创建型模式抽象了对象创建,隐藏了类的信息和如何创建类的实例, 包括:抽象工厂模式(Abstract Factory原创 2017-04-01 15:43:37 · 1983 阅读 · 1 评论 -
设计模式 - 状态模式(State)
State模式允许一个对象在其内部状态改变时改变它的行为。当一个 对象收到其他对象的请求时, 它根据自身的当前状态作出不同的反应。 • 一个对象的行为取决于它的状态, 并且它必须在运行时刻根据状态改变它的行为。 • 一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示。通常, 有多个操作包含这一相同的条件结构。State模式将每一个条件分支放原创 2017-04-04 17:44:05 · 538 阅读 · 0 评论 -
设计模式 - 生成器模式(Builder)
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 类图: B u i l d e r对象提供给导向器(Director)一个构造产品的抽象接口; 每个具体生成器C o n c r e t e B u i l d e r包含了创建和装配一个特定产品的所有代码;改变该产品的内部表示时所要做的只是定义一个新的生成器。案例1: KFC套餐A: 一份汉堡,一份鸡翅,一份饮原创 2017-04-02 15:08:51 · 1278 阅读 · 0 评论 -
设计模式 - 观察者模式(Observer)
Observer模式定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。 别名:发布-订阅(Publish-Subscribe)类图: Java提供了Observable(Subject)类,和Observer接口 Observer模式分为推模式和拉模式: 推模式是Observable对象调用Observer类型对象的Update(…)方原创 2017-04-04 15:23:08 · 375 阅读 · 0 评论 -
设计模式 - 备忘录模式(Memento)
Memento模式在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。类图: 案例: 购物的时候你可以临时改变送货地址和联系电话,通过Memento模式恢复到原始的送货地址和联系电话。public class Buyer { private String name; private String phoneNum;原创 2017-04-04 15:04:55 · 405 阅读 · 0 评论 -
设计模式 - 适配器模式(Adapter)
Adapter模式将一个类的接口转换成客户希望的另外一个接口。它使得原本由于接口不兼容 而不能一起工作的那些类可以一起工作。别名Wrapper。类Adapter,类Adapter使用多重继承对一个接口与另一个接口进行匹配。 类图: 对象Adapter依赖于对象组合。 类图: 下列情景实现Adapter是有用的:两个类所做的事情相同或相似,但具有不同的接口 如果类共享接口,客户代码更简原创 2017-04-02 18:55:42 · 366 阅读 · 0 评论 -
设计模式 - 外观模式(Facade)
Facade模式 为子系统中的一组接口提供一个一致的界面, 它定义了一个高层接口,这个接口使得这一子系统更加容易使用。 通常我们将一个系统划分为若干子系统,以降低系统的复杂度。为了使子系统间的通信和相互依赖关系达到最小。达到该目标的途径之一是就是引入一个外观(Facade)对象,它为子系统中较一般的设施提供了一个单一而简单的界面。• 客户程序通过发送请求给Facade的方式与子系统通讯, Faca原创 2017-04-03 10:44:21 · 301 阅读 · 0 评论 -
设计模式 - 享元模式(Flyweight)
Flyweight享元模式共享对象节约资源。类图: 案例: 如对象池技术 - 数据库连接池原创 2017-04-03 10:58:13 · 339 阅读 · 0 评论 -
设计模式 - 代理模式(Proxy)
Proxy模式为其他对象提供一种代理以控制对这个对象的访问。类图 下面是一些可以使用Proxy模式常见情况: 1) 远程代理(Remote Proxy)为一个对象在不同的地址空间提供局部代表。 2) 虚代理(Virtual Proxy)根据需要创建开销很大的对象。 3) 保护代理(Protection Proxy)控制对原始对象的访问。保护代理用于对象应该有不同的访问权限的时候。 4) 智原创 2017-04-03 11:09:39 · 339 阅读 · 0 评论 -
设计模式 - 模板方法模式(Template Method)
Template Method模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 • 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。 • 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。按照Template Method模式提炼方法来重构代码,是实现很多其它模原创 2017-04-04 22:22:29 · 716 阅读 · 0 评论 -
设计模式 - Null Object 模式
代码中到处都是处理null字段或变量的重复逻辑。 将null逻辑替换为一个Null Object, 提供一个正确的null行为对象。原创 2017-04-04 22:29:12 · 546 阅读 · 0 评论 -
设计模式 - 装饰模式(Decorator)
Decorator/Wrapper 模式动态地给一个对象添加一些额外的职责。就增加功能来说, Decorator模式相比生成子类更为灵活。 装饰与它所装饰的组件接口一致,因此它对使用该组件的客户透明。 以下情况使用Decorator模式 • 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。 • 处理那些可以撤消的职责。 • 当不能采用生成子类的方法进行扩充时。一种情况是,可原创 2017-04-02 22:00:34 · 344 阅读 · 0 评论 -
设计模式 - 责任链(Chain of Responsibility)
Chain of Responsibility 模式使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。类图: • 当客户提交一个请求时,请求沿链传递直至有一个ConcreteHandler 对象负责处理它。 优点: • 降低耦合度 一个对象无需知道是其他哪个对象处理其请求; • 增强了给原创 2017-04-03 17:42:59 · 338 阅读 · 0 评论 -
设计模式 - 组合模式(Composite)
Composite模式将对象组合成树形结构以表示“部分-整体”的层次结构。它使得用户对单个对象和组合对象的使用具有一致性。 类图: 案例: 一个类使用两个几乎一样的方法,唯一不同的区别就是用一个处理单一对象,一个处理对象的集合。Composite模式可以处理这种一/多之分。 下面的代码是统计每个员工的成本和每个部门的成本(假设成本是员工的工资),通过重构技术实现Composite模式:原创 2017-04-02 21:16:25 · 423 阅读 · 0 评论 -
设计模式 - 迭代器模式(Iterator)
Iterator模式提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。 • 访问一个聚合对象的内容而无需暴露它的内部表示。 • 支持对聚合对象的多种遍历。 • 为遍历不同的聚合结构提供一个统一的接口(即, 支持多态迭代)。 • 简化了聚合对象的接口,有了迭代器的遍历接口,聚合对象就不需要遍历接口。(通过对象组合提供强大功能)类图: Java已提供Iterator接原创 2017-04-04 13:09:07 · 323 阅读 · 0 评论 -
设计模式 - 中介者模式(Mediator)
Mediator模式用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 可以通过将集体行为封装在一个单独的中介者(mediator)对象中以避免这个问题。中介者负责控制和协调一组对象间的交互。中介者充当一个中介以使组中的对象不再相互显式引用。这些对象仅知道中介者, 从而减少了相互连接的数目。类图: Mediator模式使原创 2017-04-04 14:31:36 · 297 阅读 · 0 评论 -
设计模式 - 单件模式(Singleton)
Singleton 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 类图: 方法1:public class Singleton { private static Singleton instance = new Singleton(); private Singleton() { } public static Singleton newInstan原创 2017-04-02 16:15:26 · 502 阅读 · 0 评论