浅谈设计模式

学习设计模式也有很长时间了,说实话,老师以故事的方式讲课,我以前是听不进去的,因为老师所举的例子只是字面上表示那种模式,但实际想一下,不是那么回事,也就是说例子不是那么恰当。其实,对于几种觉的模式,把模式的定义看一下,再结合代码,就能理解了,不要20分钟就能讲完的内容,用2节课还完成不了,这效率谁都知道。最后,只有自己看书,了解设计模式面向对象的三个特征:封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。;继承,它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
;多态,是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。

下面,我再讲一下我理解的几个设计模式。

先谈一下工厂模式,它分为简单工厂模式、工厂方法模式和抽象工厂模式。简单工厂模式:有抽象实现类,具体的实现类,具体的一个工厂类。这个工厂就是负责创建一个与其它类基类类型相同的具体的类实例,好处就是隐藏具体实现类对象,是接口模式的编程方法;工厂方法模式:在简单工厂模式的基础上,加入抽象工厂类,这样,就能创建多个以抽象工厂类为基类的工厂类,每个工厂类对应一个具体实现类,实现各个工厂的单一职责;抽象工厂模式,为了解决工厂方法模式下,工厂类太多复杂的问题,将一些属于同一系列的实现类实例的创建任务放到一个工厂中,类似于公司产品一个系列。我见过的用工厂模式构建的项目中,使用的一般是简单工厂模式,用一个工厂方法,避免文件太多、难以理清的问题。放到一起的是全部的具体类的创建,本来没有联系,在操作的时候,人为的把这些类联系起来操作就行了。

再谈一下单例模式,单例模式在项目中也是很必要的,我在做过的项目中用过了。就是从log4j移植到.net版本的log4net,它用来记录程序的运行状态、错误信息等。在web应用程序中,在程序启动时初始化一个全局的对象Instance,其它地方就可以随时调用了,用它来把信息写入log文件中,实现这种模式的一个方法就是把构造函数设为private,在类的内部new一个静态的Instance,这样就只有一个唯一的对象实例了。我觉得,这个单例模式用的地方也不是太多,因为就看到过log4j或log4net是使用它的一个经典例子,其它的地方也没有了。在项目中的数据访问层,我也想把它们做为单例模式的类,不过,做为一个web应用程序,如果多人用时使用同一功能,是不是会造成死锁的问题?这我还没有测试过,因为现在的环境,三、五个人同时用是没有问题的,关键是人上百或上千、上万的时候,是不是会有问题,这个问题还有待进一步思考。

再谈一下适配器模式,这是一个结构型的模式,现在来讲一下我对它的思想的理解,我喜欢用代码的方法讲,这样具体一些,对于这个适配器模式的概念,也比较抽象,就是你看了它的概念定义也不知道是什么意思。用我做过的项目中的东西讲吧,我做过一个.net代码生成器的东西,那里面要用到数据库类型向C#类型转换的问题,比如说:数据库里面的bigint,在c#中表示为long
。那么,你就要用一个类对它转换,如果你目标方法需要long类型的数据,而源方法只能提供 bigint类型的,那么这个适配器就要担任这个bigint向long类型转换的任务。像这些用到过适配器模式的还有很多,有些比较的隐蔽,可能是几个模式组合使用了,那么,我们没学过这种模式的定义或者思想,那么也不知道它是一个模式。

最后重点谈一下模版方法模式,模版方法模式就是依样画葫芦,定义一个接口类,由子类去继承和实现它定义的方法。这是.Net里面最常用的简单三层框架结构的模式。因为我们在实现功能的时候,最主要的就是对数据的增、删、改、查,既然每个对象都要这些操作,那么这种模版方法模式正好符合要求,可以用同一个模版来约定操作。模版模式,最核心的内容就是一个共同的模版,这样以后的操作都是围绕这个模版进行的,每个类也能自己增加独特的方法(这个并不约束),这就更符合实际编程的需要,对于定义好的模版,也能实现接口设计的原则,对修改关闭,对扩展开放。不过,每种模式都有它的优点和缺点,在接口需求发生改变时,需要修改所有的继承于接口的代码,这是很麻烦的。

总结:其实,我们学习的模式,就是很多种编程的思想,如果没学过这些思想,在遇到难题的时候,也不能想出好的方法来,学习之后就能“套用”这些思想去解决问题了。在项目开发中,往往需要不同的设计模式结合使用,才能满足实际需求,因为一个项目有不同的模块,功能不同适用的设计模式也会不尽相同了。比如:模版方法模式,在对一些有共同方法的对象有用;观察者模式,在类似于向不同的客户发送同一份文件这样的需求时使用;状态模式,在流水线生产这样的环境中适用;创建者模式,在类似于搭配服装的需求时使用。总之,不同的地方适用的设计模式是不同的,这需求结合实际情况使用。不同的设计模式的结合,可以使项目更好地进行。

参考文献:

[1] 郭志学.《易学设计模式》.人民邮电出版社;

[2] James W.Coopper.《C#设计模式》.电子工业出版社

 [3] 刘秋香,
王云,
姜桂洪.
《Visual C#.NET程序设计》.清华大学出版社

时间: 2024-09-11 08:10:06

