随笔分类 -  设计

1 2 下一页

摘要:行为型模式一:观察者模式、模板方法、命令、状态和职责链1.观察者:定义对象间一对多的依赖关系,一个对象改变,所有依赖它的对象会得到通知。目标和观察者订阅关系。2.模板方法:将操作骨架改变的部分在子类中重定义,而且不变的部分不会在子类中重定义。通过继承机制实现代码的重用和重写。3.命令;将发出命令的职责和执行命令的职责分开来。命令的请求和命令的执行4.状态:支持一个对象的内部状态改变时改变它的行为。条件分支语句如果条件会面临5.职责链:动态地组织责任分配链,请求在这个链上传递,直到链上的某个对象得到处理。将命令的请求和执行分离,并且执行的具体对象在运行时沿着设定好的职责链确定的,有一个询问机制存 阅读全文

posted @ 2013-10-28 14:55 豆沙包没有肉 阅读(199) 评论(0) 推荐(0)

摘要:结构型模式(7):适配器、装饰、桥接、组合、享元、外观和代理模式。适配器:生成一个适配器,包括当前接口的同时还能适应新的接口。最佳实践:一般是已存在系统的适配协同。桥接:一个类的实现部分面临改变,可以将实现部分抛离出来,就是将具体的实现抛离。最佳实践:用聚合代替继承。组合:统一地操作简单对象和复杂对象,接口是统一的,操作是一致的,模糊二者的操作手法。最佳实践:文件系统。装饰:再不改变对象的本质下动态地给对象添加一些功能。外观:为子类接口组提供一个统一的接口,聚合子系统。享元:运用共享技术支持大量的细粒度的对象。代理:提供代理控制对象的访问。 阅读全文

posted @ 2013-10-25 15:37 豆沙包没有肉 阅读(129) 评论(0) 推荐(0)

摘要:创建型模式(5):单例、工厂方法、抽象工厂、建造者和原型模式。抽象工厂:抽象出创建一些列产品的类。最佳实践:.NET中的 DbProviderFactory、SqlClientFactory建造者:将复杂对象的构建和实现分离(表现),构建过程稳定,实现可变。最佳实践:.NET中的StringBuilder(简单实现)。工厂方法:将一个类的实例化延迟到子类。最佳实践:有抽象的地方并且使用父类表示子类的都是工厂方法的最佳实践。原型:用原型实例的拷贝来创建新的对象。最佳实践:.NET中的DataSet的Clone和Copy方法。单例:一个类仅仅允许有一个实例。 阅读全文

posted @ 2013-10-25 15:35 豆沙包没有肉 阅读(140) 评论(0) 推荐(0)

摘要:代码1:访问者//状态 abstract class Action { //得到男人结论或反应 public abstract void GetManConclusion(Man concreteElementA); //得到女人结论或反应 public abstract void GetWomanConclusion(Woman concreteElementB); } //成功 class Success : Action { public override void GetManCo... 阅读全文

posted @ 2013-10-10 17:55 豆沙包没有肉 阅读(211) 评论(0) 推荐(0)

摘要:Interpreter模式,即解释器模式。解释器模式属于行为模式,Gof是这样定义的:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。解释器模式需要解决的是,如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。实例应用:正则表达式代码1:需要解释的表达式//表达式 abstract class Expression { //解释器 public void Interpret(PlayContext... 阅读全文

posted @ 2013-10-10 17:36 豆沙包没有肉 阅读(254) 评论(0) 推荐(0)

摘要:享元模式(英语:Flyweight Pattern)是一种软件设计模式。它使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件;它适合用于当大量物件只是重复因而导致无法令人接受的使用大量内存。通常物件中的部分状态是可以分享。常见做法是把它们放在外部数据结构,当需要使用时再将它们传递给享元。代码1:享元,可以复用的对象 //网站 abstract class WebSite { public abstract void Use(User user); } //具体的网站 class ConcreteWebSite : WebSit... 阅读全文

posted @ 2013-10-10 17:13 豆沙包没有肉 阅读(259) 评论(0) 推荐(0)

