摘要:
这篇文章讨论:模式与WPFMVP模式为什么MVVM更加适用于WPF用MVVM构建一个应用程序内容: 专业的软件用户界面开发不太简单。它可能混杂了数据、交互设计、视觉设计、连接、多线程、安全性、国际化、验证、单元测试以及可触摸技术。考虑到用户界面暴露了系统的底层并且必须满足用户的不可预知的需求,它可能是许多应用程序中最不稳定的部分。有一些常用的设计模式可以解决这个问题,但是隔离并且访问这些关注点可能比较难。模式越是复杂,更多的捷径可能会被用到,这些捷径渐渐的破坏了以前所有正确方式做事情的努力。 不总是设计模式的问题。有时候我们会用到复杂的设计模式,由于现有的UI平台不能提供一个很好的设计模式.. 阅读全文
随笔分类 - 3.程序设计
C#面向对象设计模式纵横谈 笔记11 Facade外观(结构型模式)
2011-09-30 09:51 by lujiao_cs, 389 阅读, 收藏,
摘要:
系统的复杂度假设我们需要开发一个坦克模拟系统用于模拟坦克车在各种作战环境中的行为,其中坦克系统由引擎、控制器、车轮、车身等各子系统构成。如何使用这样的系统A方案B方案动机(Motivation)上述A方案的问题在于组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合面临很多变化的挑战。如何简化外部客户程序和系统间的交互接口?如何将外部客户程序的演化和内部子系统的变化之间的依赖相互解耦?意图(Intent)为子系统中的一组接口提供一个一致的界面,Façade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 ——《设计模式》Go. 阅读全文
C#面向对象设计模式纵横谈 笔记10 Decorator 装饰(结构型模式)
2011-09-12 20:52 by lujiao_cs, 457 阅读, 收藏,
摘要:
子类复子类,子类何其多假如我们需要为游戏中开发一种坦克,除了各种不同型号的坦克外,我们还希望在不同场合中为其增加以下一种或多种功能:比如红外线夜视功能,比如水陆两栖功能,比如卫星定位功能等等。// 抽象坦克public abstract class Tank { public abstract Shot(); public abstract Run();}//各种不同功能的组合public class T50A: T50, IA {…}public class T50B: T50, IB {…}public class T50C: T50, IC {…}public class T50A... 阅读全文
C#面向对象设计模式纵横谈 笔记9 Composite 组合(结构型模式)
2011-09-12 15:08 by lujiao_cs, 384 阅读, 收藏,
摘要:
对象容器的问题在面向对象系统中,我们常会遇到一类具有“容器”特征的对象——即它们在充当对象的同时,又是其他对象的容器。public class SingleBox: IBox{ public void process() { ……}}public class ContainerBox :IBox{ public void process(){……} public ArrayList getBoxes(){……}}如果我们要对这样的对象容器进行处理:(客户程序,它必须知道ContainerBox的内部结构。此段客户代码与对象结构代码耦合度太紧,最好是依赖抽象接口的,如:依赖IBox接口。)... 阅读全文
C#面向对象设计模式纵横谈 笔记15 Command 命令(行为型模式)
2011-09-10 00:09 by lujiao_cs, 398 阅读, 收藏,
摘要:
耦合与变化耦合是软件不能抵御变化灾难的根本性原因。不仅实体对象与实体对象之间存在耦合关系,实体对象与行为操作之间也存在耦合关系。动机(Motivation)在软件构建过程中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合——比如需要对行为进行“记录、撤销/重做(undo/redo)、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。(“直接依赖”——>“间接依赖”)意图(Intent)将一个请求封装为一个对象,从而使你可用不同的请求对客户(行为的请求者)进行参数化; 阅读全文
C#面向对象设计模式纵横谈 笔记8 Bridge 桥接(结构型模式)
2011-09-04 21:41 by lujiao_cs, 283 阅读, 收藏,
摘要:
抽象与实现 抽象不应该依赖于实现细节,实现细节应该依赖于抽象。抽象B ——稳定实现细节b ——变化问题在于如果抽象B由于固有的原因,本身并不稳定,也有可能变化,怎么办?举例来说假如我们需要开发一个同时支持PC和手机的坦克游戏,游戏在PC和手机上功能都一样,都有同样的类型,面临同样的功能需求变化,比如坦克可能有多种不同的型号:T50,T75,T90等。对于其中的坦克设计,我们可能很容易设计出来一个Tank的抽象基类,然后各种不同型号的Tank继承自该类(利用抽象类和具体类表达变化)://抽象部分public abstract class Tank{ public abstract ... 阅读全文
C#面向对象设计模式纵横谈 笔记7 Adapter 适配器(结构型模式)
2011-08-22 00:59 by lujiao_cs, 308 阅读, 收藏,
摘要:
适配(转换)的概念无处不在 适配,即在不改变原有实现的基础上,将原先不兼容的接口转换为兼容的接口。动机(Motivation)在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的。如何应对这种“迁移的变化”?如何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口?意图(Intent)将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 ——《设计模式》GoF例说Adapter应用Codesin.NET /// <summary> 阅读全文
C#面向对象设计模式纵横谈 笔记6 Prototype 原型(创建型模式)
2011-08-20 23:38 by lujiao_cs, 272 阅读, 收藏,
摘要:
依赖关系的倒置抽象不应该依赖于实现细节,实现细节应该依赖于抽象。1)抽象A直接依赖于实现细节b(很容易出现这种情况)人 ——> 陶瓷水杯2)抽象A依赖于抽象B,实现细节b依赖于抽象B(将实现细节b抽象出一个抽象B)人 ——> 水杯 <——陶瓷水杯动机(Motivation) 在软件系统中,经常面临着“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的接口。 如何应对这种变化?如何向“客户程序(使用这些对象的程序)”隔离出“这些易变对象”,从而使得“依赖这些易变对象的客户程序”不随着需求改变而改变?意图(Intent)使用 阅读全文
C#面向对象设计模式纵横谈 笔记5 Factory Method 工厂方法(创建型模式)
2011-08-19 18:40 by lujiao_cs, 277 阅读, 收藏,
摘要:
写在前面对设计模式的误区:对设计模式结构和代码的追求,不能抓住设计模式的要点,遇到变化的情况可能就不知道设计模式如何应用、代码改如何变化。因为不同的代码可能表示相同的设计模式,而相似的代码可能表示不同的设计模式。所以,设计模式应该关注耦合关系。设计模式和语言关系不大,任何语言都可以表达设计模式,只不过面向对象语言更加富于表现力。对代码的关注应该在理解了设计模式本身理念之后。从耦合关系谈起耦合关系直接决定着软件面对变化时的行为:1)模块与模块之间的紧耦合使得软件面对变化时,相关的模块都要随之更改。<图1>2)模块与模块之间的松耦合使得软件面对变化时,一些模块更容易被替换或者更改,但其 阅读全文
C#面向对象设计模式纵横谈 笔记1. 面向对象设计模式与原则
2011-08-19 01:10 by lujiao_cs, 269 阅读, 收藏,
摘要:
设计模式简介1)每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。 ——ChristopherAlexander2)设计模式描述了软件设计过程中某一类常见问题的一般性的解决方案。3)面向对象设计模式描述了面向对象设计过程中、特定场景下、类与相互通信的对象之间常见的组织关系。GoF23种设计模式1)历史性著作《设计模式:可复用面向对象软件的基础》一书中描述了23种经典面向对象设计模式,创立了模式在软件设计中的地位。该书四位作者被人们并称为GangofFour(GoF),“四人组”,该书描述的23种经典设计模式又被人们称为GoF23种设计模式。2)由于《设计模式:可.. 阅读全文
C#面向对象设计模式纵横谈 笔记4 Builder 生成器(创建型模式)
2011-08-14 21:47 by lujiao_cs, 270 阅读, 收藏,
摘要:
Builder模式的缘起1)假设创建游戏中的一个房屋House设施,该房屋的构建由几个部分组成,且各个部分要富于变化。2)如果使用最直观的设计方法,每一个房屋部分的变化,都将导致房屋构建的重新修正。动机(Motivation) 在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。 如何应对这种变化?如何提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持系统中的“稳定构建算法”不随着需求改变而改变?(在新的需求动态变化的过程中,分析处系统比 阅读全文
C#面向对象设计模式纵横谈 笔记3 抽象工厂(创建型模式)
2011-06-13 08:35 by lujiao_cs, 392 阅读, 收藏,
摘要:
new的问题常规的对象创建方法://创建一个Road对象Roadroad=newRoad();new的问题:–实现依赖,不能应对“具体实例化类型”的变化。解决思路:–封装变化点(学习设计模式的核心)——哪里变化,封装哪里–潜台词:如果没有变化,当然不需要额外的封装!业务对象变化频繁,就对它进行封装。工厂模式的缘起1)变化点在“对象创建”,因此就封装“对象创建”2)面向接口编程——依赖接口,而非依赖实现(可以实现松耦合)3)最简单的解决方法:///这里是类库:Road经常变化,所以封装起来。class MyFactory { public static Road CreateRoad()... 阅读全文
C#面向对象设计模式纵横谈 笔记2 Singleton单件(创建型模式)
2011-06-12 23:25 by lujiao_cs, 330 阅读, 收藏,
摘要:
模式分类从目的来看:–创建型(Creational)模式:负责对象创建。–结构型(Structural)模式:处理类与对象间的组合。–行为型(Behavioral)模式:类与对象交互中的职责分配。从范围来看:–类模式处理类与子类的静态关系(编译时确定,这种分类更加利于模式的系统学习)。–对象模式处理对象间的动态关系(运行时确定,了解)。动机(Motivation) 在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。 如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?(这是基本动机) 这应该是类设计者的责任,而不是... 阅读全文