本帖最后由 caozhy 于 2011-04-19 00:48:06 编辑

解决方案 »

  1.   

    本帖最后由 caozhy 于 2011-04-19 00:33:38 编辑
      

  2.   

    本帖最后由 caozhy 于 2011-04-19 01:31:06 编辑
      

  3.   

    互相可以替换
    我觉得这才是策略的精粹
    caozhy提出的 委托+Lambda 可以相互替换吗?
    委托+Lambda只是实现了算法
    还不达到互相可以替换吧?感觉 委托+Lambda 是实现,策略的层次比较高而且我看的是<Head First设计模式>
    策略模式位于第一章
    里面是为了不要让每个继承接口的子类都去实现接口方法,因为有很多都是相同的
    所以把算法封装起来,让子类选择就可以了但你的 委托+Lambda 貌似有要每个都实现了一次了,如果有很多的话,
    如果要修改 鸡鸡疼随便买一下请教一下,3年工作经验,思想达到这个层次了 在深圳可以卖多少钱
    准备找工作的说
      

  4.   

    本帖最后由 caozhy 于 2011-04-19 08:12:16 编辑
      

  5.   

    本帖最后由 caozhy 于 2011-04-19 10:04:28 编辑
      

  6.   

    觉得什么委托、什么策略、什么工厂、什么范型,都不如Javascript 强大,function add(){
      int n;
      for(int i=0;i<arguments.length;i++){
        n+=Tools.toInt(arguments[i]+""); //省略
      }
    }add(1,2,3,4);this.addproperty = "sfsf";
    this.addproperty1 = "sfsf";
    this.addproperty2 = "sfsf";
    alert(this["addproperty"]);
      

  7.   

    可有意思吗?
    曾经学 javascript,感叹于javascript 真是方便啊,
    可惜功能太弱,性能太差,转而学C++去了。
      

  8.   

    谁能帮我把下面的javascript代码转为 C#代码,这是考验你们设计模式的时候了。
    function add(){
      var n;
      for(var i=0;i<arguments.length;i++){
        n+=Tools.toInt(arguments[i]+""); 
      }
    }add(1,2,3,4);this.addproperty = "sfsf";
    this.addproperty1 = "sfsf";
    this.addproperty2 = "sfsf";
    alert(this["addproperty"]);
      

  9.   

    lz的目的是说设计模式如何,而 caozhy 的目的是如何解决问题,只要解决问题就可,而且要不断的重构。二位的目的、侧重点都是不一样的。虽然就lz的例子而言,功能是一样的。弄清楚各自的目的,那么也就没啥可争论的了,不过没有争论也就不热闹了。
     
      

  10.   

    C# 怎么实现下面的代码:
    <script>
    String.prototype.left=function(n){
    return this.substr(0,n);
    }
    var k = "vaavvv".left(3);
    alert(k);
    </script>
      

  11.   

    本帖最后由 caozhy 于 2011-04-19 09:29:22 编辑
      

  12.   

    本帖最后由 caozhy 于 2011-04-19 09:32:40 编辑
      

  13.   

    实际当中的问题肯定没有例子那么简单,23 种设计模式也只是 GoF 十几年工作经验的总结,模式是解决问题的方法,但绝对不是目的。很多面试官在面试时很喜欢问关于设计模式的东西,比如:能否谈谈设计模式,工作中用到过哪些模式。谈谈设计模式,诸如这样的问题,谈一天都谈不完,我认为没有必要过多地纠缠于此,应尽快结束这方面的话题,我一般都这样回答:23 种设计模式的名称让我一个一个地说过来的话,我肯定是没有这个能力一个不少地说出来的。我们在代码中最为常用的就是单例、工厂方法、模板方法什么的,有些代码可能是符合某种设计模式,但是在开发时或许根本就没有注意到。设计模式仅仅是 GoF 四个人多年的经验,但这并不表示面向对象中必须遵守的定律,况且这些模式也并不适合于任何的业务系统。若代码中要生搬硬套地采用某种模式的话,那就会产生为了模式而模式的代码。说到这里,面试官基本上就不得不同意我的观点了,而且在此之后,他在设计模式上基本没法再提问题了。
      

  14.   

    “设计模式仅仅是 GoF 四个人多年的经验”?也不正确,就象牛顿总结出力学原理,难道仅仅是牛顿的功劳吗?
    牛顿说过,他是站在巨人的肩膀上,所以能看得更远。GOF四个人 也是站在巨人的肩膀上,所以能看的更远。
      

  15.   

    强烈建议 caozhy 能出一个设计模式系列,详细讲解在C#3.5,4.0中如果摆脱设计模式,同时实现设计模式的好处或者默认使用实例
    顶你!向你学习!
      

  16.   

    本帖最后由 caozhy 于 2011-04-19 09:59:22 编辑
      

  17.   

    楼主不好意思了,我的一个回复直接让这个帖子跑题了,抱歉!转回正题吧,先提个问题:我想问一下,下面这两个一元运算符为什么使用的是 LeftNum,而不是 RightNum?那使用者该如何知道一元运算符中的 RightNum 是没有用的?    public class OperationSqrt : Operation
        {
            public override double GetResult()
            {
                double result = 0;
                if (LeftNum == 0)
                {
                    throw new Exception("负数不能开平方根。");
                }
                result = Math.Sqrt(LeftNum);
                return result;
            }
        }    public class OperationReverse : Operation
        {
            public override double GetResult()
            {
                double result = 0;
                result = -LeftNum;
                return result;
            }
        }
      

  18.   

    为什么老是用 运算符做例子,一点实际意义都没有,
    走了,还是自己去想吧,别人靠不住。有那时间研究运算符,还不如多看看 SAP 是怎么做的。
      

  19.   

    我一直在想: SAP 使用的是什么 设计 模式?
      

  20.   

    首先感谢各位同修的积极回复,
    先把简单的回复掉回 51 楼 bao110908
    回 24 楼 weishaolin131083
      

  21.   

    我给你看一个例子,很有意思,
    是以前的讨论:http://topic.csdn.net/u/20080414/18/0c10bb92-f200-4cc9-8ffa-a26bdec574b5.html虽然是讨论面向对象,但实际包含了设计模式的概念在里面。
    无论是对象,还是设计模式,都是为了解决问题。
    流程控制决定对象的选择,以及对对象的行为的控制。
    就象一群人在那里没事干,
    然后来了一个组织者,给每个人安排工作,协同工作,完成一个任务,
    这群人就调动起来了,工作了
    而组织者为什么要这样安排? 他是遵守一定的业务规则来安排的.
    怎样才能让任务更快更好的完成, 就是设计模式。从 #25楼 开始看。
    -----------------------------------------------------------引用 22 楼 SkyIsland 的回复:
    比方说我做一个工资管理系统,我要通过一些参数来计算出员工的最终工资。那么我就做一个工资类,然后在里面放一个通过各种参数来计算工资的方法,需要调用的时候就实例化工资类,然后调用这个工资计算方法,我肯定不会在Page_load中一行一行那样从上向下一直写下来。 也就是说,我采用的方法跟你采用的方法是一致的,你觉得那里有问题?问题还是在于变化!
    普通工人的工资
    管理人员的工资
    工资的计算方式
    他们有相同的地方,有不同的地方过程的方式就是管理人员的工资写一个函数,普通的人员在写一个函数,这个不用考虑啥,反正具体问题具体对待,如果方式变了,大不了改改函数,或加几个函数而对象设计人员考虑问题的方式是:既然有管理和工人,那么其他类型呢?销售人员,股东----
    工资计算:按件,按等级,按工龄实际是做对象的人,首先考虑的是变化,明白了。所以他们构造对象时候,会把变化留出来。
      

  22.   


    再次感谢你,我的帖子因你而精彩看得出你对3.5和4.0的特性是非常熟练我也承认我积极的.net学习基本是从1到2,后面就懒散了但是我不得不提出一个疑问简短的代码就等于优雅的代码吗?很惭愧的说一句,可能是由于个人原因 每次看到泛型委托 我都觉得眼花缭乱 不够直观,所以实际工作中很少用,感觉是时间长了,自己再进来看都要费点力而且你那样的写法背离了策略模式的初衷,也就是算法家族的封装在我看来的你代码甚至是非常糟糕的你的最终代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine(4 + 5);
                Console.WriteLine(4.5f - 5.5f);
                Console.WriteLine(Math.Sqrt(4));
            }
        }
    }
    很遗憾,我确实看不出任何设计模式,难道这样的代码就是返璞归真?我想一个初学者也不可能犯这样的错误吧,或许你真没明白我的意图,也或许如其他朋友说的我们侧重点不同
    举个简单的例子,我现在这个简单功能,在winform下用不需要修改代码,在cmd下用不需要修改代码,在webform下同样不需要修改代码,只有功能的增加才会需去增加,注意是增加,而不是修改
    并且,最明显的错误,策略模式是用来封装算法的,算法并不局限于数学运算,当我需要封装的东西复杂到一定程度,难道你在main方法里写上千行的代码?很明显,那将是非常不利于维护和扩展的这才是设计模式的精髓,脱离面向过程的编程方式,通过设计模式,更好的实现面相对象的代码,让代码更易扩展和重用,重用!=ctrl+C,ctrl+v 囧你这样的写法连最基本的面相对象特性都没有最简单也最核心的 开房-封闭。封装变化,降低耦合你到好,专门开放变化的东西呵呵,可能真是侧重点不同不得不再问一次上面说到的问题代码越简洁是否等于代码越优雅难道用最少的代码实现了功能就等于最优雅的编程方式?
      

  23.   

    我贴数据表结构给你:http://blog.csdn.net/weishaolin131083/archive/2011/04/19/6333369.aspx
      

  24.   


    params 和 indexer ,如果要做到连语法都一样,那已经是同一个语言了
      

  25.   

    74楼:
    function add(x,y){
       alert(x);
      var n;
      for(var i=0;i<arguments.length;i++){
      n+=Tools.toInt(arguments[i]+"");  
      }
    }add(1,2,3,4);
    Javscript 可以通过形参去调用,就是它提供两种方式,一种是形参,一种是实参数组。
    你在 C# 里怎么实现 允许两种方式 获取参数?
      

  26.   

    78楼,问题是 javascript 并没有重载,它只定义了一个方法,
    并没有定义两个方法。
    定义两个方法 明显多此一举。不可能要求 所有的方法,都要定义一个 可变参数 方法。
      

  27.   

    javascript 只定义一个方法,就可以支持两种获取参数的方式。
      

  28.   

    还有, javascript 的 arguments 是实参,
    你 c# 里定义 一个可变参数,那是 形参,还是通过形参去调用。建议你搞清楚 形参 和实参再说。
      

  29.   


    你想说明什么,是想用C#实现javascript的语法,还是用两种语言解决同样的问题?
      

  30.   

    我想说的是,C#如何象 javascript 那样优雅方便的编码。比如 arguments,
    比如 o.newprotery = "xx"
    比如 o["newprotery"]
      

  31.   

    大话设计模式<设计模式:可复用面向对象软件的基础>
      

  32.   

    我觉得不是某个人的见解就是绝对正确的  也不是大家绝对推崇的  正好海纳百川  合百家之言 找到最适合自己的思考方式  根据需求 选择最优的方式方法或设计模式 最终设计出最好 而且能够复用的程序才是王道!楼主做得很好 让不懂得设计模式的人能够明白设计模式是什么 知道了是什么才可能去忘记 不是吗?大家的反驳也很对,这样也让不清楚或者是我这样的井底之娃 明白了跟多解决问题 设计程序的方法!好久没上CSDN了  感觉还是很好!