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

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

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

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

Duck抽象类:

using System;
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 整理于上海

时间: 2024-09-29 21:23:25

(Head First 设计模式)学习笔记(1)的相关文章

设计模式学习笔记系列

设计模式学习笔记(二十二)-FlyWeight享元模式 设计模式学习笔记(二十一)-Composite模式 设计模式学习笔记(二十)-Visitor访问者模式 设计模式学习笔记(十九)-Chain of Responsibility职责链模式 设计模式学习笔记(十八)-Mediator中介者模式 设计模式学习笔记(十七)-Memento备忘录模式 设计模式学习笔记(十六)-Proxy模式 设计模式学习笔记(十五)-State模式 设计模式学习笔记(十四)-Command模式 设计模式学习笔记(十

设计模式学习笔记(十)—Factory Method模式

<设计模式>一书对Factory Method模式是这样描述的: 定义一个用于创建对象的接口,让子类决定实例化哪一个类.FactoryMethod使一个类的实例化延迟到其子类. 我的理解:FatoryMethod模式是一种创建型模式,定义一个用于创建对象的接口的意思是说,我们要定义一个用于创建对象的接口(或者说抽象类,实际上就是个抽象工厂abstractFactory),它的内部有一个创建对象的方法,这个方法的返回值是一个接口(或者抽象类)的类型,这个方法就是FactoryMethod:让子类

设计模式学习笔记(二十一)—Composite模式

今天开始学习Composite模式,首先让我们看一下它的定义: 将对象组合成树形结构以表示"整体-部分"的层次结构.Composite模式使单个对象和组合对象的使用具有一致性. 下面给出这个模式的结构图: 如果把Composite模式看成是树形结构的话,那么它主要角色有: 1)树干角色(Component):该角色是一个抽象类,它定义了一些操作增删树叶(Leaf)的操作. 2)树枝角色(Composite):树枝上有很多树干,树枝也是树干的一种. 3)树叶角色(Leaf):树干上的树叶

我的设计模式学习笔记------&amp;gt;Java设计模式总概况

设计模式(Design Pattern)的概念最早起源于建筑设计大师Alexander的<建筑的永恒方法>一书,尽管Alexander的著作是针对建筑领域的,但是他的观点实际上用用于所有的工程设计领域,其中也包括软件设计领域.在<建筑的永恒方法>一书中是这样描述模式的: 模式是一条由三个部分组成的通用规则:他表示一个特定环境.一类问题和一个解决方案之间的关系.每一个模式描述了一个不断重复发生的问题,以及该问题解决方案的核心设计. 软件领域的设计模式也有类似的定义:设计模式是对处于特

我的设计模式学习笔记------&amp;gt;单例模式(Singleton)

一.前言 有些时候,允许自由创建某个类的实例是没有意义,还可能造成系统性能下降(因为创建对象所带来的系统开销问题).例如整个Windows系统只有一个窗口管理器,只有一个回收站等.在Java EE应用中可能只需要一个数据库引擎访问点,Hibernate访问时只需要一个SessionFactory实例,如果在系统中为它们创建多个实例就没有太大的意义. 如果一个类始终只能创建一个实例,则这个类被称为单例类,这种模式就被称为单例模式. 对Spring框架而言,可以在配置Bean实例时指定scope="

C#设计模式学习笔记-单例模式

本文转载:http://www.cnblogs.com/xun126/archive/2011/03/09/1970807.html最近在学设计模式,学到创建型模式的时候,碰到单例模式(或叫单件模式),现在整理一下笔记. 在<Design Patterns:Elements of Resuable Object-Oriented Software>中的定义是:Ensure a class only has one instance,and provide a global point of a

设计模式学习笔记(十六)—Proxy模式

一.Proxy模式定义: 为其他对象提供一种代理以控制这个对象的访问. 二.模式解说 Proxy代理模式是一种结构型设计模式,主要解决的问题是:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上.在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层,这个访问层也叫代理.Proxy模式是最常见的模式,在我们生活中处处可见,例如我们买火车票

设计模式学习笔记(十三)—Iterator迭代器模式

Iterator模式定义: 提供一个方法顺序访问一个聚合对象的各个元素,而又不暴露该对象的内部表示. 这个模式在java的类库中已经实现了,在java中所有的集合类都实现了Conllection接口,而Conllection接口又继承了Iterable接口,该接口有一个iterator方法,也就是所以的集合类都可以通过这个iterator方法来转换成Iterator类,用Iterator对象中的hasnext方法来判断是否还有下个元素,next方法来顺序获取集合类中的对象.今天面试考到设计模式,

设计模式学习笔记(九)—Singleton模式

<设计模式>一书对Singleton模式是这样描述的: 保证一个类只有一个实例,并提供一个访问它的全局访问点. 这个模式比较简单,下面给出一个例子: public class Singleton { private static Singleton instance; private Singleton(){ } public static Singleton getInstance(){ if(instance==null) instance=new Singleton(); return

设计模式学习笔记(八)—Template Method模式

<设计模式>一书对Template Method模式是这样描述的: 定义一个操作中算法的骨架,而将一些步骤延迟到子类中.不改变算法的结构而重新定义它的步骤. 我的理解:定义一个抽象类或者说接口,在它的内部定义一些抽象的方法(供TemplateMethod调用的步骤)和一个TemplateMethod方法(非抽象方法),封装了这些抽象方法的接口或抽象类就是骨架.而将它的实现延迟到子类中,也就是用子类实现它.不改变算法的结构而重新定义它的步骤,也就是改写或者实现父类的这些非TemplateMeth