(Head First 设计模式)学习笔记(1)

时间:2022-10-17 21:57:32

以下内容转载请注明来自"菩提树下的杨过(http://blog.sqlsky.com)"
 
把书中开篇duck问题的代码翻译成了c#版:

概述:
某游戏公司要设计一款鸭子的游戏,里面有各种各样的鸭子,有些会飞,有些会叫,但都会游泳。而且不同种类的鸭子,飞行方式和叫唤的方式各不相同

以下代码体现了二个oo原则:
1.找出应用中可能需要变化之外,把它们独立出来,不要和那些不需要变化的代码混在一起
2.针对接口编程,而不是针对实现编程


Duck抽象类:

(Head First 设计模式)学习笔记(1)using System;
(Head First 设计模式)学习笔记(1)
using System.Collections.Generic;
(Head First 设计模式)学习笔记(1)
using System.Linq;
(Head First 设计模式)学习笔记(1)
using System.Text;
(Head First 设计模式)学习笔记(1)
(Head First 设计模式)学习笔记(1)
namespace duck
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)
{
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)    
/// <summary>
(Head First 设计模式)学习笔记(1)    
/// 鸭子的抽象类
(Head First 设计模式)学习笔记(1)    
/// </summary>

(Head First 设计模式)学习笔记(1)    public abstract class Duck
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)    
{
(Head First 设计模式)学习笔记(1)        
//注:以下二个变量,当然可以做成属性,但是从oo的角度考虑,这二个是代表duck的具体行为的,还是用实例变量比较恰当
(Head First 设计模式)学习笔记(1)
        protected FlyBehavior flyBehavior = null;
(Head First 设计模式)学习笔记(1)        
protected QuackBehavior quackBehavior = null;
(Head First 设计模式)学习笔记(1)
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)        
/// <summary>
(Head First 设计模式)学习笔记(1)        
/// 开始叫唤
(Head First 设计模式)学习笔记(1)        
/// </summary>

(Head First 设计模式)学习笔记(1)        public void StartQuack() 
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)        
{
(Head First 设计模式)学习笔记(1)            quackBehavior.Quack();
(Head First 设计模式)学习笔记(1)        }

(Head First 设计模式)学习笔记(1)
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)        
/// <summary>
(Head First 设计模式)学习笔记(1)        
/// 开始飞行 
(Head First 设计模式)学习笔记(1)        
/// </summary>

(Head First 设计模式)学习笔记(1)        public void StartFly()
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)        
{
(Head First 设计模式)学习笔记(1)            flyBehavior.Fly();
(Head First 设计模式)学习笔记(1)        }

(Head First 设计模式)学习笔记(1)
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)        
/// <summary>
(Head First 设计模式)学习笔记(1)        
/// 游泳(所有的鸭子都会swim)
(Head First 设计模式)学习笔记(1)        
/// </summary>

(Head First 设计模式)学习笔记(1)        public void Swim() 
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)        
{
(Head First 设计模式)学习笔记(1)            Console.WriteLine(
"All the ducks can swim.");
(Head First 设计模式)学习笔记(1)        }

(Head First 设计模式)学习笔记(1)
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)        
/// <summary>
(Head First 设计模式)学习笔记(1)        
/// 抽象方法(返回具体鸭子的描述)
(Head First 设计模式)学习笔记(1)        
/// </summary>

(Head First 设计模式)学习笔记(1)        public abstract void Display();
(Head First 设计模式)学习笔记(1)    }

(Head First 设计模式)学习笔记(1)}

飞行行为接口:
(Head First 设计模式)学习笔记(1)using System;
(Head First 设计模式)学习笔记(1)
using System.Collections.Generic;
(Head First 设计模式)学习笔记(1)
using System.Linq;
(Head First 设计模式)学习笔记(1)
using System.Text;
(Head First 设计模式)学习笔记(1)
(Head First 设计模式)学习笔记(1)
namespace duck
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)
{
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)    
/// <summary>
(Head First 设计模式)学习笔记(1)    
/// 飞行行为接口
(Head First 设计模式)学习笔记(1)    
/// </summary>

(Head First 设计模式)学习笔记(1)    public interface FlyBehavior
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)    
{
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)        
/// <summary>
(Head First 设计模式)学习笔记(1)        
/// Fly方法,必须由实现该接口的类实现
(Head First 设计模式)学习笔记(1)        
/// </summary>

