當前位置:
首頁 >
(Head First 设计模式)学习笔记(1)
發布時間:2024/6/5
41
豆豆
生活随笔
收集整理的這篇文章主要介紹了
(Head First 设计模式)学习笔记(1)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
以下內容轉載請注明來自"菩提樹下的楊過(http://blog.sqlsky.com)"
?
把書中開篇duck問題的代碼翻譯成了c#版:
概述:
某游戲公司要設計一款鴨子的游戲,里面有各種各樣的鴨子,有些會飛,有些會叫,但都會游泳。而且不同種類的鴨子,飛行方式和叫喚的方式各不相同
以下代碼體現了二個oo原則:
1.找出應用中可能需要變化之外,把它們獨立出來,不要和那些不需要變化的代碼混在一起
2.針對接口編程,而不是針對實現編程
Duck抽象類:
using?System.Collections.Generic;
using?System.Linq;
using?System.Text;
namespace?duck
{
????/**////?<summary>
????///?鴨子的抽象類
????///?</summary>
????public?abstract?class?Duck
????{
????????//注:以下二個變量,當然可以做成屬性,但是從oo的角度考慮,這二個是代表duck的具體行為的,還是用實例變量比較恰當
????????protected?FlyBehavior?flyBehavior?=?null;
????????protected?QuackBehavior?quackBehavior?=?null;
????????/**////?<summary>
????????///?開始叫喚
????????///?</summary>
????????public?void?StartQuack()?
????????{
????????????quackBehavior.Quack();
????????}
????????/**////?<summary>
????????///?開始飛行
????????///?</summary>
????????public?void?StartFly()
????????{
????????????flyBehavior.Fly();
????????}
????????/**////?<summary>
????????///?游泳(所有的鴨子都會swim)
????????///?</summary>
????????public?void?Swim()?
????????{
????????????Console.WriteLine("All?the?ducks?can?swim.");
????????}
????????/**////?<summary>
????????///?抽象方法(返回具體鴨子的描述)
????????///?</summary>
????????public?abstract?void?Display();
????}
}
飛行行為接口:
using?System;
using?System.Collections.Generic;
using?System.Linq;
using?System.Text;
namespace?duck
{
????/**////?<summary>
????///?飛行行為接口
????///?</summary>
????public?interface?FlyBehavior
????{
????????/**////?<summary>
????????///?Fly方法,必須由實現該接口的類實現
????????///?</summary>
????????void?Fly();?
????????
????}
}
叫喚行為接口:
using?System;
using?System.Collections.Generic;
using?System.Linq;
using?System.Text;
namespace?duck
{
????/**////?<summary>
????///?"叫"行為接口
????///?</summary>
????public?interface?QuackBehavior
????{
????????void?Quack();
???????
????}
}
幾種不同飛行方式類:
using?System;
using?System.Collections.Generic;
using?System.Linq;
using?System.Text;
namespace?duck
{
????/**////?<summary>
????///?"用翅膀飛"類(普通鴨子的飛行行為)
????///?</summary>
????public?class?FlyWithWings:FlyBehavior
????{
????????public?void?Fly()?
????????{
????????????Console.WriteLine("I?can?fly?with?wing.");
????????}
????}
}
using?System;
using?System.Collections.Generic;
using?System.Linq;
using?System.Text;
namespace?duck
{
????/**////?<summary>
????///?"不會飛"類(橡皮鴨,模型鴨的飛行行為)
????///?</summary>
????public?class?FlyNoWay:FlyBehavior
????{
????????public?void?Fly()?
????????{
????????????Console.WriteLine("Don't?be?fool!?I?can't?fly.");
????????}
????}
}
幾種不同方式的叫喚類:
using?System;
using?System.Collections.Generic;
using?System.Linq;
using?System.Text;
namespace?duck
{
????/**////?<summary>
????///?"呱呱叫"類(普通鴨子的quack行為)
????///?</summary>
????public?class?NormalQuack:QuackBehavior
????{
????????public?void?Quack()?
????????{
????????????Console.WriteLine("ga?ga?ga?");
????????}
????}
}
using?System;
using?System.Collections.Generic;
using?System.Linq;
using?System.Text;
namespace?duck
{
????/**////?<summary>
????///?"吱吱叫"類(橡皮鴨子的quack行為)
????///?</summary>
????public?class?Squeak:QuackBehavior
????{
????????public?void?Quack()?
????????{
????????????Console.WriteLine("zhi?zhi?zhi?");
????????}
????}
}
using?System;
using?System.Collections.Generic;
using?System.Linq;
using?System.Text;
namespace?duck
{
????/**////?<summary>
????///?"不會叫"類(模型鴨專用)
????///?</summary>
????public?class?Mute:QuackBehavior
????{
????????public?void?Quack()?
????????{
????????????Console.WriteLine("I?can't?make?sound");
????????}
????}
}
幾種不同類型的鴨子類
using?System;
using?System.Collections.Generic;
using?System.Linq;
using?System.Text;
namespace?duck
{
????/**////?<summary>
????///?紅頭鴨,會用翅膀飛,會呱呱叫
????///?</summary>
????public?class?RedHeadDuck:Duck
????{
????????public?RedHeadDuck()?
????????{
????????????this.flyBehavior?=?new?FlyWithWings();
????????????this.quackBehavior?=?new?NormalQuack();???????????
????????????
????????}
????????public?override?void?Display()
????????{
????????????Console.WriteLine("I?am?a?real?red-head-duck.");
????????}
????}
}
using?System;
using?System.Collections.Generic;
using?System.Linq;
using?System.Text;
namespace?duck
{
????/**////?<summary>
????///?模型鴨子,不會飛,不會叫
????///?</summary>
????public?class?ModelDuck:Duck
????{
????????public?ModelDuck()?
????????{
????????????this.flyBehavior?=?new?FlyNoWay();
????????????this.quackBehavior?=?new?Mute();
????????}
????????public?override?void?Display()
????????{
????????????Console.WriteLine("I?am?a?mute?duck.I?cannot?fly?and?quack.");
????????}
????????/**////?<summary>
????????///?允許模型鴨在運行時動態改變飛行行為(這里本人修改了下,原文中把這個方法放到了Duck抽象類中,即允許所有鴨子都可以動態修改飛行方式,但有可能出現橡皮鴨改變為能用翅膀飛的尷尬,呵呵)
????????///?</summary>
????????///?<param?name="fb"></param>
????????public?void?SetFlyBehavior(FlyBehavior?fb)
????????{
????????????this.flyBehavior?=?fb;
????????}
????}
}
最終測試:
using?System;
using?System.Collections.Generic;
using?System.Linq;
using?System.Text;
namespace?duck
{
????class?Program
????{
????????static?void?Main(string[]?args)
????????{
????????????RedHeadDuck?_redDuck?=?new?RedHeadDuck();
????????????_redDuck.Display();//I?am?a?real?red-head-duck.
????????????_redDuck.StartFly();//I?can?fly?with?wing.
????????????_redDuck.StartQuack();//ga?ga?ga?
????????????Console.WriteLine();
????????????ModelDuck?_modelDuck?=?new?ModelDuck();
????????????_modelDuck.Display();//I?am?a?mute?duck.I?cannot?fly?and?quack.
????????????_modelDuck.StartFly();//Don't?be?fool!?I?can't?fly.
????????????_modelDuck.StartQuack();//I?can't?make?sound
????????????Console.WriteLine();
????????????_modelDuck.SetFlyBehavior(new?FlyWithWings());//動態改變模型鴨子的飛行行為特性
????????????_modelDuck.StartFly();//I?can?fly?with?wing.
????????????Console.ReadLine();
????????}
????}
}
菩提樹下的楊過 2008-05-08 22:37:24 整理于上海
轉載于:https://www.cnblogs.com/yjmyzz/archive/2008/05/08/1189044.html
總結
以上是生活随笔為你收集整理的(Head First 设计模式)学习笔记(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#(WinForm) + MySQL的
- 下一篇: asp.net导出GridView数据到