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,如需转载请自行联系原作者

相关文章
|
设计模式 算法 搜索推荐
【设计模式】【行为型模式】策略模式(Strategy)
一、入门 什么是策略模式? 策略模式是一种行为设计模式,允许在运行时选择算法或行为。它将算法封装在独立的类中,使得它们可以互换,而不影响客户端代码。 为什么需要策略模式? 策略模式的主要目的是解决算法
305 14
|
设计模式 Java Kotlin
Kotlin学习笔记 - 改良设计模式 - 迭代器模式
Kotlin学习笔记 - 改良设计模式 - 迭代器模式
187 2
|
设计模式 监控 算法
Java设计模式梳理:行为型模式(策略,观察者等)
本文详细介绍了Java设计模式中的行为型模式,包括策略模式、观察者模式、责任链模式、模板方法模式和状态模式。通过具体示例代码,深入浅出地讲解了每种模式的应用场景与实现方式。例如,策略模式通过定义一系列算法让客户端在运行时选择所需算法;观察者模式则让多个观察者对象同时监听某一个主题对象,实现松耦合的消息传递机制。此外,还探讨了这些模式与实际开发中的联系,帮助读者更好地理解和应用设计模式,提升代码质量。
Java设计模式梳理:行为型模式(策略,观察者等)
|
设计模式 JavaScript 前端开发
从工厂到单例再到策略:Vue.js高效应用JavaScript设计模式
【8月更文挑战第30天】在现代Web开发中,结合使用JavaScript设计模式与框架如Vue.js能显著提升代码质量和项目的可维护性。本文探讨了常见JavaScript设计模式及其在Vue.js中的应用。通过具体示例介绍了工厂模式、单例模式和策略模式的应用场景及其实现方法。例如,工厂模式通过`NavFactory`根据用户角色动态创建不同的导航栏组件;单例模式则通过全局事件总线`eventBus`实现跨组件通信;策略模式用于处理不同的表单验证规则。这些设计模式的应用不仅提高了代码的复用性和灵活性,还增强了Vue应用的整体质量。
492 1
|
设计模式 JavaScript Scala
Kotlin学习笔记 - 改良设计模式 - 责任链模式
Kotlin学习笔记 - 改良设计模式 - 责任链模式
192 0
|
设计模式 Java Kotlin
Kotlin 学习笔记- 改良设计模式 - 装饰者模式
Kotlin 学习笔记- 改良设计模式 - 装饰者模式
204 0
|
设计模式 Java
Head First设计模式学习笔记
Head First设计模式学习笔记
|
设计模式 Java
设计模式之策略 Strategy
设计模式之策略 Strategy
247 1
|
设计模式 安全 Java
Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
396 0
|
11月前
|
XML 前端开发 C#
C#编程实践:解析HTML文档并执行元素匹配
通过上述步骤,可以在C#中有效地解析HTML文档并执行元素匹配。HtmlAgilityPack提供了一个强大而灵活的工具集,可以处理各种HTML解析任务。
432 19