摘要:所谓中介者模式就是用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 通过定义我们可以看出中介者主要是通过中介对象来封装对象之间的关系,使之各个对象在不需要知道其他对象的具体信息情况下通过中介者对象来与之通信。同时通过引用中介者对象来减少系统对象之间关系,提高了对象的可复用和系统的可扩展性。 但是就是因为中介者对象封装了对象之间的关联关系,导致中介者对象变得比较庞大,所承担的责任也比较多。它需要知道每个对象和他们之间的交互细节,如果它出问题,将会导致整个系统都会出问题。所以它比较容易应用也很容易误用。故当系统中出现了“ 阅读全文

posted @ 2013-10-10 16:44 豆沙包没有肉 阅读(206) 评论(0) 推荐(0)

摘要:职责链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。 代码1:处理对 阅读全文

posted @ 2013-10-10 16:15 豆沙包没有肉 阅读(261) 评论(0) 推荐(0)

摘要:命令模式将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。命令模式的本质是对命令进行封装,将发出命令的责任和执行命令的责任分割开,实现二者之间的松耦合。代码1:命令接收者 //烤肉串者 public class Barbecuer { public void BakeMutton() { Console.WriteLine("烤羊肉串!"); } public void BakeChickenWing() { ... 阅读全文

posted @ 2013-10-10 16:00 豆沙包没有肉 阅读(221) 评论(0) 推荐(0)