(Head First 设计模式)学习笔记(1)        void Fly(); 
(Head First 设计模式)学习笔记(1)        
(Head First 设计模式)学习笔记(1)    }

(Head First 设计模式)学习笔记(1)}

叫唤行为接口:
(Head First 设计模式)学习笔记(1)using System;
(Head First 设计模式)学习笔记(1)
using System.Collections.Generic;
(Head First 设计模式)学习笔记(1)
using System.Linq;
(Head First 设计模式)学习笔记(1)
using System.Text;
(Head First 设计模式)学习笔记(1)
(Head First 设计模式)学习笔记(1)
namespace duck
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)
{
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)    
/// <summary>
(Head First 设计模式)学习笔记(1)    
/// "叫"行为接口
(Head First 设计模式)学习笔记(1)    
/// </summary>

(Head First 设计模式)学习笔记(1)    public interface QuackBehavior
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)    
{
(Head First 设计模式)学习笔记(1)        
void Quack();
(Head First 设计模式)学习笔记(1)       
(Head First 设计模式)学习笔记(1)    }

(Head First 设计模式)学习笔记(1)}

几种不同飞行方式类:
(Head First 设计模式)学习笔记(1)using System;
(Head First 设计模式)学习笔记(1)
using System.Collections.Generic;
(Head First 设计模式)学习笔记(1)
using System.Linq;
(Head First 设计模式)学习笔记(1)
using System.Text;
(Head First 设计模式)学习笔记(1)
(Head First 设计模式)学习笔记(1)
namespace duck
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)
{
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)    
/// <summary>
(Head First 设计模式)学习笔记(1)    
/// "用翅膀飞"类(普通鸭子的飞行行为)
(Head First 设计模式)学习笔记(1)    
/// </summary>

(Head First 设计模式)学习笔记(1)    public class FlyWithWings:FlyBehavior
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)    
{
(Head First 设计模式)学习笔记(1)        
public void Fly() 
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)        
{
(Head First 设计模式)学习笔记(1)            Console.WriteLine(
"I can fly with wing.");
(Head First 设计模式)学习笔记(1)        }

(Head First 设计模式)学习笔记(1)    }

(Head First 设计模式)学习笔记(1)}

(Head First 设计模式)学习笔记(1)using System;
(Head First 设计模式)学习笔记(1)
using System.Collections.Generic;
(Head First 设计模式)学习笔记(1)
using System.Linq;
(Head First 设计模式)学习笔记(1)
using System.Text;
(Head First 设计模式)学习笔记(1)
(Head First 设计模式)学习笔记(1)
namespace duck
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)
{
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)    
/// <summary>
(Head First 设计模式)学习笔记(1)    
/// "不会飞"类(橡皮鸭,模型鸭的飞行行为)
(Head First 设计模式)学习笔记(1)    
/// </summary>

(Head First 设计模式)学习笔记(1)    public class FlyNoWay:FlyBehavior
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)    
{
(Head First 设计模式)学习笔记(1)        
public void Fly() 
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)        
{
(Head First 设计模式)学习笔记(1)            Console.WriteLine(
"Don't be fool! I can't fly.");
(Head First 设计模式)学习笔记(1)        }

(Head First 设计模式)学习笔记(1)    }

(Head First 设计模式)学习笔记(1)}

几种不同方式的叫唤类:
(Head First 设计模式)学习笔记(1)using System;
(Head First 设计模式)学习笔记(1)
using System.Collections.Generic;
(Head First 设计模式)学习笔记(1)
using System.Linq;
(Head First 设计模式)学习笔记(1)
using System.Text;
(Head First 设计模式)学习笔记(1)
(Head First 设计模式)学习笔记(1)
namespace duck
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)
{
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)    
/// <summary>
(Head First 设计模式)学习笔记(1)    
/// "呱呱叫"类(普通鸭子的quack行为)
(Head First 设计模式)学习笔记(1)    
/// </summary>

(Head First 设计模式)学习笔记(1)    public class NormalQuack:QuackBehavior
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)    
{
(Head First 设计模式)学习笔记(1)        
public void Quack() 
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)        
{
(Head First 设计模式)学习笔记(1)            Console.WriteLine(
"ga ga ga (Head First 设计模式)学习笔记(1)");
(Head First 设计模式)学习笔记(1)        }

