zoukankan      html  css  js  c++  java
  • 设计模式系列(一) 策略模式

    HeadFirst设计模式这个书买回来,就看了两三成,而且一忙起来就是忘得干干净净,每次都要回头慢慢复习,不但效率很低,而且人的积极性也不高,所以现在开始,从第一个设计模式开始,每学习一个部分,都要记录和总结,并且把自己的体会记录下来,也是对自己编程水平的一个提高,第一个设计模式策略模式

    1.1 定义:

    策略模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

    1.2 总结在前:

    策略模式中用到的设计原则

    • 找出应用程序可能变化的地方,把他们独立出来,不要和那些不需要变化的代码混在一起。
    • 针对接口编程,而不是实现;多用组合,少用继承。

    一些要点

    • 知道OO基础(封装继承多态)并不足以让你设计出良好的OO系统。
    • 良好的OO系统必须具备可复用,可扩充,可维护三个特性。

    2.1 从鸭子模拟器开始策略模式

    需求

    1. 有不同种类的鸭子,绿毛鸭,会飞鸭,橡皮鸭子,火箭鸭子等等
    2. 鸭子具有不同的行为,比如有的鸭子会飞,有的不会,有的会叫有的不会叫
    3. 同一行为的具体表现也不一样,比如有的鸭子呱呱叫,有的鸭子咕咕叫(实现不一样)
    4. 有时候我们需要动态的改变鸭子的行为,比如橡皮鸭不会飞,在运行过程中,橡皮鸭得到了火箭,获得了飞行的能力,即火箭飞。

    2.2 思路阐述

    根据上面的需求,逐条阐述思路:

    1. 鸭子为基类或者基接口,其他的具体的鸭子都是子类。
    2. 行为即能力,OO中就是接口。鸭子类中,用字段和属性来保存接口。
    3. 接口有不同的子类来实现多态。
    4. 鸭子类中,字段和属性保存的接口实现可以修改,即可以set。

    2.3 代码实现

    首先定义接口和接口实现

     public interface IflyBehavior
        {
            void fly();
        }
        public interface IQuackBehavior
        {
            void quack();
        }
        //接口实现
        public class FlyWithWings : IflyBehavior
        {
            public void fly()
            {
                Console.WriteLine("fly with wings");
            }
        }
        public class FlyNoWay : IflyBehavior
        {
            public void fly()
            {
                Console.WriteLine(" can not fly");
            }
        }
        public class Quack : IQuackBehavior
        {
            public void quack()
            {
                Console.WriteLine("gua gua gua ");
            }
        }
       
    

    然后就是鸭子基类的设计:

    因为有些方法必须子类重写display(),所以为抽象类,必须重写的方法为抽象方法

       public abstract class Duck
        {
            public Duck()
            {
                //基类构造函数
            }
            public IflyBehavior fly;
            public IQuackBehavior quack;
    
            public abstract void display();
    
            //具体实现委托给行为类
            public void performFly()
            {
                fly.fly();
            }
            public void performQuack()
            {
                quack.quack();
            }
    
            //实现动态设定行为
            public void SetFlyBehavior(IflyBehavior ifly)
            {
                fly = ifly;
            }
            public void SetQuackBehavior(IQuackBehavior iquack)
            {
                quack = iquack;
            }
    
            //基类中的公用方法
            public void swim()
            {
                Console.WriteLine("all ducks float");
            }
        }
    

    具体的某一种鸭子的实现:

      public class SuperDuck : Duck
        {
            public SuperDuck()
            {
                this.fly = new FlyWithWings();
                this.quack = new Quack();
            }
            public override void display()
            {
                Console.WriteLine("this is super duck");
            }
        }
    

    控制台测试:

      static void Main(string[] args)
            {
                Duck d = new SuperDuck();
                d.performFly();
                d.performQuack();
                d.SetFlyBehavior(new FlyNoWay());
                d.performFly();
    
    
                Console.ReadKey();
    
            }
    

    输出结果为:

    fly with wings
    gua gua gua
    can not fly
    
    
  • 相关阅读:
    关于 Delphi 中流的使用(2) 用 TFileStream(文件流) 读写
    今日工作心得:asp.net中使用javascript进行验证的注意点
    今日工作心得:能够引起FileUpload控件的PostedFile总是为null的一个原因
    完美解决office 2007安装失败(Office.ZhCN/...)
    关于FCKeditor,上传文件时提示invalid request
    今日学习:关于C#多线程之一——异步委托
    今日工作心得:关于C#读取Excel的一些资料
    c# webBrowser读取gb2312 中文变方框的问题
    C#中HashTable的用法
    今日工作心得——javascript结合jquery使图片适应窗口大小
  • 原文地址:https://www.cnblogs.com/codersun/p/6953909.html
Copyright © 2011-2022 走看看