问题描述
大家好的我想知道设计模式的优缺点
解决方案
解决方案二:
请大家多多帮忙
解决方案三:
看那本《设计模式之禅》吧。
解决方案四:
设计模式用于弥补编程语言语法的不足,在低级编程语言上实现高级的设计意图。所以设计模式对于C++很有用,对于Java有些用,但是对于C#来说,就纯属多此一举了。
解决方案五:
3楼的回复有点欠缺,设计模式对C#的开发也是有作用的。在开发c#应用软件的时候,设计模式用处不大,但是在开发WEB网络编程的时候,设计模式的作用就有了,如果你不知道,或者不会使用设计模式,那么你开发的网站将会很垃圾
解决方案六:
本帖最后由 caozhy 于 2014-05-21 11:38:56 编辑
解决方案七:
本帖最后由 caozhy 于 2014-05-21 11:35:34 编辑
解决方案八:
个人是支持版主的观点的,比如公司一些老程序员从其他语言转到C#,常常用设计模式来跟新人说教,最后自己连反射,Linq都一知半解。但并不是反对新人学习设计模式,一些思想还是不错。
解决方案九:
优点:高内聚,低耦合,可以提高代码重用性。就我理解,设计模式的核心目的是对系统的功能进行解耦,最终目标是当我需要增加一个什么功能的时候我只需要关心我现在需要增加的功能,而不去关心以前的。
解决方案十:
设计模式对C#无用这个观点我不赞同。就拿最简单的单例来说,虽说C#有static可以冒充单例,但实现惰性加载的单例,还是要靠经典的写法。抽象工厂,用反射实现,并不能说明没有用设计模式,而只是把case换成了反射而已。
解决方案十一:
引用6楼caozhy的回复:
比如说,你需要一个类工厂,这是你的设计意图,设计模式告诉你怎么做呢?objectFactory(stringproductName){switch(productName){case"Class1":returnnewClass1();break;case"Class2":returnnewClass2();break;...}}对不对?事实上,工厂模式是为了解决C++语言没有反射这个特性而不得已才用的方法。C#中,我们仍然会用到“工厂”这个设计,但是用不到"工厂方法"这个设计模式。C#的做法是什么?objectFactory(stringproductName){returnActivator.CreateInstance(productName);}再比如说“策略模式”,它解决的问题是C++语言没有委托语法,通过一系列固定的编码人肉展开一个委托(事实上C++也没有接口,我们这里按照Java程序员对设计模式的用法来写):interfaceIStrategy{intDo(stringparam);}classStrategy1:IStrategy{publicintDo(stringparam){/*这里放入策略代码*/}}classProgram{voidfoo(IStrategys){...intr=s.Do(xxx);//应用策略...}}但是C#支持委托,何苦这么写?C#的写法应该是:classProgram{publicdelegateintStrategyDelegate(stringparam);voidfoo(StrategyDelegates){...intr=s(xxx);//应用策略...}}举2个例子只是告诉你,设计模式不用学,设计模式不会告诉你怎么设计,只有你知道了怎么设计,他告诉你在缺乏某种语言特性的语言上如何人肉模拟这些语法。这是设计模式的本质。用C#,你学好它优雅的语法就够了。
呵呵,思想可以应用多的场景,语法只能应用单一场景。假如公司明天让他用C++写,他不是要问为毛那个方法不能用,真傻逼这个C++。有一些人思想达不到您那种高度可以根据需求写设计模式的,所以他们才要学,要都跟你那么牛B谁还看设计模式。
解决方案十二:
呵呵,项目是混沌地,属于那只可怜地薛老师地猫,既生且死,既死且生他是多种量子态的叠加,设计模式只是一种量子态所以我们不说设计模式没用,也不说设计模式有用。因为他只是一种量子态,如果设计模式是生,那么你就忽略的死,如果设计模式是死,你就忽略了生所以我说学他没问题,只不过你要知道他只是其中地一种而已,你可以通过他理解他这一面的表征,但是千万别说他就是项目地全部还是我以前说地,对象,过程,函数,逻辑,声明---一个不能少,多种量子态叠加才是真正地表达
解决方案十三:
版主说设计模式对c#无用是版主的观点。。我的观点是对所有语言通用,一种编程思想。。在适合的场景用适合的设计模式。。
解决方案十四:
你们都回答错了...C#只是一个语言而已....哪有什么模式
解决方案十五:
设计模式对所有语言通用,关键是会不会用,或者说需不需要用。毕竟解决问题才是关键!
解决方案:
引用13楼diaodiaop的回复:
你们都回答错了...C#只是一个语言而已....哪有什么模式
确实,应该是面向对象设计模式
解决方案:
设计模式最大的好处就是代码写完了找出其中的设计模式给那些说代码不好的人!!!!!!!
解决方案:
设计模式最大的好处是代码长了不乱套了
解决方案:
c#不是一种设计模式==设计模式就像gofbook提到的那二十几种一样有什么迭代器观察者中介者状态机模式可以用于cppjava当然也可以用于c
解决方案:
#设计模式,是指编程中的各种小伎俩的汇总和提炼。就这个词儿而言,显然没有任何问题。但是如果你说的GOF的“设计模式”那本书中的“设计模式”,那么有没有多看看.netframework里边的比它多100倍的设计模式呢?你有没有想过需要学习什么新的.net模式呢?这其实就好像一个到美国的海军陆战队里学习的人,满脑子只有一点“咏春拳”的架势,他有没有看看人家陆战队里学习什么新的“战斗模式”呢?
解决方案:
实际上,这是基于实际的情况而提出的问题。如果你学的是“咏春拳”或者“太极拳”或者“少林拳”,你用到了现代的自由搏击中,甚至用到了战场上,就是个“速死”的下场。但是就写一本入门“模式”书来说,显然那类模式更容易被外行津津乐道,因为它天生具有表演成分。以“雷人的名词儿”来适应“标题党”的戏剧性描述,加上繁琐的接口,加上极少的设计知识,这就是GOF的设计模式。但是我们只有用更加丰富的设计模式,例如我们通过说明各种事件驱动、命令驱动、状态、缓存等等基本技术,才能说明为什么GOF的设计模式的“表演姿势”与背后的实践能力不匹配。
解决方案:
引用20楼sp1234的回复:
实际上,这是基于实际的情况而提出的问题。如果你学的是“咏春拳”或者“太极拳”或者“少林拳”,你用到了现代的自由搏击中,甚至用到了战场上,就是个“速死”的下场。但是就写一本入门“模式”书来说,显然那类模式更容易被外行津津乐道,因为它天生具有表演成分。以“雷人的名词儿”来适应“标题党”的戏剧性描述,加上繁琐的接口,加上极少的设计知识,这就是GOF的设计模式。但是我们只有用更加丰富的设计模式,例如我们通过说明各种事件驱动、命令驱动、状态、缓存等等基本技术,才能说明为什么GOF的设计模式的“表演姿势”与背后的实践能力不匹配。
诶你还是不明白,这就是为什么李小龙学了咏春拳后来又创出了适合自己的功夫,永春拳只是用来作为适合自己功夫的一种启发,而并非用来实战的功夫。难道你学历咏春拳就要用咏春拳去打遍天下无敌手?真正的功夫是利用自己的长处干掉对方的短处来设定的,而并非千篇一律的咏春拳。
解决方案:
引用19楼sp1234的回复:
设计模式,是指编程中的各种小伎俩的汇总和提炼。就这个词儿而言,显然没有任何问题。但是如果你说的GOF的“设计模式”那本书中的“设计模式”,那么有没有多看看.netframework里边的比它多100倍的设计模式呢?你有没有想过需要学习什么新的.net模式呢?这其实就好像一个到美国的海军陆战队里学习的人,满脑子只有一点“咏春拳”的架势,他有没有看看人家陆战队里学习什么新的“战斗模式”呢?
一言以敝之,西方有句谚语,如果你的手上只有锤子,那么你看什么都觉得像钉子。设计模式(我说的是gof的那20几种)就是一些在C++这个特定语言上的一组实现特定设计意图的“小伎俩”。要命的是,大量培训班出来的学员,以为设计模式就是用来“改良代码”甚至“改良设计”的药方,本末倒置,他不再思考代码怎么写了,而是总思考“这里应该用什么模式”,就如同锤子没有错。但是你给一个三岁小孩一把锤子,并且忽悠他,这是万能的神器。结果这熊孩子看见什么都想砸一下。那就是搞破坏了。
解决方案:
引用22楼caozhy的回复:
Quote: 引用19楼sp1234的回复:
设计模式,是指编程中的各种小伎俩的汇总和提炼。就这个词儿而言,显然没有任何问题。但是如果你说的GOF的“设计模式”那本书中的“设计模式”,那么有没有多看看.netframework里边的比它多100倍的设计模式呢?你有没有想过需要学习什么新的.net模式呢?这其实就好像一个到美国的海军陆战队里学习的人,满脑子只有一点“咏春拳”的架势,他有没有看看人家陆战队里学习什么新的“战斗模式”呢?一言以敝之,西方有句谚语,如果你的手上只有锤子,那么你看什么都觉得像钉子。设计模式(我说的是gof的那20几种)就是一些在C++这个特定语言上的一组实现特定设计意图的“小伎俩”。要命的是,大量培训班出来的学员,以为设计模式就是用来“改良代码”甚至“改良设计”的药方,本末倒置,他不再思考代码怎么写了,而是总思考“这里应该用什么模式”,就如同锤子没有错。但是你给一个三岁小孩一把锤子,并且忽悠他,这是万能的神器。结果这熊孩子看见什么都想砸一下。那就是搞破坏了。
他不再思考代码怎么写了,而是总思考“这里应该用什么模式我承认如果你说的这点成立的话那么你说的观点也一定成立,可惜这样的人有,但是并非全部,所以你的观点无法成立。因为只要是个智商正常的人,用您说的这种方式尝试着去写代码的时候他会发现很难。
解决方案:
不明白设计模式有什么用。用起来一点也不爽。那么多限制和规则。想想都累!
解决方案:
米饭的优缺点
解决方案:
个人观点是:设计模式不用过度高估,但也不要觉得一文不值,有些时候你可以去生搬硬套,因为大多数设计模式就是为了解决某类问题而存在的,但更多的,还是在用的过程中更好的了解设计模式的SOLID原则
解决方案:
我的一点浅薄看法,那二十多种设计模式,基本上都是用接口类、抽象类、包含类以及子类对象赋值给父类这几个东西的组合变幻。我有一个不是很明白的地方是,一个类A,A自己包含自己,或者类A包含了一个接口类B,这个接口类B里面又包含了类A,这种用法,我不是很理解它的用途是什么?希望大神赐教一下。
解决方案:
引用6楼caozhy的回复:
比如说,你需要一个类工厂,这是你的设计意图,设计模式告诉你怎么做呢?objectFactory(stringproductName){switch(productName){case"Class1":returnnewClass1();break;case"Class2":returnnewClass2();break;...}}对不对?事实上,工厂模式是为了解决C++语言没有反射这个特性而不得已才用的方法。C#中,我们仍然会用到“工厂”这个设计,但是用不到"工厂方法"这个设计模式。C#的做法是什么?objectFactory(stringproductName){returnActivator.CreateInstance(productName);}再比如说“策略模式”,它解决的问题是C++语言没有委托语法,通过一系列固定的编码人肉展开一个委托(事实上C++也没有接口,我们这里按照Java程序员对设计模式的用法来写):interfaceIStrategy{intDo(stringparam);}classStrategy1:IStrategy{publicintDo(stringparam){/*这里放入策略代码*/}}classProgram{voidfoo(IStrategys){...intr=s.Do(xxx);//应用策略...}}但是C#支持委托,何苦这么写?C#的写法应该是:classProgram{publicdelegateintStrategyDelegate(stringparam);voidfoo(StrategyDelegates){...intr=s(xxx);//应用策略...}}举2个例子只是告诉你,设计模式不用学,设计模式不会告诉你怎么设计,只有你知道了怎么设计,他告诉你在缺乏某种语言特性的语言上如何人肉模拟这些语法。这是设计模式的本质。用C#,你学好它优雅的语法就够了。
讲得太透彻了!
解决方案:
接口有一个作用,就是它的实现类可以更方便地被替换。比方说使用ioc技术将此接口注册到新的实现类,从而实现实现类的随意更换
解决方案:
接口是一种规范,规范了你实现的方法名称,参数与返回结果