浅谈设计模式的相关文章

浅谈c#设计模式之单一原则_实用技巧

单一原则: 程序设计时功能模块独立,功能单一更有助于维护和复用. 例如:个人计算机功能很多,如果想从中只拿出一个功能来制造一个新的东西是困难的.同时如果你的计算机开不机,同时你的计算器功能也不能用了. 在编程中如果一个类封装了太多功能和上面的结果是类似的. 单一职责原则 例1: 大家应该能看出来这个类图中的接口设计是有问题的,用户的属性和用户的行为没有分开.我们根据用户的属性和行为拆开这个接口. 重新拆分成两个接口,IUserBo 负责用户的属性,IUserBiz负责用户的行为.当我们实例化除U

浅谈多态机制的意义及实现

标题:浅谈多态机制的意义及实现 作者:舒の随想日记 在面向对象编程(Object-Oriented Programming, OOP)中,多态机制无疑是其最具特色的功能,甚至可以说,不运用多态的编程不能称之为OOP.这也是为什么有人说,使用面向对象语言的编程和面向对象的编程是两码事. 多态并没有一个严格的定义,维基百科上给它下的定义比较宽松: Subtype polymorphism, almost universally called just polymorphism in the cont

面向对象之继承和组合浅谈

最近一个师弟问某实现是该用对象持有(其实就是组合)还是集成关系实现好.所以就在这里简单的浅谈一下,仅是个人观点,仅供参考.如果写的不对的地方请指出.      首先它们都是实现系统功能重用,代码复用的最常用的有效的设计技巧,都是在设计模式中的基础结构.相信大家已了解的,类继承允许我们根据自己的实现来覆盖重写父类的实现细节,父类的实现对于子类是可见的,所以我们一般称之为白盒复用.对象持有(其实就是组合)要求建立一个号的接口,但是整体类和部分类之间不会去关心各自的实现细节,即它们之间的实现细节是不可

浅谈微服务的来龙去脉

浅谈微服务的来龙去脉 背景介绍 微服务怎么来的 微服务是进化出来的 微服务不是银弹 作者:王清培(Plen wang) 沪江 公共业务平台 应用架构师 转载至沪江技术学院微信公众号 背景介绍 最近一段时间公共业务平台在进行大面积的重构,对原来的技术栈进行迁移,逐渐往java.go.node.js等开源.自由为主的技术体系中过度. 虽然这主要是替换技术框架,但也是我们应用系统进行重新设计.业务流程重新梳理的一个好机会,我们将利用这次机会来重构之前发现的一些问题. Martin Fowler大师<重

面向对象浅谈

如今当我们谈到Web开发时,程序员们总是热衷于讨论一些我们耳熟能详的Web开发框架,如Struts2.Spring.Hibernate等.有些程序员将这些框架奉为宝典,并且趋之若鹜地挖掘框架的方方面面.比较各种开发框架的优劣.似乎对于这些框架的熟悉与否,似乎已成为衡量一个程序员是否精通Java,精通J2EE开发的事实标准.甚至在广大程序员找工作的过程中,这些主流的开发框架中的知识细节也常常成为面试中必考的元素,答不上这些问题,无疑会为找工作蒙上一层阴影.  面对这些框架,大家曾经是否真的思考过,

浅谈C#中的延迟加载(2)善用virtual

之前的文章"浅谈C#中的延迟加载(1)--善用委托"中介绍了三层结构中在Model层对实体类的属性实现延迟加载的方法,该方法利用C#中的委托来实现,最后虽然延迟加载的目的得以实现,但是给客户端(例如UI层)暴露了不必要的属性(一个委托对象,我使用了泛型的Fun类来实现).这篇文章介绍一种方法来隐藏这个属性,同时又可以达到延迟加载的目的,更重要的是这一切都是在之前的基础上来完成的,不需要改变原来使用到实体类的地方的代码. 按照惯例,我们考虑一下想要我们的代码达到什么效果:首先在Model

浅谈Java反射与代理_java

Java反射机制与动态代理,使得Java更加强大,Spring核心概念IoC.AOP就是通过反射机制与动态代理实现的. 1 Java反射 示例: User user = new User(); user.setTime5Flag("test"); Class<?> cls = Class.forName("com.test.User"); //接口必须public,无论是否在本类内部使用!或者使用cls.getDeclaredMethod(),或者遍历修

浅谈PHP中Stream(流)_php技巧

流(stream)的概念源于UNIX中管道(pipe)的概念.在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备.外部文件等.根据流的方向又可以分为输入流和输出流,同时可以在其外围再套上其它流,比如缓冲流,这样就可以得到更多流处理方法. PHP里的流和Java里的流实际上是同一个概念,只是简单了一点.由于PHP主要用于Web开发,所以"流"这块的概念被提到的较少.如果有Java基础,对于PHP里的流就更容易理解了.其实PHP里的许多高级特性,比如SPL,

浅谈C# 中的委托和事件_C#教程

引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里别(biè)得慌,混身不自在.本文中,我将通过两个范例由浅入深地讲述什么是委托.为什么要使用委托.事件的由来..Net Framework中的委托和事件.委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论. 将方法作为方法的参数 我们先不管这个标题