Repositories 及其真实意图
由于使用了 Repository 模式,你已经替换了多少次底层数据库实现?这就是为什么,在这篇博文中,我想进一步澄清这个完全被误解的软件设计模式,以及为什么反对使用它的第一个论点(上面的问题)实际上是微不足道的,几乎无关紧要。定义 Repository首先,让我们从定义 Repository 实际是什么开始。Repository 模式在 PoEAA 中定义如...
设计模式之备忘录(Memento)模式
又名: 快照模式(Snapshot)意图备忘录(Memento)模式是一种行为设计模式,允许你在不暴露实现细节的情况下,保存及恢复对象的前一种状态。问题描述想象一下,你正在创建一个文本编辑器应用。除了简单的文本编辑外,编辑器还可以格式化文本、插入内联图像等。在某个时刻,你决定让用户撤消对文本执行的任何操作。多年来,这一功能变得如此普遍,以至于现在人们希望每个...
设计模式之单例(Singleton)模式
意图单例(Singleton)模式一种创建型的设计模式,可以确保类只有一个实例,同时为该实例提供全局访问点。问题描述单例模式同时解决了两个问题,违反了单一职责原则。确保一个类只有一个实例。为什么有人要控制一个类由多少各实例呢?最常见的原因是控制对某些共享资源的访问,例如数据库或文件。它的工作原理如下:想象一下你创建了一个对象,但过了一段时间后决定创建一个新对...
设计模式之责任链(Chain of Responsibility)模式
责任链(Chain of Responsibility )模式是一种行为设计模式,允许沿着处理程序链传递请求。收到请求后,每个处理程序决定处理该请求或将其传递给链中的下一个处理程序。问题描述假设你正在开发一个在线订单系统。您希望限制对系统的访问,以便只有经过身份验证的用户才能创建订单。此外,具有...
设计模式之工厂方法(Factory Method)
工厂方法是一种创建型设计模式,它为在超类中创建对象提供了一个接口,但允许子类更改将要创建的对象的类型。问题描述想象一下,你正在创建一个物流管理应用。你的应用程序的第一个版本只能处理卡车运输,所以你的大部分代码都在卡车类(Truck)中。过了一段时间,你的应用程序变得非常受欢迎。每天,您都会收到数十个来自海运公司的请求,要求将海运物流纳入...
设计模式之原型(Prototype)模式
又称: 克隆模式(Clone)。原型模式(Prototype)是创建型设计模式,它允许克隆对象,甚至是复杂的对象,而不必耦合到它们的特定类。所有原型类都应该有一个公共接口,即使对象的具体类是未知的,也可以复制对象。原型对象可以生成完整的副本,因为同一类的对象可以访问彼此的私有字段。
设计模式之代理(Proxy)模式
代理模式(Proxy)是一种结构型设计模式,允许你提供为另一个对象提供替代或占位符。代理控制对原始对象的访问,允许你在请求到达原始对象之前或之后执行某些操作。问题描述为什么要控制对对象的访问?这里有一个例子:你有一个巨大的对象,它消耗了大量的系统资源。你有时需要它,但并不总是如此。你可以实现惰性初始化:只在实际需要时创建此对象。对象的所有客户端都需要执行...
设计模式之桥接(Bridge)模式
意图桥接模式(Bridge)是一种结构型设计模式,可以将一个大型类或一组密切相关的类拆分为两个独立的层次结构——抽象和实现——它们可以相互独立地开发。问题描述抽象?实现?听起来很吓人?请保持冷静,我们来思考一个简单的示例。假设你有一个几何形状 shape 类,它有一对子类:Circle 和 Square。你想扩展这个类层次结构以合并颜色,所以你计划创建 Re...
设计模式之适配器(Adapter)模式
又名 Wrapper。Adapter 是一种结构型设计模式,他允许有着不兼容接口的对象进行合作。问题描述假设你创建了一个股票市场监测应用。该应用以 XML 格式从多个源下载股票数据,然后为用户显示了优美的图表。在某个时刻,你决定整合一个智能的第三方分析库,改进应用。但有一个问题:分析库只适用于 JSON 格式的数据。您可以修改库以使用 XML。但是,这可能...
设计模式之观察者(Observer)模式
又名: 事件订阅者(Event-Subscriber), 监听者(Listener)。观察者模式(Observer)是一种行为设计模式,允许你定义一个订阅机制,用以向多个对象通知他们正在观察的对象发生的任何事件。问题描述假设你有两类对象: Customer 和 Store。顾客(customer)对特定品牌的产品非常感兴趣(比如 iphone 的...