代码改变世界

随笔分类 -  [03]设计模式

IoC和DI的理解

2015-06-26 15:16 by Mike.Jiang, 7165 阅读, 收藏, 编辑
摘要: 1 概述当我们想闭上眼睛想如何让我们的软件更加可用可维护时,我们总能想到一个词:松耦合。在这篇文章中,主要讲述了模块间存在的依赖关系,但这种依赖关系违背了依赖倒置原则。在这之后,我们将讨论一种解除软件依赖关系的设计模式——IoC,以及它的两种实现方法:依赖注入(DI)和服务定位。最后我们简单地列下当... 阅读全文

一个ORM的实现(附源代码)

2014-07-30 23:31 by Mike.Jiang, 8313 阅读, 收藏, 编辑
摘要: 1 前言经过一段时间的编写,终于有出来一个稳定的版本,期间考虑了多种解决方案也偷偷学了下园子里面大神们的作品。已经有很多的ORM框架,为什么要自己实现一个?我的原因是在遇到特殊需求时,可以在ORM中加入特定的代码。如 :根据数据库的字段长度和可空性做基本的数据验证,在ORM中解决数据修改时的同步问... 阅读全文

用T4 Template生成代码

2014-07-15 20:43 by Mike.Jiang, 13977 阅读, 收藏, 编辑
摘要: 1 T4语法T4的语法与ASP.NET的方式比较类似。主要包括指令、文本块、控制块。1.1 指令指令主要包括template, output, assembly, import, include等类型,用以告诉T4引擎如何编译和运行一个模板。这些指令相当于T4引擎的配置参数。示例:告诉T4引擎控... 阅读全文

自定义多语言的实现

