设计模式(1)
一、?C# 面向?qū)ο蟪绦蛟O(shè)計復(fù)習
??點擊http://files.cnblogs.com/zhenyulu/CSharp.rar下載,內(nèi)容包括:
??字段與屬性.cs
??屬性、方法作用范圍.cs
??一加到一百.cs
??使用接口排序(2).cs
??使用接口排序(1).cs
??求質(zhì)數(shù).cs
??冒泡法排序.cs
??九九表.cs
??靜態(tài)與非靜態(tài).cs
??構(gòu)造函數(shù).cs
??方法重載.cs
??多態(tài)性.cs
??遞歸求階乘.cs
??打印三角形.cs
??傳值調(diào)用與引用調(diào)用.cs
?
二、?設(shè)計模式舉例
在設(shè)計模式中有一種模式叫Builder模式,其原理如下:
我們可以將Builder理解成電飯鍋,給這個Builder放進去米和水,經(jīng)過Builder的Build后,我們就可以取出香噴噴的米飯了。
C#中有一個類叫StringBuilder,輸入必要的信息后,就可以取出對應(yīng)的String。其使用方法如下:
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中的所有信息
?}
}
程序執(zhí)行結(jié)果為: aabbbcccc
請使用StringBuilder對以下打印三角型的程序進行改寫,寫出新程序。
public?class?Exam
{
?public?static?void?Main()
?{
??Console.Write("請輸入行數(shù):");
??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.Text;
class?Exam
{
?public?static?void?Main()
?{
??Console.Write("請輸入行數(shù):");
??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類型。到底是先有雞還是先有蛋?這個程序可以正常編譯執(zhí)行并打印結(jié)果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"的關(guān)系,到底是大瓶子套小瓶子還是小瓶子套大瓶子呢?
?
五、?.net本質(zhì)
關(guān)于"先有雞還是先有蛋"的程序,系統(tǒng)運行后,內(nèi)存結(jié)構(gòu)如下:
?
由圖中可以看出,根本不存在雞與蛋的問題,而是型與值的問題以及指針引用的問題。
關(guān)于"大瓶子套小瓶子還是小瓶子套大瓶子"問題,系統(tǒng)運行后,內(nèi)存結(jié)構(gòu)如下:
?
由于是指針引用,所以也無所謂大瓶子還是小瓶子了。
關(guān)于更多內(nèi)容可以參考《.NET本質(zhì)論 第1卷:公共語言運行庫》。
參考文獻:
閻宏,《Java與模式》,電子工業(yè)出版社
[美]James W. Cooper,《C#設(shè)計模式》,電子工業(yè)出版社
[美]Alan Shalloway? James R. Trott,《Design Patterns Explained》,中國電力出版社
[美]Robert C. Martin,《敏捷軟件開發(fā)-原則、模式與實踐》,清華大學出版社
[美]Don Box, Chris Sells,《.NET本質(zhì)論 第1卷:公共語言運行庫》,中國電力出版社
轉(zhuǎn)載于:https://www.cnblogs.com/zhouxiancai0128/archive/2006/10/20/534765.html
總結(jié)
- 上一篇: altera系列fifo和ram
- 下一篇: asp.net控件开发基础(20)