HeadFirst设计模式学习笔记(C#版):鸭子与策略(Strategy)模式

简介:

本文为HeadFirst设计模式的学习笔记,如需转载,请注明作者和出处,谢谢!

源代码下载

    策略模式的设计原则如下:

    1.  将应用中需要经常变化的代码独立出来,应和那些不需要经常变化的代码分开。

    2.  应针对接口,而不是类进行编程。

    3.  在类中应多用组合,少用继承。

    例子:

    我们要实现一个鸭子模拟器,这个鸭子模拟器由Duck类描述,而Duck类有如下4个行为:

    1.  display

    2.  swim

    3.  fly(飞)

    4.  quack(叫)

    其中swim是所有鸭子都具有的特性,而且所有鸭子的这些特性都相同,因此,这个方法可以直接在Duck类中实现。display方法也是所有鸭子具有的特性,但随着鸭子的种类不同,display也有所不同,因此,display方法应为Duck类的抽象方法。fly和quack并不是所有鸭子的特性,如橡皮鸭子即不会飞,也不会叫。因此,可以将这两个方法看作是两个行为,可将每一个行为设计成一个接口。这样可以和Duck类完全脱离。因为,fly和quack与Duck一点关系都没有(别的东西也可能fly和quack),然后不同的fly和quack分别用实现相应接口的类表示。

    下面是关于Duck的完整代码:

fly行为

复制代码
     //   飞行接口
     public   interface  FlyBehavior
    {
        String fly();
    }

    
//   飞
     public   class  FlyWithWing : FlyBehavior
    {
        
public  String fly()
        {
            
return   " 正在用翅膀飞行 " ;
        }
    }

    
//   不飞
     public   class  FlyNoWay : FlyBehavior
    {
        
public  String fly()
        {
            
return   " 不会飞 " ;
        }
    }
复制代码


 quack行为

复制代码
     //   叫
     public   interface  QuackBehavior
    {
        String quack();
    }
    
//  嘎嘎叫
     public   class  Quack : QuackBehavior
    {
        
public  String quack()
        {
            
return   " 嘎嘎叫 " ;
        }
    }

    
//   吱吱叫
     public   class  Squeak : QuackBehavior
    {
        
public  String quack()
        {
            
return   " 吱吱叫 " ;
        }
    }

    
//   不叫
     public   class  MuteQuack : QuackBehavior
    {
        
public  String quack()
        {
            
return   " 不会叫 " ;
        }
    } 
复制代码


实现Duck类

复制代码
     //   鸭子超类
     public   abstract   class  Duck
    {
        
protected  FlyBehavior flyBehavior;
        
protected  QuackBehavior quackBehavior;

        
public  Duck()
        {
            
//   默认的行为
            flyBehavior  =   new  FlyWithWing();
            quackBehavior 
=   new  Quack();
        }
        
public  String swim()
        {
            
return   " 正在游泳 " ;
        }
        
public  String performFly()
        {
            
return  flyBehavior.fly();
        }
        
public  String performQuack()
        {
            
return  quackBehavior.quack();
        }
        
public   void  setFlyBehavior(FlyBehavior flyBehavior)
        {
            
this .flyBehavior  =  flyBehavior;
        }
        
public   void  setQuackBehavior(QuackBehavior quackBehavior)
        {
            
this .quackBehavior  =  quackBehavior;
        }
        
public   abstract  String display();
    }
复制代码


建立不同的鸭子类

复制代码
     //   野鸭
     public   class  MallardDuck : Duck
    {
        
public   override  String display()
        {
            
return   " 绿头鸭 " ;
        }
    }

    
//   红头鸭
     public   class  RedHeadDuck : Duck
    {
        
public   override  String display()
        {
            
return   " 红头鸭 " ;
        }
    }

    
//   橡皮鸭
     public   class  RubberDuck : Duck
    {
        
public   override  String display()
        {
            
return   " 橡皮鸭 " ;
        }
    }
复制代码


接口与类的关系如下图

  

调用代码如下:

复制代码
private   void  printMsg(Duck duck)
{
    txtMsg.AppendText(duck.display());
    txtMsg.AppendText(duck.performFly());            
    txtMsg.AppendText(duck.performQuack());
}
private   void  btnStrategy_Click( object  sender, EventArgs e)
{
    txtMsg.Clear();

    Duck duck 
=   new  MallardDuck();
    printMsg(duck);
    txtMsg.AppendText(
" \r\n " );

    duck 
=   new  RedHeadDuck();
    duck.setQuackBehavior(
new  Squeak());
    printMsg(duck);
    txtMsg.AppendText(
" \r\n " );

    duck 
=   new  RubberDuck();
    duck.setFlyBehavior(
new  FlyNoWay());
    duck.setQuackBehavior(
new  MuteQuack());
    printMsg(duck);
    txtMsg.AppendText(duck.swim());
    txtMsg.AppendText(
" \r\n " );
}
复制代码


输出结果如下:

绿头鸭正在用翅膀飞行嘎嘎叫
红头鸭正在用翅膀飞行吱吱叫
橡皮鸭不会飞不会叫正在游泳
本文转自银河使者博客园博客,原文链接http://www.cnblogs.com/nokiaguy/archive/2009/02/11/1388168.html如需转载请自行联系原作者

银河使者
相关文章
|
9天前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
|
11天前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###
|
4天前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
16 1
|
25天前
|
设计模式 Java Kotlin
Kotlin学习笔记 - 改良设计模式 - 迭代器模式
Kotlin学习笔记 - 改良设计模式 - 迭代器模式
26 2
|
25天前
|
设计模式 安全 Java
C# 一分钟浅谈:设计模式之单例模式
【10月更文挑战第9天】单例模式是软件开发中最常用的设计模式之一,旨在确保一个类只有一个实例,并提供一个全局访问点。本文介绍了单例模式的基本概念、实现方式(包括饿汉式、懒汉式和使用 `Lazy<T>` 的方法)、常见问题(如多线程和序列化问题)及其解决方案,并通过代码示例详细说明了这些内容。希望本文能帮助你在实际开发中更好地应用单例模式,提高代码质量和可维护性。
29 1
|
27天前
|
设计模式 Java Kotlin
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
本教程详细讲解Kotlin语法,适合希望深入了解Kotlin的开发者。对于快速学习Kotlin语法,推荐查看“简洁”系列教程。本文重点介绍了构建者模式在Kotlin中的应用与改良,包括如何使用具名可选参数简化复杂对象的创建过程,以及如何在初始化代码块中对参数进行约束和校验。
19 3
|
25天前
|
设计模式 JavaScript Scala
Kotlin学习笔记 - 改良设计模式 - 责任链模式
Kotlin学习笔记 - 改良设计模式 - 责任链模式
42 0
|
25天前
|
设计模式 Java Kotlin
Kotlin 学习笔记- 改良设计模式 - 装饰者模式
Kotlin 学习笔记- 改良设计模式 - 装饰者模式
25 0
|
29天前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
33 0
|
7天前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
20 3