2013-03-07 21:24 by Mike.Jiang, 1882 阅读, 收藏, 编辑
摘要: 1背景界面支持多种语言,在使用ASP.NET自带的多语言方案时遇到下列问题:在做管理类的功能时,有添加、修改和查看页面,需要支持多语言的控件基本相同,但要维护多处,产生冗余(ASP.NET有共享的资源,但它是全局的,不能分 模 块,我们不能所模块的信息入在全局资源中);在页面中必须要指定资源文件中的KEY;当页面慢来慢多时,页面与资源的匹配实在难以维护;所以我认为一个理想的支持多语言框架,需要有以下特性:分模块解决数据冗余问题;自动匹配页面与资源文件之间的联系;易于维护,能通过页面快速定位到资源文件中;2 资源存储于单个文件先不将最后解决方案贴出来,我们先看看解决方案的第一个版本(在此版本中未 阅读全文

代理模式(Proxy)

2012-09-20 09:15 by Mike.Jiang, 428 阅读, 收藏, 编辑
摘要: 1 概述有时我们会遇到这样的问题:要在多个地方,使用到一个远程对象,这样我们需要写加载远程对象的方法;统计一个对象被引用的次数;要一次创建很多大对象,但我们又不是立刻就能用到所有的对象。在这些问题中,所有的要被调用的对象功能均已实现,但又缺少一些其它的功能,如在创建时异步加载、统计引用次数,延迟加载等,要添加这些公共的功能,又不能破坏原有对象职责的单一性。遇到这样的问题,我们要用到——代理模式2 GOF 定义意图:为其他对象提供一种代理以控制对这个对象的访问结构图:备注:Subject:客户所希望的对象接口RealSubject:是真正实现了这个对象接口的方法。Proxy:引用了RealSub 阅读全文

外观模式(Façade)

2012-09-17 08:06 by Mike.Jiang, 534 阅读, 收藏, 编辑
摘要: 1 概述当你开发系统时,遇到这样的问题:1>分层开发时,底层的多个类相互协作完成一些复杂的功能,高层的开发人员也必须要知道这些底层类是如何协作完成功能,这样做合理吗2>在开发系统时,需要用到已有的旧系统中的功能,面对那些杂乱无章的代码、逻辑我们怎么办,难道要每一位开发人员都去面对吗当遇到这些问题,在面向对象的世界里,我们是如何解决——外观模式2 GOF意图为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。[GOF 《设计模式》]结构图3 理解SubSystem:复杂的子系统,其中的类关系复杂,类比较多;Client:高层 阅读全文

适配器模式(Adapter)

2012-09-11 08:05 by Mike.Jiang, 553 阅读, 收藏, 编辑
摘要: 1 概述遇到这样的问题:需要用到已有的功能,功能的数据和行为都是正确的,但是功能的调用繁杂并要在多个地方调用。在正常的思维下,我们将功能的调用写在一个公共类的一个方法中,这样我们就已经达到了隔离已有复杂功能目的。但这样做有如下缺点:1>如果这个类有多个公开的方法,则不能对这个类进行统一的管理;2>如果这个类中的方法相互依赖很强,那么写公共方法也会比较烦;最后,我们用OO的语言开发,应该以OO的思想来解决这个问题。上述的问题,通过大师们的总结,已经形成一个统一的解决模式:适配器模式;2 GOF中的定义2.1 意图: 将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本 阅读全文

组合模式(Composite)

2012-09-04 08:06 by Mike.Jiang, 282 阅读, 收藏, 编辑
摘要: 1 概述当遇到这样的问题:一个对象它即可以是操作对象,又可以作为本身对象的容器。客户端代码在操作时,需要知道某个对象是容器对象还是操作对象。这样客户端代码就与容器、操作对象耦合。我们需要这样一种模式,使得即可以支持对象可以是操作对象或容器,并且也支持客户代码不需要知道某个对象是某个具体类型。2 GOF中的定义2.1意图将对象组合成树形结构以表示“部分-整体”的层次结构。Composite模式使得用户对单个对象和组合对象的使用具有一致性。2.2 结构图3松耦合的实现——客户代码不需要区分某个对象是树支还是树叶View Code public abstract class Componen... 阅读全文

状态模式 State

2012-08-27 17:50 by Mike.Jiang, 381 阅读, 收藏, 编辑
摘要: 状态模式(允许通过改变对象的内部状态而改变对象的行为, 这个对象表现得就好像修改了它的类一样)与策略模式的类图一样,实现一样,都是解耦if else 。只是它们解决问题的语境不同,但都可以归纳到解耦ifelse,将不同行为抽象成对象分布在子类当中,在Context中配置当前操作对象。这样在新增状态或修改已有状态时,不再违背开闭原则,遵守单一职责原则。 阅读全文

职责链模式

2012-08-24 11:42 by Mike.Jiang, 596 阅读, 收藏, 编辑
摘要: 1概述 当一个请求,有多个处理对象时,如果硬编码指定某个由某个对象来处理,需要采用ifelse的结构,从而产生了代码的耦合,如果要添加新的请求处理对象或调整请求处理的次序,必然会修改同一个方法,违背开闭原则。2 GOF中的定义意图: 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。结构图:适用性:1>有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。2>你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。3>解耦ifelse,将处理对象组织一个链并希望处 阅读全文

Observer 观察者模式

2012-08-23 13:42 by Mike.Jiang, 566 阅读, 收藏, 编辑
摘要: 1 GOF中的定义意图定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。[GOF 《设计模式》]结构图2.概述个人感觉观察者模式定义的比较不容易理解:什么多个观察者关注某个主题的,这个模式解决的是当一个对象需要调用一系列对象的方法时,并且是被调用方自己注册自己是否被调用,调用方不知道要调用哪些方法的问题。3生活中的例子现在,银行业务中有一项,当账号金额发生变化时就进行通知,默认是通知到手机,也可以选择将信息同时发送到邮箱。4.调用方依赖被调用方情景1:在这个业务的起初,账号金额变化,通知到手机实现:View Code public... 阅读全文

Command命令模式

2012-08-22 09:36 by Mike.Jiang, 521 阅读, 收藏, 编辑
摘要: 1 GOF中的定义1.1意图将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作1.2结构图2 初步理解方法调用代码:View Code public class ClassA { public int Compute() { Calc c = new Calc(); return c.Execute(); } } public class Calc { public int Execute() ... 阅读全文

模板方法Template

2012-08-09 13:53 by Mike.Jiang, 268 阅读, 收藏, 编辑
摘要: 动机: 在面向对象的世界里,代码复用主要体现在继承。然而当我们想让子类不仅能继承,而且也能重新定义方法时,很自然地就想到重写方法,但是这样是把整个方法的重写。如果我们有这样的一种需求,在父类的某个方法只能完成方法一个部分,而另一部分必须由子类去完成(这种应用在编写框架时遇到的很多),并且在调用这些由子类实现的方法有一定的逻辑。当有这样的需求时,我们应该怎么办——模板方法。意图:定 义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。代码实现View Code public class Temp... 阅读全文

策略模式

2012-08-08 17:27 by Mike.Jiang, 364 阅读, 收藏, 编辑
摘要: 一、概念策略模式(Strategy):它定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法的变化不会影响到使用算法的客户。二,应用示例 采用《大话设计模式》中的商场收银的例子,即在收银算法对某个商品,可能是正常收费也可能是打折收费,也有可能是满200返20的。三,普通青年解决方案 写一个条件判断,根据不同的收费类型,调用不同的收银方法View Code string type = ""; switch (type) { case "Nomal": ... 阅读全文

设计模式_2_简单工厂、工厂方法、抽象工厂比较

2012-05-23 00:02 by Mike.Jiang, 462 阅读, 收藏, 编辑
摘要: 这三个模式主要的应用场景是:当创建单个(简单工厂、工厂方法)或多个(抽象工厂)系列对象,客户程序为了生成某个具体对象判断复杂,可能多处使用,并且在添加新的实现或新的系列时,需要过多改动已有的客户代码,为了解决这些问题,出现了这三种套路。(篇幅有限就不贴代码了) 首先,简单工厂: 在简单工厂中(应对于生成单系列的对象),客户程序仅依赖于Factory和Product类,而不依赖于具体的实现类,CreateProduct方法用于根据传入的参数,生成不同的对象,实际上就是将客户程序中对生成不同实现对象的重构,将创建对象的方法,封装到一个方法中,在这里我们封装成一个工厂类,将生成不同对象的判断逻辑放. 阅读全文

设计模式_1_单例模式

2012-05-16 01:28 by Mike.Jiang, 501 阅读, 收藏, 编辑
摘要: 单例模式(Singleton):保证一个类仅有一个实例,并提供一个访问它的全局访问点。 应用场景:当系统中需要一个类仅有一个实例时,才需要用到单例(有人会说,那我只实例化一次不就好了吗,如果确定只用一次,并且也不需要考虑扩展,那也是可以的)。但事实上,在很多应用中,会在多个地方用到这个实例,正常的一种解决方案是:在一个公共类中,声明一个静态只读的类空的实例,然后再定义一个静态的方法获取这个实例,在这个方法中判断是否已经存在某个实例。 但是我认为一个类可以被实例化的次数的控制是这个类本身自己的责任,并且当业务需要可以实例化有限个实例,也将改动那个公共类。所以大师们根据以往的经验,提出了这样的.. 阅读全文