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

简介:
 策略模式的设计原则如下:
    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 " );
}

输出结果如下:
绿头鸭正在用翅膀飞行嘎嘎叫
红头鸭正在用翅膀飞行吱吱叫
橡皮鸭不会飞不会叫正在游泳






 本文转自 androidguy 51CTO博客,原文链接:http://blog.51cto.com/androidguy/214969,如需转载请自行联系原作者

相关文章
|
1天前
|
设计模式 Java 机器人
Java设计模式之工厂方法模式详解
Java设计模式之工厂方法模式详解
|
1天前
|
设计模式 算法
行为型设计模式之模板模式
行为型设计模式之模板模式
|
4天前
|
C#
WPF/C#:程序关闭的三种模式
WPF/C#:程序关闭的三种模式
10 3
|
27天前
|
设计模式 Java 数据库
【设计模式】JAVA Design Patterns——Converter(转换器模式)
转换器模式旨在实现不同类型间的双向转换,减少样板代码。它通过通用的Converter类和特定的转换器(如UserConverter)简化实例映射。Converter类包含两个Function对象,用于不同类型的转换,同时提供列表转换方法。当需要在逻辑上对应的类型间转换,或处理DTO、DO时,此模式尤为适用。
【设计模式】JAVA Design Patterns——Converter(转换器模式)
|
13天前
|
设计模式 新零售 Java
设计模式最佳套路5 —— 愉快地使用工厂方法模式
工厂模式一般配合策略模式一起使用,当系统中有多种产品(策略),且每种产品有多个实例时,此时适合使用工厂模式:每种产品对应的工厂提供该产品不同实例的创建功能,从而避免调用方和产品创建逻辑的耦合,完美符合迪米特法则(最少知道原则)。
34 6
|
13天前
|
设计模式 XML Java
【设计模式】第三篇:一篇搞定工厂模式【简单工厂、工厂方法模式、抽象工厂模式】
三 结尾 如果文章中有什么不足,欢迎大家留言交流,感谢朋友们的支持! 如果能帮到你的话,那就来关注我吧!如果您更喜欢微信文章的阅读方式,可以关注我的公众号
20 5
|
13天前
|
设计模式 Java 关系型数据库
设计模式第2弹:工厂方法模式
type ComputerProduct struct{} // 实现工厂方法 func (computer ComputerProduct) GetInformation() string { return "电脑,官方称呼计算机,主要用于进行数据运算的一台机器。" }
25 4
|
2天前
|
设计模式 人工智能 自然语言处理
【设计模式】MVVM模式在AI大模型领域的创新应用
【设计模式】MVVM模式在AI大模型领域的创新应用
11 0
|
25天前
|
设计模式 安全 Java
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)
该文介绍了一种C++的编程技巧——奇异递归模板模式(CRTP),旨在让派生组件能继承基本组件的特定功能。通过示例展示了如何创建一个`Fighter`接口和`MmaFighter`类,其中`MmaFighter`及其子类如`MmaBantamweightFighter`和`MmaHeavyweightFighter`强制类型安全,确保相同重量级的拳手之间才能进行比赛。这种设计避免了不同重量级拳手间的错误匹配,编译时会报错。CRTP适用于处理类型冲突、参数化类方法和限制方法只对相同类型实例生效的情况。
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)
|
27天前
|
设计模式 Java
设计模式之策略 Strategy
设计模式之策略 Strategy
21 1