摘要:在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度?这就要使用Bridge模式。代码1:抽象部分,将实现部分剥离后的部分/ public abstract class AbstractRoad { protected AbstractCar car; public AbstractCar Car { set { car = valu... 阅读全文

posted @ 2013-10-10 14:52 豆沙包没有肉 阅读(246) 评论(0) 推荐(0)

摘要:单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。单例模式最初的定义出现于《设计模式》(艾迪生维斯理, 1194):“保证一个类仅有一个实例,并提供一个访问它的全局访问点。”.NET中单例模式定义:“一个类有且仅有一个实例,并且自行实例化向整个系统提供。”对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管 阅读全文

posted @ 2013-10-10 11:50 豆沙包没有肉 阅读(251) 评论(0) 推荐(0)

摘要:提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。[GOF《设计模式》]在面向对象的软件设计中,我们经常会遇到一类集合对象,这类集合对象的内部结构可能有着各种各样的实现,但是归结起来,无非有两点是需要我们去关心的:一是集合内部的数据存储结构,二是遍历集合内部的数据。面向对象设计原则中有一条是类的单一职责原则,所以我们要尽可能的去分解这些职责,用不同的类去承担不同的职责。Iterator模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明的访问集合内部的数据。代码1:迭代器public interface II 阅读全文

posted @ 2013-10-10 11:33 豆沙包没有肉 阅读(176) 评论(0) 推荐(0)

摘要:有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。代码1:叶子节点//人力资源部 class HRDepartment : Company { public HRDepartment(string name) : base(name) { } public override void Add(Company c) { } public override v... 阅读全文

posted @ 2013-10-10 11:15 豆沙包没有肉 阅读(169) 评论(0) 推荐(0)

摘要:备忘录模式(Memento Pattern)又叫做快照模式(Snapshot Pattern)或Token模式,是GoF的23种设计模式之一,属于行为模式。定义(源于GoF《设计模式》):在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。代码1:备忘需求的发起者 class GameRole { //生命力 private int vit; public int Vitality { get { return vit; } ... 阅读全文

posted @ 2013-10-10 10:41 豆沙包没有肉 阅读(195) 评论(0) 推荐(0)

摘要:适配器模式(Adapter),其含义是将一个类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作了。因此适配器的主要作用就是完成旧接口到新接口的转换;将“既有系统“进行封装,逻辑上客户程序应该不知道”既有系统“的存在,将变化隔离在适配器部分;如果客户程序需要迁移,仅需要在适配器部分进行修改。其适用性:你想使用一个已经存在的类,而它的接口不符合你的要求,你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可以不一定兼容的类)协同工作,你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象 阅读全文

posted @ 2013-10-09 18:02 豆沙包没有肉 阅读(234) 评论(0) 推荐(0)

摘要:状态模式(State),其含义是允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。书中的例子是Tcp连接的状态,处于Established,Listening,Closed等,当一个连接对象收到其他对象的请求时,根据自身的当前状态做出不用的反应。又或者一个人在心情不同的时候对待同一件事会有不同的做法。以状态为原子来改变它的行为,而不是通过行为来改变状态呢?于是你就学到了状态模式。其适用性:一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为,一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示。通常有多 阅读全文

posted @ 2013-10-09 15:29 豆沙包没有肉 阅读(199) 评论(0) 推荐(0)

摘要:观察者模式属于行为型模式,其意图是定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这一个模式的关键对象是目标(Subject)和观察者(Observer)。一个目标可以有任意数目的依赖它的观察者,一旦目标的状态发生改变,所有的观察者都得到通知,作为对这个通知的响应,每个观察者都将查询目标以使其状态与目标的状态同步。适用场景:观察者模式,用于存在一对多依赖关系的对象间,当被依赖者变化时,通知依赖者全部进行更新。因此,被依赖者,应该有添加/删除依赖者的方法,且可以将添加的依赖者放到一个容器中;且有一个方法去通知依赖者进行更新。代码1:主题,当 阅读全文

posted @ 2013-10-09 14:46 豆沙包没有肉 阅读(199) 评论(0) 推荐(0)

摘要:在软件开发中,也会存在一些构造非常复杂的对象,这些对象拥有一系列的成员属性,这些成员属性有些是基本数据类型,有些是引用类型,总之就是一句话,这个对象的构建比较复杂。在这里我们就将复杂对象当做汽车,成员属性当做部件,对象的构建当做汽车的组合。对于用户而言我们总是希望我们在使用对象时足够简单,如果一个复杂的对象直接丢给用户,用户会是痛苦不堪的(给你一堆部件,你来组装成一辆汽车看看),除了这个构建的过程外,可能用户会忘记某些成员属性。所以我们就希望能够像使用汽车一样使用复杂的对象:直接告诉你我需要的对象名或者对象类型,你返回一个完成的对象实例给我。建造者返回给客户一个完整的的产品对象,而客户端无须关 阅读全文

posted @ 2013-10-09 14:17 豆沙包没有肉 阅读(178) 评论(0) 推荐(0)

摘要:Facade外观模式,是一种结构型模式,它主要解决的问题是:组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合面临很多变化的挑战。在这里我想举一个例子:比如,现在有一辆汽车,我们(客户程序)要启动它,那我们就要发动引擎(子系统1),使四个车轮(子系统2)转动。但是实际中我们并不需要用手推动车轮使其转动,我们踩下油门,此时汽车再根据一些其他的操作使车轮转动。油门就好比系统给我们留下的接口,不论汽车是以何种方式转动车轮,车轮变化成什么牌子的,我们要开走汽车所要做的还是踩下油门。GoF《设计模式》中说道:为子系统中的一组接口提供一个一致的界面,Faca 阅读全文

posted @ 2013-10-09 11:51 豆沙包没有肉 阅读(265) 评论(0) 推荐(0)

摘要:模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。模板方法模式是通过把不变的行为搬移到超类,去除子类中的重复代码来体现它的优势的。也就提供了一个很好的代码复用平台。如果以后遇到这种情况:有一个过程需要执行,这个过程包括一系列步骤,整个过程从高层次看是一样的,但是每个步骤的具体细节不一样,这时我们就可以考虑这种模板方法模式了。即当不变的行为和可变的行为在类中混在一起的时候,不变的行为就会在子类中重复出现,这是通过模板方法模式把这些行为搬移到单一的地方实现(超类),而把不同的部分在子类实现,这就使子类摆脱了重 阅读全文

posted @ 2013-10-09 11:39 豆沙包没有肉 阅读(225) 评论(0) 推荐(0)

1 2 下一页

导航