您的位置:首页 > 其它

23个设计模式总结(1)——高手与菜鸟的区别

2014-10-14 20:05 246 查看
跟着“小菜”和“大鸟”学习设计模式二十天了,可能是之前学习了C和C#,加上全职学习了四十四天的英语,对于设计模式源码的理解相对于以前刚接触编程的时候感觉容易多了。

总结

以下是我学习了设计模式之后的浅显总结:




说明

我把设计模式分成了三类:创建型、结构型和行为型,这三种类型主要是侧重点不同:

1.创建型:

隐藏了对象是如何被创建的,系统知道这些对象只能通过调用抽象类所定义的接口,这样使系统更加灵活。

2.结构型:

注重的是如何管理各个类之间的关系和如何扩展,从而使得类库里面各个类之间有一个更好的结构。

3.行为型:

注重的是各个类之间的通信是通过被封装还是被分布楑看系统中一些特征的变化。

感受

在没有学习设计模式之前,编程的时候注重的是实现,而在学习设计模式之后,编程更加注重的是代码的可复用、可扩展、可维护、灵活性好,也就是由面相过程向面相对象的方向发展,而设计模式也是在面向对象的基础上大牛们总结出来的经验。下面这个例子让我对于面向过程和面向对象的编程有更进一步的体会。

举例

如:要用代码来实现程序员在上班的时候上午状态好,中午想睡觉,下午渐恢复,加班苦煎熬这几种状态的变化。

学习设计模式前:(面向实现编程)

classProgram
{
staticintHour=0;//钟点
staticboolWorkFinished=false;//任务完成标记

staticvoidMain(string[]args)
{

Hour=9;
WriteProgram();
Hour=10;
WriteProgram();
Hour=12;
WriteProgram();
Hour=13;
WriteProgram();
Hour=14;
WriteProgram();
Hour=17;

WorkFinished=true;//任务完成,则可以下班,否则就得加班啦
//WorkFinished=false;

WriteProgram();
Hour=19;
WriteProgram();
Hour=22;
WriteProgram();

Console.Read();
}

//定义一个“写程序”的函数,用来根据时间的不同体现不同的工作状态
publicstaticvoidWriteProgram()
{
if(Hour<12)
{
Console.WriteLine("当前时间:{0}点上午工作,精神百倍",Hour);
}
elseif(Hour<13)
{
Console.WriteLine("当前时间:{0}点饿了,午饭;犯困,午休。",Hour);
}
elseif(Hour<17)
{
Console.WriteLine("当前时间:{0}点下午状态还不错,继续努力",Hour);
}
else
{
if(WorkFinished)
{
Console.WriteLine("当前时间:{0}点下班回家了",Hour);
}
else
{
if(Hour<21)
{
Console.WriteLine("当前时间:{0}点加班哦,疲累之极",Hour);
}
else
{
Console.WriteLine("当前时间:{0}点不行了,睡着了。",Hour);
}
}
}
}
}


用设计模式后:(先画类图再编程)



classProgram
{
staticvoidMain(string[]args)
{
//紧急项目
WorkemergencyProjects=newWork();
emergencyProjects.Hour=9;
emergencyProjects.WriteProgram();
emergencyProjects.Hour=10;
emergencyProjects.WriteProgram();
emergencyProjects.Hour=12;
emergencyProjects.WriteProgram();
emergencyProjects.Hour=13;
emergencyProjects.WriteProgram();
emergencyProjects.Hour=14;
emergencyProjects.WriteProgram();
emergencyProjects.Hour=17;
emergencyProjects.WriteProgram();

emergencyProjects.TaskFinished=false;

emergencyProjects.Hour=19;
emergencyProjects.WriteProgram();
emergencyProjects.Hour=22;
emergencyProjects.WriteProgram();

Console.Read();
}
}

//抽象状态
publicabstractclassState
{
publicabstractvoidWriteProgram(Workw);
}

//上午工作状态
publicclassForenoonState:State
{
publicoverridevoidWriteProgram(Workw)
{
if(w.Hour<12)
{
Console.WriteLine("当前时间:{0}点上午工作,精神百倍",w.Hour);
}
else
{
w.SetState(newNoonState());
w.WriteProgram();
}

}
}

//中午工作状态
publicclassNoonState:State
{
publicoverridevoidWriteProgram(Workw)
{
if(w.Hour<13)
{
Console.WriteLine("当前时间:{0}点饿了,午饭;犯困,午休。",w.Hour);
}
else
{
w.SetState(newAfternoonState());
w.WriteProgram();
}
}
}

//下午工作状态
publicclassAfternoonState:State
{
publicoverridevoidWriteProgram(Workw)
{
if(w.Hour<17)
{
Console.WriteLine("当前时间:{0}点下午状态还不错,继续努力",w.Hour);
}
else
{
w.SetState(newEveningState());
w.WriteProgram();
}
}
}

//晚间工作状态
publicclassEveningState:State
{
publicoverridevoidWriteProgram(Workw)
{
if(w.TaskFinished)
{
w.SetState(newRestState());
w.WriteProgram();
}
else
{
if(w.Hour<21)
{
Console.WriteLine("当前时间:{0}点加班哦,疲累之极",w.Hour);
}
else
{
w.SetState(newSleepingState());
w.WriteProgram();
}
}
}
}

//睡眠状态
publicclassSleepingState:State
{
publicoverridevoidWriteProgram(Workw)
{
{
Console.WriteLine("当前时间:{0}点不行了,睡着了。",w.Hour);
}
}
}

//下班休息状态
publicclassRestState:State
{
publicoverridevoidWriteProgram(Workw)
{
Console.WriteLine("当前时间:{0}点下班回家了",w.Hour);
}
}
//工作
publicclassWork
{
privateStatecurrent;
publicWork()
{
//工作初始化为上午工作状态
current=newForenoonState();
}

//“钟点”属性,状态转换的依据
privatedoublehour;
publicdoubleHour
{
get{returnhour;}
set{hour=value;}
}

//“任务完成”属性,判断是否能下班的依据
privateboolfinish=false;
publicboolTaskFinished
{
get{returnfinish;}
set{finish=value;}
}

publicvoidSetState(States)
{
current=s;
}

publicvoidWriteProgram()
{
current.WriteProgram(this);
}
}
两个程序所运行的结果都相同,但思维方式完全不同,如下:



结语

高手与菜鸟的区别在于是否会站在巨人的肩膀上,正如牛顿有句名言:“如果说我看得比别人更远些,那是因为我站在了巨人的肩上。”通过学习大话设计模式觉得自己䢩面向对象开始有了一点点的了解,而对设计模式的应用还得进行实践。



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: