First we try, then we trust

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  183 随笔 :: 111 文章 :: 2983 评论 :: 339 引用

这学期开设设计模式课程,将课件放上来。



课本:《C#设计模式》,电子工业出版社,ISBN 7-5053-8979-3。33元含光盘。

课程内容:设计模式

来源:亚历山大的建筑模式、Gamma等人(1995)创作的"Design Patterns: Elements of Reusable Software"。这本书通常被称作"Gang of Four"或"GoF",开创性的创造了《设计模式》。

也有人说"三十六计"就是"模式"。


一、 C# 面向对象程序设计复习

  点击http://files.cnblogs.com/zhenyulu/CSharp.rar下载,内容包括:

  字段与属性.cs
  属性、方法作用范围.cs
  一加到一百.cs
  使用接口排序(2).cs
  使用接口排序(1).cs
  求质数.cs
  冒泡法排序.cs
  九九表.cs
  静态与非静态.cs
  构造函数.cs
  方法重载.cs
  多态性.cs
  递归求阶乘.cs
  打印三角形.cs
  传值调用与引用调用.cs

 

二、 设计模式举例

在设计模式中有一种模式叫Builder模式,其原理如下:

我们可以将Builder理解成电饭锅,给这个Builder放进去米和水,经过Builder的Build后,我们就可以取出香喷喷的米饭了。
C#中有一个类叫StringBuilder,输入必要的信息后,就可以取出对应的String。其使用方法如下:

using System;
using System.Text;

class Exam
{
 
public static void Main()
 
{
  StringBuilder sb 
= new StringBuilder();
  sb.Append(
'a',2);
  sb.Append(
'b',3);
  sb.Append(
'c',4);
  Console.WriteLine(sb.ToString()); 
//打印出 aabbbcccc
  sb.Remove(0, sb.Length); //清除sb中的所有信息
 }

}

程序执行结果为: aabbbcccc
请使用StringBuilder对以下打印三角型的程序进行改写,写出新程序。

using System;
public class Exam
{
 
public static void Main()
 
{
  Console.Write(
"请输入行数:");
  
int lines = int.Parse(Console.ReadLine());
  Console.WriteLine(
"");
  
for(int i=1; i<=lines ; i++)
  
{
   
for(int k=1; k<= lines-i; k++)
    Console.Write(
" ");
   
for(int j=1; j<=i*2-1; j++)
    Console.Write(
"*");
   Console.WriteLine(
"");
  }

}

}

答:

using System;
using System.Text;
class Exam
{
 
public static void Main()
 
{
  Console.Write(
"请输入行数:");
  
int lines = int.Parse(Console.ReadLine());
  Console.WriteLine(
"");

  StringBuilder sb 
= new StringBuilder();

  
for(int i=1; i<=lines ; i++)
  
{
   sb.Append(
' ', lines-i);
   sb.Append(
'*', i*2-1);
   Console.WriteLine(sb.ToString());
   sb.Remove(
0, sb.Length);
  }

 }

}

 

三、 先有鸡还是先有蛋?

到底是先有鸡还是先有蛋?看下面的代码:

using System;

class Client
{
   
public static void Main ()
   
{
      Base b 
= new Base();
      Derived d 
= new Derived();
      b.d 
= d;
      Console.WriteLine(b.d.m);      
   }

}


class Base
{
   
public int n = 9;
   
public Derived d;
}


class Derived : Base
{
   
public int m = 10;   
}

Derived继承自Base,可以说没有Base就没有Derived,可Base里面有一个成员是Derived类型。到底是先有鸡还是先有蛋?这个程序可以正常编译执行并打印结果10。

 

四、 大瓶子套小瓶子还是小瓶子套大瓶子?

另外一个例子:

using System;

class Client
{
   
public static void Main ()
   
{
      A a 
= new A();
      B b 
= new B();
      a.b 
= b;
      b.a 
= a;
   }

}


class A
{
   
public B b;
}


class B
{
   
public A a; 
}

上面的代码似乎描述了"a包含b,b包含a"的关系,到底是大瓶子套小瓶子还是小瓶子套大瓶子呢?

 

五、 .net本质

关于"先有鸡还是先有蛋"的程序,系统运行后,内存结构如下:
 

由图中可以看出,根本不存在鸡与蛋的问题,而是型与值的问题以及指针引用的问题。

关于"大瓶子套小瓶子还是小瓶子套大瓶子"问题,系统运行后,内存结构如下:


 
由于是指针引用,所以也无所谓大瓶子还是小瓶子了。

关于更多内容可以参考《.NET本质论 第1卷:公共语言运行库》。



参考文献:
阎宏,《Java与模式》,电子工业出版社
[美]James W. Cooper,《C#设计模式》,电子工业出版社
[美]Alan Shalloway  James R. Trott,《Design Patterns Explained》,中国电力出版社
[美]Robert C. Martin,《敏捷软件开发-原则、模式与实践》,清华大学出版社
[美]Don Box, Chris Sells,《.NET本质论 第1卷:公共语言运行库》,中国电力出版社
http://www.dofactory.com/Patterns/Patterns.aspx 

 

posted on 2004-08-24 00:13 吕震宇 阅读(29269) 评论(57)  编辑 收藏 所属分类: 设计模式

评论

#1楼  2004-08-24 00:46 中国Rainbow      
学习,谢谢!
  回复  引用  查看    

收藏
  回复  引用    

#3楼  2004-10-11 08:59 caca      
小bug(打印三角形.cs)
for(int j=1; j<=i*2+1; j++)
应为:
for(int j=1; j<=i*2-1; j++)
  回复  引用  查看    

#4楼  2004-10-11 11:29 sai [未注册用户]
有意思,学习
  回复  引用    

#5楼 [楼主] 2004-10-11 15:54 吕震宇      
@caca

谢谢指正!已经修改。
  回复  引用  查看    

#6楼  2004-10-28 16:15 加菲猫 [未注册用户]
不错的文章,继续阅读中....

楼主继续努力...
  回复  引用    

#7楼  2004-11-29 16:03 delphine [未注册用户]
三、 先有鸡还是先有蛋?很有意思

能不能说一下可能会用到在哪些地方!!!
  回复  引用    

#8楼 [楼主] 2004-11-29 20:11 吕震宇      
至于“先有鸡还是先有蛋”问题只是对面向对象本质的一个理解,如果非要说用在什么地方的化,那就应该是Everywhere。^_^
  回复  引用  查看    

#9楼  2004-12-14 14:51 牛牛      
我也来指个小BUG``
for(int i=0; i<=lines ; i++)
{
sb.Append(' ', lines-i);
sb.Append('*', i*2-1);
Console.WriteLine(sb.ToString());
sb.Remove(0, sb.Length);
}
中i=1才能正常运行```因为i*2-1不能为负

另外鸡和蛋的问题不是很明,能说明一下吗?到底是先有那样?
  回复  引用  查看    

#10楼 [楼主] 2004-12-14 17:45 吕震宇      
@牛牛

我也发现这个问题了,只是懒得改了。另外鸡与蛋的问题不成立,因为对象间是“引用”关系而不是“包含”关系。这就是我要说明的问题。
  回复  引用  查看    

#11楼  2005-01-10 17:28 KingofSC [未注册用户]
haha,有意思
不知道能不能在cpp下实现如此定义
  回复  引用    

顺便问问你们是什么学校呀,开设计模式?我们开门软件工程就不错了,上课老师在上面念课本!
  回复  引用    

#13楼 [楼主] 2005-01-12 13:41 吕震宇      
河北理工大学经济管理学院管理科学与工程系信息管理与信息系统专业。不过现在在本科开这门课的几乎没有。我们开设这门课程是一个尝试。
  回复  引用  查看    

#14楼  2005-01-17 18:49 柳三公子      
河北理工大学经济管理学院管理科学与工程系信息管理与信息系统专业

寒啊,好长的Title
  回复  引用  查看    

#15楼  2005-05-14 22:41 zshua      
其实上述问题的一个关键点是:值类型和引用类型的问题。
如果理解了引用类型的话,就不会存在上述的问题了。(知道这么说有些大言不惭!)
以下是我对引用类型的理解,如有不对请吕兄指出:
引用类型其实有2个部分:1个是他的“引用柄”,它是引用的外在表现。第2个是对象,是我们用“引用类型”时真正想要的东西(对象)。它是引用的内在实体。
当我们用“引用类型”时:是通过“引用柄”来引用“对象”。我们真正引用到的是内在的对象,而不是外在的“引用柄”。

哈哈,说得有些拗口!!!
  回复  引用  查看    

本来觉得c sharp并没有什么了不起,在学了之后才认识它的确有它的特点
  回复  引用    

#17楼  2005-08-04 16:24 王华磊 [未注册用户]
这位兄台
咱们学的一个专业
我今年即将大四
利用暑假好好学习一下
我们学校开的程序设计这方面的东西太少了
看了你的这一系列文章
真实受益匪浅!
  回复  引用    

#18楼  2005-08-05 13:31 天天      
zshua ,把“引用柄”理解为“遥控器”
“对象”理解为“电视”就可以了
我们都是用遥控器来控制电视
代码里,也就是成了用指针引用对象
我是这样理解的
  回复  引用  查看    

#19楼  2005-10-22 10:08 pzhuYY [未注册用户]
楼上的观点好像在Think in java中有提动,嘿嘿!
  回复  引用    

#20楼  2005-10-27 14:49 shanzy      
加个:

Console.ReadLine(); 直接就看到了
  回复  引用  查看    

写的太好了,就是初学,没有全看懂,呵呵
  回复  引用    

#22楼  2005-11-08 13:36 阿宇 [未注册用户]
写的好,通俗易懂。我决定把它看完 ^_^
  回复  引用    

#23楼  2005-11-19 11:01 hotmy.com [未注册用户]
妈的,好啊,接住先
  回复  引用    

#24楼  2005-11-21 14:47 shot123 [未注册用户]
如果在同一个程序集中可以实现两个对象互相引用,可是如果是在不同的程序集中可以做到这一点么?
  回复  引用    

#25楼 [楼主] 2005-11-22 02:50 吕震宇      
当然可以,只是需要首先添加一个对程序集的引用。
  回复  引用  查看    

#26楼  2005-12-23 14:34 upto      
现在这样的老师很难找了~可以把内容讲的如此通俗易懂~谢谢!
  回复  引用  查看    

#27楼  2006-01-06 17:39 拼命郎      
不错,支持一下,河北理工是我家乡的学校,呵呵
  回复  引用  查看    

#28楼  2006-01-24 13:27 wzw1227 [未注册用户]
家乡的学校!顶一下.
  回复  引用    

#29楼  2006-03-01 10:05 李飞侠 [未注册用户]
这样教学的老师值得尊敬
就是现在的学校好学的太少~~
  回复  引用    

#30楼  2006-04-20 11:32 一滴水      
记录下来学习!
  回复  引用  查看    

#31楼  2006-05-05 17:47 whyin      
去年我也是这个专业毕业的,寒,还开设计模式,我们都开了些农业概论啊什么的,哎,成了实验品
  回复  引用  查看    

#32楼  2006-09-08 20:03 壮志      
学习中...
  回复  引用  查看    

#33楼  2006-09-21 09:51 泥瓦斧 [未注册用户]
我想把“引用柄”理解为“挂钩”。
大瓶子上有一个特殊的挂钩,它只能挂一个小瓶子;
小瓶子上有一个特殊的挂钩,它只能挂一个大瓶子;

大瓶子可以挂小瓶子,同时小瓶子上有挂钩,以备将来挂大瓶子。。。。。。
所以大瓶子和小瓶子是“挂”的关系,而不是谁含有谁的关系。



  回复  引用    

#34楼  2006-11-23 13:03 changhai-xuri      
泥瓦斧
的回复比较有意思哈!很有想象力
  回复  引用  查看    

#35楼  2007-01-07 21:14 seo [未注册用户]
很早就加到我的收藏了 一直没有细看

这次一定要 从头到尾认真学完

写写提供这么好的文章
  回复  引用    

#36楼  2007-02-12 11:02 Cameo      
我会坚持到底,认真看完这系列~
  回复  引用  查看    

#37楼  2007-03-05 15:56 HenryZhang      
郁闷呀,怎么才看见这个系列呀,赶紧看。。。。。。。。。
  回复  引用  查看    

#38楼  2007-04-07 12:00 yunhuasheng      
very good!
  回复  引用  查看    

#39楼  2007-04-18 16:38 yaoxiao [未注册用户]
好啊,又学习知识了。
  回复  引用    

#40楼  2007-05-21 17:00 清晨风      
我也是学这个专业的,大学毕业简直就是一个编程文盲,啥也不知道,还设计模式呢,就在一个面向对象的几个概念上搞的晕头转向的,看来要恶补了.
  回复  引用  查看    

#41楼  2007-05-22 22:37 flyingfish      
好教师!
正在仔细学习中。
虽然编的程序不少了,还没仔细钻过模式。
  回复  引用  查看    

#42楼  2007-05-28 17:48 分享 共赢      
看空看下
http://www.cnblogs.com/ofei/archive/2007/05/28/762822.html
  回复  引用  查看    

#43楼  2007-10-16 10:39 kevin.li      
谢谢
  回复  引用  查看    

学习、敬仰、无语、痛哭、流涕……
人生苦短,学海无涯!
  回复  引用    

#45楼  2008-01-26 13:08 yunhuasheng      
再看.
  回复  引用  查看    

#46楼  2008-03-05 11:48 ToBin      
老师,你上课给我们讲的时候就没咋听懂!
现在我回头又看了一遍!
还是没咋懂!^v^!
  回复  引用  查看    

#47楼  2008-03-05 21:22 wayich      
好东西,学习着。
  回复  引用  查看    

#48楼  2008-03-15 21:56 简辉 [未注册用户]
引用类型是指变量包含的是数据在内存里的引用也叫句柄!
我觉得是一个地址,引用类型存储的是数据在内存中的指针!
  回复  引用    

#49楼  2008-07-03 10:28 遗憾啊 [未注册用户]
我也是这个专业毕业的,程序完全得靠自学,要是能碰到这样的老师该多好啊
  回复  引用    

#50楼  2008-07-25 23:00 留恋星空      
这个很不错。
  回复  引用  查看    

#51楼  2008-07-26 08:52 雅阁布      
好文章!!!
  回复  引用  查看    


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2005-09-02 14:25 编辑过


相关链接: