楼主不好意思了,我的一个回复直接让这个帖子跑题了,抱歉!转回正题吧,先提个问题:我想问一下,下面这两个一元运算符为什么使用的是 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; } }
为什么老是用 运算符做例子,一点实际意义都没有, 走了,还是自己去想吧,别人靠不住。有那时间研究运算符,还不如多看看 SAP 是怎么做的。
我觉得这才是策略的精粹
caozhy提出的 委托+Lambda 可以相互替换吗?
委托+Lambda只是实现了算法
还不达到互相可以替换吧?感觉 委托+Lambda 是实现,策略的层次比较高而且我看的是<Head First设计模式>
策略模式位于第一章
里面是为了不要让每个继承接口的子类都去实现接口方法,因为有很多都是相同的
所以把算法封装起来,让子类选择就可以了但你的 委托+Lambda 貌似有要每个都实现了一次了,如果有很多的话,
如果要修改 鸡鸡疼随便买一下请教一下,3年工作经验,思想达到这个层次了 在深圳可以卖多少钱
准备找工作的说
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"]);
曾经学 javascript,感叹于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"]);
<script>
String.prototype.left=function(n){
return this.substr(0,n);
}
var k = "vaavvv".left(3);
alert(k);
</script>
牛顿说过,他是站在巨人的肩膀上,所以能看得更远。GOF四个人 也是站在巨人的肩膀上,所以能看的更远。
顶你!向你学习!
{
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;
}
}
走了,还是自己去想吧,别人靠不住。有那时间研究运算符,还不如多看看 SAP 是怎么做的。
先把简单的回复掉回 51 楼 bao110908
回 24 楼 weishaolin131083
是以前的讨论:http://topic.csdn.net/u/20080414/18/0c10bb92-f200-4cc9-8ffa-a26bdec574b5.html虽然是讨论面向对象,但实际包含了设计模式的概念在里面。
无论是对象,还是设计模式,都是为了解决问题。
流程控制决定对象的选择,以及对对象的行为的控制。
就象一群人在那里没事干,
然后来了一个组织者,给每个人安排工作,协同工作,完成一个任务,
这群人就调动起来了,工作了
而组织者为什么要这样安排? 他是遵守一定的业务规则来安排的.
怎样才能让任务更快更好的完成, 就是设计模式。从 #25楼 开始看。
-----------------------------------------------------------引用 22 楼 SkyIsland 的回复:
比方说我做一个工资管理系统,我要通过一些参数来计算出员工的最终工资。那么我就做一个工资类,然后在里面放一个通过各种参数来计算工资的方法,需要调用的时候就实例化工资类,然后调用这个工资计算方法,我肯定不会在Page_load中一行一行那样从上向下一直写下来。 也就是说,我采用的方法跟你采用的方法是一致的,你觉得那里有问题?问题还是在于变化!
普通工人的工资
管理人员的工资
工资的计算方式
他们有相同的地方,有不同的地方过程的方式就是管理人员的工资写一个函数,普通的人员在写一个函数,这个不用考虑啥,反正具体问题具体对待,如果方式变了,大不了改改函数,或加几个函数而对象设计人员考虑问题的方式是:既然有管理和工人,那么其他类型呢?销售人员,股东----
工资计算:按件,按等级,按工龄实际是做对象的人,首先考虑的是变化,明白了。所以他们构造对象时候,会把变化留出来。
再次感谢你,我的帖子因你而精彩看得出你对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 囧你这样的写法连最基本的面相对象特性都没有最简单也最核心的 开房-封闭。封装变化,降低耦合你到好,专门开放变化的东西呵呵,可能真是侧重点不同不得不再问一次上面说到的问题代码越简洁是否等于代码越优雅难道用最少的代码实现了功能就等于最优雅的编程方式?
params 和 indexer ,如果要做到连语法都一样,那已经是同一个语言了
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# 里怎么实现 允许两种方式 获取参数?
并没有定义两个方法。
定义两个方法 明显多此一举。不可能要求 所有的方法,都要定义一个 可变参数 方法。
你 c# 里定义 一个可变参数,那是 形参,还是通过形参去调用。建议你搞清楚 形参 和实参再说。
你想说明什么,是想用C#实现javascript的语法,还是用两种语言解决同样的问题?
比如 o.newprotery = "xx"
比如 o["newprotery"]