随笔分类 - 设计模式
摘要:1:面向对象的三要素1.1 封装【EncapSulation】A 封装=合理的隐藏数据的隐藏【隐藏在方法背后】实现的隐藏【隐藏在接口背后】变化的隐藏【隐藏在抽象背后】B 封装能够提高对象的复用性减低对象的耦合度C 良好的封装=对象的高内聚 1.2 继承【Inheritance】A 基于差异式编程B 继承与合成/聚合合成/聚合复用原则B 继承的方式类的继承接口的继承C 继承与实现1.3 多态【Pol...
阅读全文
摘要:1:意图 为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。 2:类图 3:代码 namespace Bll.ChainOfResponsibility { public class MSGEntity { //信息内容 private string conte...
阅读全文
摘要:Terrylee,2006年3月 摘要:面向对象的思想很好地解决了抽象性的问题,一般也不会出现性能上的问题。但是在某些情况下,对象的数量可能会太多,从而导致了运行时的代价。那么我们如何去避免大量细粒度的对象,同时又不影响客户程序使用面向对象的方式进行操作? 本文试图通过一个简单的字符处理的例子,运用重构的手段,一步步带你走进Flyweight模式,在这个过程中我们一同思考、探索、权衡,通过比较而得...
阅读全文
摘要:概述 在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的。那么如何应对这种“迁移的变化”?如何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口?这就是本文要说的Adapter 模式。 意图 将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作...
阅读全文
摘要:1:概述 在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合,比如要对行为进行“记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。这就是本文要说的Command模式。 2:意图 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行...
阅读全文
摘要:1:意图 表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 2:类图 3:代码 namespace Bll.Visitor { //实体 public class EntityMessage { private string msg; private DateTime date...
阅读全文
摘要:1:意图 代理(Proxy)模式给某一个对象提供一个代理,并由代理对象控制对原对象的引用。 代理模式的英文叫做Proxy或Surrogate,中文都可译成"代理"。所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。2:类图 抽象主题角色(Subject):...
阅读全文
摘要:1:简介 装饰(Decorator)模式又名包装(Wrapper)模式[GOF95]。装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。2:类图 抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。 具体构件(Concrete Component)角色:定义一个将要接收附加责任的类。 装饰(Decorator)角色:持有一个构件(C...
阅读全文
摘要:1:概述 用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。简单点来说,将原来两个直接引用或者依赖的对象拆开,在中间加入一个“中介”对象,使得两头的对象分别和“中介”对象引用或者依赖2:类图1) 抽象中介者(Mediator)角色:抽象中介者角色定义统一的接口用于各同事角色之间的通信。 2) 具体中介者(Conc...
阅读全文
摘要:1:概述 合成模式有时又叫做部分-整体模式(Part-Whole)。合成模式将对象组织到树结构中,可以用来描述整体与部分的关系。合成模式可以使客户端将单纯元素与复合元素同等看待。2:类图 抽象构件(Component)角色:这是一个抽象角色,它给参与组合的对象规定一个接口。这个角色给出共有接口及其默认行为。 树叶构件(Leaf)角色:代表参加组合的树叶对象。一个树叶对象没有下级子对象。树枝...
阅读全文
摘要:1:意图 在软件开发系统中,客户程序经常会与复杂系统的内部子系统之间产生耦合,而导致客户程序随着子系统的变化而变化。那么如何简化客户程序与子系统之间的交互接口?如何将复杂系统的内部子系统与客户程序之间的依赖解耦?这就是要说的Façade 模式。(外部与一个子系统的通信必须通过一个统一的门面(Facade)对象进行,这就是门面模式)2:类图3:代码 /**//// /// 声音子系...
阅读全文
摘要:1:概述 将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化 抽象化 存在于多个实体中的共同的概念性联系,就是抽象化。作为一个过程,抽象化就是忽略一些信息,从而把不同的实体当做同样的实体对待。 实现化 抽象化给出的具体实现,就是实现化。 脱耦 所谓耦合,就是两个实体的行为的某种强关联。而将它们的...
阅读全文
摘要:1:概述建造者模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。2:使用场景 对象性质的建造 有些情况下,一个对象会有一些重要的性质,在它们没有恰当的值之前,对象不能作为一个完整的产品使用。比如,一个电子邮件有发件人地址、收件人地址、主题、内容、附录等部分,而在最起码的收件人地址未被赋值之前,这个电子邮件不能发出。 ...
阅读全文
摘要:A:Creational Pattern:抽象了对象的实例化过程 1:Abstract Factory Pattern 提供一个创建一系列相关或相互依赖对象的接口,而无需...
阅读全文
摘要:1:概述 原型模式的用意是:通过给出一个原型对象来指明所要创建的对象类型,然后用复制这个原型对象的办法创建出更多的同类型对象。2:C#对原型模式的支持 在C#里面,我们可以很容易的通过Clone()方法实现原型模式。任何类,只要想支持克隆,必须实现C#中的ICloneable接口。ICloneable接口中有一Clone方法,可以在类中复写实现自定义的克隆方法。克隆的实现方法有...
阅读全文
摘要:1:使用场景 A: 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有形态的工厂模式都是重要的。 B:这个系统有多于一个的产品族,而系统只消费其中某一产品族。 C:同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。 D:系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现。2:构成 ...
阅读全文
摘要:1:概述 工厂方法(FactoryMethod)模式是类的创建模式,其用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。 工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。 在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这个核心类仅仅负责给出具体工厂必须实现的接口...
阅读全文
摘要:特点: 1:单例类只能有一个实例。 2:单例类必须自己创建自己的唯一实例。 3:单例类必须给所有其它对象提供这一实例。应用: 每台计算机可以有若干个打印机,但只能有一个Printer Spooler,避免两个打印作业同时输出到打印机。 一个具有自动编号主键的表可以有多个用户同时使用,但数据库中只能有一个地方分配下一个主键编号。否则会出现主键重复。代码实现...
阅读全文
摘要:The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it.个人理解:策略模式定义了一系列的算法,并将每...
阅读全文
摘要:(观察者封装了观察者和观察方法这两个变化点,重要的还是观察方法。)个人理解针对软件构建过程中,某些对象存在的“通知依赖关系”(如果目标对象的状态发生改变将通知所有的依赖对象)。我们可以利用抽象类或者接口在消息发出对象中建立通知耦合关系,也可以通过事件与委托在被通知对象中建立通知这种藕和关系。效果及实现要点1.使用面向对象的抽象,Observer模式使得我们可以独立地改变目标...
阅读全文