随笔分类 -  设计模式

摘要:1. 概述 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。2. 解决的问题 主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同的一系列类当中,可以把复杂的逻辑判断简单化。3. 模式中的角色 3.1 上下文环境(Context):它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关的操作委托给当前的Concrete State对象来处理。 3.2 抽象状态(State):定义一个接口以封装使用上下文环境的的一个特定状态相关的行为。 3.3 具体状态(Concrete State):实现抽象状态定义的接... 阅读全文
posted @ 2012-07-16 14:45 Wang Juqiang 阅读(85489) 评论(13) 推荐(13) 编辑
摘要:1. 概述 有时被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。2. 解决的问题 将一个系统分割成一个一些类相互协作的类有一个不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便。观察者就是解决这类的耦合关系的。3. 模式中的角色 3.1 抽象主题(Subject):它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。 ... 阅读全文
posted @ 2012-07-12 16:24 Wang Juqiang 阅读(252154) 评论(20) 推荐(23) 编辑
摘要:1. 概述 将一个请求封装为一个对象(即我们创建的Command对象),从而使你可用不同的请求对客户进行参数化; 对请求排队或记录请求日志,以及支持可撤销的操作。2. 解决的问题 在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。3. 模式中角色 3.1 抽象命令(Command):定义命令的接口,声明执行的方法。 3.2 具体命令(ConcreteCommand):具体命令,实现要执行的方法,它通常是“虚”的实现;通常会有接收者,并调用接收者的功能来完成命令要执行的操作。... 阅读全文
posted @ 2012-07-11 13:30 Wang Juqiang 阅读(29914) 评论(4) 推荐(4) 编辑
摘要:1. 概述 为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。2. 模式中的角色 2.1 外观类(Facade):外观类知道哪些子系统类负责处理请求,将客户的请求代理给恰当的子系统对象。 2.2 子系统类集合(SubSystem Classes):子系统类集合实现了子系统的功能,处理外观类对象指派的任务。3. 模式解读 3.1 外观模式的类图 3.2 外观模式的代码实现 /// <summary> /// 子系统中的一个类 /// </summary> public class SubSystemOne ... 阅读全文
posted @ 2012-07-10 18:12 Wang Juqiang 阅读(8653) 评论(7) 推荐(1) 编辑
摘要:1. 概述 定义一个操作中的算法的骨架,而将步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义算法的某些特定步骤。2. 模式中的角色 2.1 抽象类(AbstractClass):实现了模板方法,定义了算法的骨架。 2.2 具体类(ConcreteClass):实现抽象类中的抽象方法,已完成完整的算法。3. 模式解读 3.1 模板方法类图 3.2 模板方法模式代码实现 /// <summary> /// 抽象类 /// </summary> public abstract class AbstractClass { /... 阅读全文
posted @ 2012-07-09 18:17 Wang Juqiang 阅读(42510) 评论(4) 推荐(5) 编辑
摘要:1. 概述 将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。2. 解决的问题 即Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。3. 模式中的角色 3.1 目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。 3.2 需要适配的类(Adaptee):需要适配的类或适配者类。 3.3 适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。 4. 模式解读 注:在GoF的设计模式中,对适配器模式讲了两种类型,类适配器模式和对... 阅读全文
posted @ 2012-07-09 13:36 Wang Juqiang 阅读(109003) 评论(15) 推荐(17) 编辑
摘要:1. 概述 将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。2. 解决的问题 当希望忽略单个对象和组合对象的区别,统一使用组合结构中的所有对象(将这种“统一”性封装起来)。3. 组合模式中的角色 3.1 组合部件(Component):它是一个抽象角色,为要组合的对象提供统一的接口。 3.2 叶子(Leaf):在组合中表示子节点对象,叶子节点不能有子节点。 3.3 合成部件(Composite):定义有枝节点的行为,用来存储部件,实现在Component接口中的有关操作,如增加(Add)和删除(Remove)。4. 模式解读 ... 阅读全文
posted @ 2012-07-06 14:18 Wang Juqiang 阅读(4334) 评论(2) 推荐(1) 编辑
摘要:1. 概述 将抽象部分(Abstraction)与实现部分(Implementor)分离,使它们可以独立地变化。2. 解决的问题 在软件系统中,有些类型由于自身的逻辑,它具有两个或多个维度的变化。为了解决这种多维度变化,又不引入复杂度,这就要使用Bridge模式。3. 模式中的角色 2.1 抽象(Abstraction):定义抽象接口,该接口中包含实现具体行为、具体特征的Implementor接口。 2.2 提炼的抽象(RefinedAbstraction):继承自Abstraction的子类,依旧是一个抽象的事物名。 2.3 实现(Implementor):定义具体行为,具体特... 阅读全文
posted @ 2012-07-05 17:47 Wang Juqiang 阅读(5001) 评论(1) 推荐(1) 编辑
摘要:1. 设计模式的重要性 1.1设计模式解决的是在软件过程中如何来实现具体的软件功能。实现同一个功能的方法有很多,哪个设计容易扩展,容易复用,松耦合,可维护?设计模式指导我们找到最优方案。 1.2设计中往往会存在设计缺陷,这些缺陷包括: 僵化性:难以对软件进行改动,即使在功能上来看是很小的改动 脆弱性:在进行很小的改动时,可能导致很多地方出现问题 顽固性:要把系统中某些通用的功能分离出来的努力和风险非常巨大 粘滞性:当面临改动时,改动的方案有很多,一些会保持设计,一些会破坏设计,当采用保持设计的方法比用破坏设计的方法更难应付变化时,说明原设计具有较高的粘滞性 晦... 阅读全文
posted @ 2012-07-05 13:37 Wang Juqiang 阅读(3156) 评论(10) 推荐(5) 编辑
摘要:1. 概述 为其它对象提供一种代理以控制对这个对象的访问。 解决的问题:如果直接访问对象比较困难,或直接访问会给使用者或系统带来一系列问题。这样对于客户端(调用者)来说,就不需要直接与真实对象进行交互,解除了调用者与真实对象的耦合。2. 模式中的角色 2.1 抽象实体(Subject):定义了真实实体(RealSubject)和代理(Proxy)的公共接口,这样就在任何时候使用真实实体(RealSubject)的地方使用代理(Proxy)。 2.2 代理(Proxy):保存一个引用使得代理可以直接访问真实实体,并提供一个与Subject的接口相同的接口,这样代理就可以代替真实实体。 ... 阅读全文
posted @ 2012-07-04 11:40 Wang Juqiang 阅读(5461) 评论(1) 推荐(2) 编辑
摘要:1. 概述 动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更灵活。 原理:增加一个修饰类包裹原来的类,包裹的方式一般是通过在将原来的对象作为修饰类的构造函数的参数。装饰类实现新的功能,但是,在不需要用到新功能的地方,它可以直接调用原来的类中的方法。修饰类必须和原来的类有相同的接口。2. 模式中的角色 2.1 抽象构建(Component):定义一个抽象接口,用以给这些对象动态地添加职责。 2.2 具体构建(ConcreteComponent):定义一个具体的对象,也可以给这个对象添加一些职责。 2.3 装饰类(Decorator): 装饰抽象类,继承了Comp... 阅读全文
posted @ 2012-07-03 15:00 Wang Juqiang 阅读(8091) 评论(3) 推荐(2) 编辑
摘要:在讲策略模式之前,我先给大家举个日常生活中的例子,从首都国际机场到XXX酒店,怎么过去?1)酒店接机服务,直接开车来接。2)打车过去。3)机场快轨+地铁 4)机场巴士 5)公交车 6)走路过去(不跑累死的话) 等等。使用方法,我们都可以达到从机场到XXX酒店的目的,对吧。那么我所列出的从机场到XXX酒店的的方法,就是我们可以选择的策略。 再举个例子,就是我们使用WCF时,往往避免不了对它进行扩展,例如授权,我们可以通过自定义授权来扩展WCF。这里我们可以通过自定义AuthorizationPolicy和ServiceAuthorizationManager来实现对它的扩展,这是策略模式的... 阅读全文
posted @ 2012-07-03 10:35 Wang Juqiang 阅读(7765) 评论(3) 推荐(2) 编辑
摘要:设计模式 阅读全文
posted @ 2012-07-02 15:00 Wang Juqiang 阅读(7705) 评论(0) 推荐(3) 编辑
摘要:1. 概述: 定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到子类。2. 模式中的角色 2.1 抽象工厂(Creator):这个抽象类(或接口)声明一个创建对象的工厂方法,用来返回一个Product类型的对象。 2.2 具体工厂(ConcreteCreator):重定义工厂方法,返回一个具体的Concrete Product实例。 2.3 抽象产品(Product):定义工厂方法所创建的对象。 2.4 具体产品(ConcreteProduct): 具体产品,继承自Product抽象类。3. 模式解读 3.1工厂方法模式的一般化类图 ... 阅读全文
posted @ 2012-07-02 10:33 Wang Juqiang 阅读(3584) 评论(0) 推荐(0) 编辑
摘要:1. 描述: 保证一个类仅有一个实例,并提供一个访问它的全局访问点。2. 单例模式主要有3个特点,: 2.1 单例类确保自己只有一个实例。 2.2 单例类必须自己创建自己的实例。 2.3 单例类必须为其他对象提供唯一的实例。3. 实现方式:懒汉单例类和饿汉单例类 3.1懒汉式单例类 对于懒汉模式,我们可以这样理解:该单例类非常懒,只有在自身需要的时候才会行动,从来不知道及早做好准备。它在需要对象的时候,才判断是否已有对象,如果没有就立即创建一个对象,然后返回,如果已有对象就不再创建,立即返回。懒汉模式只在外部对象第一次请求实例的时候才去创建。 3.2饿汉式单例 对于饿汉... 阅读全文
posted @ 2012-06-28 16:45 Wang Juqiang 阅读(4421) 评论(3) 推荐(2) 编辑
摘要:1. 概述 通过复制一个已经存在的实例来创建一个新的实例。被复制的实例被称为原型,这个原型是可定制的。2. 模式中的角色 2.1 抽象原型类(Abstract Prototype):提供一个克隆接口 2.2 具体原型类(Concrete Prototype): 及实现了克隆接口的具体原型类3. 实例:求职网站上现在都支持多份简历,如果每创建一份简历都要从头至尾地填写一遍,那也是非常让人沮丧的事。其实针对我们的求职岗位的不同,不同的简历可能只要修改局部内容就可以了,而不用全部重新构建一份新的简历。复制一份简历,然后做局部修改是最让人省心的了! 3.1 实现类图 类图解读 在.NE... 阅读全文
posted @ 2012-06-28 12:42 Wang Juqiang 阅读(2965) 评论(0) 推荐(1) 编辑
摘要:1. 概述 将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。2. 建造者模式中的角色 2.1 建造者(Builder):为创建一个产品对象的各个部件指定抽象接口。 2.2 具体建造者(ConcreteBuilder):实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并 提供一个检索产品的接口。 2.3 指挥者(Director):指挥并构造一个使用Builder接口的对象。 2.4 产品(Product):表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,... 阅读全文
posted @ 2012-06-27 16:46 Wang Juqiang 阅读(3280) 评论(1) 推荐(2) 编辑
摘要:1. 概述 抽象工厂模式为一个产品家族提供了统一的创建接口。当需要这个产品家族的某一系列的时候,可以从抽象工厂中选出相对应的系列来创建一个具体的工厂类别。2. 抽象工厂模式中的角色 2.1 抽象工厂(AbstractFactory):担任这个角色的是工厂方法模式的核心,它是与应用系统商业逻辑无关的。 2.2 具体工厂(ConcreteFactory):这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。 2.3 抽象产品(AbstractProduct):担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共... 阅读全文
posted @ 2012-06-27 13:34 Wang Juqiang 阅读(3404) 评论(3) 推荐(1) 编辑