(Head First 设计模式)学习笔记(1)    }

(Head First 设计模式)学习笔记(1)}

(Head First 设计模式)学习笔记(1)using System;
(Head First 设计模式)学习笔记(1)
using System.Collections.Generic;
(Head First 设计模式)学习笔记(1)
using System.Linq;
(Head First 设计模式)学习笔记(1)
using System.Text;
(Head First 设计模式)学习笔记(1)
(Head First 设计模式)学习笔记(1)
namespace duck
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)
{
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)    
/// <summary>
(Head First 设计模式)学习笔记(1)    
/// "吱吱叫"类(橡皮鸭子的quack行为)
(Head First 设计模式)学习笔记(1)    
/// </summary>

(Head First 设计模式)学习笔记(1)    public class Squeak:QuackBehavior
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)    
{
(Head First 设计模式)学习笔记(1)        
public void Quack() 
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)        
{
(Head First 设计模式)学习笔记(1)            Console.WriteLine(
"zhi zhi zhi (Head First 设计模式)学习笔记(1)");
(Head First 设计模式)学习笔记(1)        }

(Head First 设计模式)学习笔记(1)    }

(Head First 设计模式)学习笔记(1)}


(Head First 设计模式)学习笔记(1)using System;
(Head First 设计模式)学习笔记(1)
using System.Collections.Generic;
(Head First 设计模式)学习笔记(1)
using System.Linq;
(Head First 设计模式)学习笔记(1)
using System.Text;
(Head First 设计模式)学习笔记(1)
(Head First 设计模式)学习笔记(1)
namespace duck
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)
{
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)    
/// <summary>
(Head First 设计模式)学习笔记(1)    
/// "不会叫"类(模型鸭专用)
(Head First 设计模式)学习笔记(1)    
/// </summary>

(Head First 设计模式)学习笔记(1)    public class Mute:QuackBehavior
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)    
{
(Head First 设计模式)学习笔记(1)        
public void Quack() 
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)        
{
(Head First 设计模式)学习笔记(1)            Console.WriteLine(
"I can't make sound");
(Head First 设计模式)学习笔记(1)        }

(Head First 设计模式)学习笔记(1)    }

(Head First 设计模式)学习笔记(1)}


几种不同类型的鸭子类
(Head First 设计模式)学习笔记(1)using System;
(Head First 设计模式)学习笔记(1)
using System.Collections.Generic;
(Head First 设计模式)学习笔记(1)
using System.Linq;
(Head First 设计模式)学习笔记(1)
using System.Text;
(Head First 设计模式)学习笔记(1)
(Head First 设计模式)学习笔记(1)
namespace duck
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)
{
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)    
/// <summary>
(Head First 设计模式)学习笔记(1)    
/// 红头鸭,会用翅膀飞,会呱呱叫
(Head First 设计模式)学习笔记(1)    
/// </summary>

(Head First 设计模式)学习笔记(1)    public class RedHeadDuck:Duck
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)    
{
(Head First 设计模式)学习笔记(1)        
public RedHeadDuck() 
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)        
{
(Head First 设计模式)学习笔记(1)            
this.flyBehavior = new FlyWithWings();
(Head First 设计模式)学习笔记(1)            
this.quackBehavior = new NormalQuack();           
(Head First 设计模式)学习笔记(1)            
(Head First 设计模式)学习笔记(1)        }

(Head First 设计模式)学习笔记(1)
(Head First 设计模式)学习笔记(1)        
public override void Display()
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)        
{
(Head First 设计模式)学习笔记(1)            Console.WriteLine(
"I am a real red-head-duck.");
(Head First 设计模式)学习笔记(1)        }

(Head First 设计模式)学习笔记(1)    }

(Head First 设计模式)学习笔记(1)}


(Head First 设计模式)学习笔记(1)using System;
(Head First 设计模式)学习笔记(1)
using System.Collections.Generic;
(Head First 设计模式)学习笔记(1)
using System.Linq;
(Head First 设计模式)学习笔记(1)
using System.Text;
(Head First 设计模式)学习笔记(1)
(Head First 设计模式)学习笔记(1)
namespace duck
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)
{
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)    
/// <summary>
(Head First 设计模式)学习笔记(1)    
/// 模型鸭子,不会飞,不会叫
(Head First 设计模式)学习笔记(1)    
/// </summary>

(Head First 设计模式)学习笔记(1)    public class ModelDuck:Duck
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)    
{
(Head First 设计模式)学习笔记(1)        
public ModelDuck() 
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)        
{
(Head First 设计模式)学习笔记(1)            
this.flyBehavior = new FlyNoWay();
(Head First 设计模式)学习笔记(1)            
this.quackBehavior = new Mute();
(Head First 设计模式)学习笔记(1)        }

(Head First 设计模式)学习笔记(1)
(Head First 设计模式)学习笔记(1)        
public override void Display()
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)        
{
(Head First 设计模式)学习笔记(1)            Console.WriteLine(
"I am a mute duck.I cannot fly and quack.");
(Head First 设计模式)学习笔记(1)        }

(Head First 设计模式)学习笔记(1)
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)        
/// <summary>
(Head First 设计模式)学习笔记(1)        
/// 允许模型鸭在运行时动态改变飞行行为(这里本人修改了下,原文中把这个方法放到了Duck抽象类中,即允许所有鸭子都可以动态修改飞行方式,但有可能出现橡皮鸭改变为能用翅膀飞的尴尬,呵呵)
(Head First 设计模式)学习笔记(1)        
/// </summary>
(Head First 设计模式)学习笔记(1)        
/// <param name="fb"></param>

(Head First 设计模式)学习笔记(1)        public void SetFlyBehavior(FlyBehavior fb)
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)        
{
(Head First 设计模式)学习笔记(1)            
this.flyBehavior = fb;
(Head First 设计模式)学习笔记(1)        }

(Head First 设计模式)学习笔记(1)
(Head First 设计模式)学习笔记(1)    }

(Head First 设计模式)学习笔记(1)}


最终测试:
(Head First 设计模式)学习笔记(1)using System;
(Head First 设计模式)学习笔记(1)
using System.Collections.Generic;
(Head First 设计模式)学习笔记(1)
using System.Linq;
(Head First 设计模式)学习笔记(1)
using System.Text;
(Head First 设计模式)学习笔记(1)
(Head First 设计模式)学习笔记(1)
namespace duck
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)
{
(Head First 设计模式)学习笔记(1)    
class Program
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)    
{
(Head First 设计模式)学习笔记(1)        
static void Main(string[] args)
(Head First 设计模式)学习笔记(1)(Head First 设计模式)学习笔记(1)        
{
(Head First 设计模式)学习笔记(1)            RedHeadDuck _redDuck 
= new RedHeadDuck();
(Head First 设计模式)学习笔记(1)            _redDuck.Display();
//I am a real red-head-duck.
(Head First 设计模式)学习笔记(1)
            _redDuck.StartFly();//I can fly with wing.
(Head First 设计模式)学习笔记(1)
            _redDuck.StartQuack();//ga ga ga (Head First 设计模式)学习笔记(1)
(Head First 设计模式)学习笔记(1)

(Head First 设计模式)学习笔记(1)            Console.WriteLine();
(Head First 设计模式)学习笔记(1)
(Head First 设计模式)学习笔记(1)            ModelDuck _modelDuck 
= new ModelDuck();
(Head First 设计模式)学习笔记(1)            _modelDuck.Display();
//I am a mute duck.I cannot fly and quack.
(Head First 设计模式)学习笔记(1)
            _modelDuck.StartFly();//Don't be fool! I can't fly.
(Head First 设计模式)学习笔记(1)
            _modelDuck.StartQuack();//I can't make sound
(Head First 设计模式)学习笔记(1)

(Head First 设计模式)学习笔记(1)
(Head First 设计模式)学习笔记(1)            Console.WriteLine();
(Head First 设计模式)学习笔记(1)            _modelDuck.SetFlyBehavior(
new FlyWithWings());//动态改变模型鸭子的飞行行为特性
(Head First 设计模式)学习笔记(1)
            _modelDuck.StartFly();//I can fly with wing.
(Head First 设计模式)学习笔记(1)

(Head First 设计模式)学习笔记(1)            Console.ReadLine();
(Head First 设计模式)学习笔记(1)
(Head First 设计模式)学习笔记(1)        }

(Head First 设计模式)学习笔记(1)    }

(Head First 设计模式)学习笔记(1)}

菩提树下的杨过 2008-05-08 22:37:24 整理于上海