博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Head First 设计模式笔记:(一)策略模式
阅读量:7029 次
发布时间:2019-06-28

本文共 8435 字,大约阅读时间需要 28 分钟。

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace SmiUDuck{    class Program    {        public abstract class Duck        {            public void Quack()            {                Console.WriteLine("呱呱叫");            }            public void Swim()            {                Console.WriteLine("游泳");            }            public abstract void Display();            //我们需要让鸭子能飞            //但并非所有Duck所有派生类都会飞。            //在Duck超类中加上新的行为,会是的某些并不适合该行为的子类也具有该行为            //对代修改码所做的局部修改,影响面可不只是局部的(会飞的橡皮鸭)            public void Fly()            {                Console.WriteLine("我会飞行");            }        }        ///         /// 绿头鸭        ///         public class MallardDuck : Duck        {            public override void Display()            {                Console.WriteLine("外观是绿头");            }        }        ///         /// 红头鸭        ///         public class RedheadDuck : Duck        {            public override void Display()            {                Console.WriteLine("外观是红头");            }        }        ///         /// 橡皮鸭        /// 吱吱叫        /// 不会飞行        ///         public class RubberDuck : Duck        {            public override void Display()            {                Console.WriteLine("外观是橡皮鸭");            }        }        static void Main(string[] args)        {            Duck duck;            duck = new MallardDuck();            duck.Display();            duck.Quack();            duck.Swim();            duck.Fly();            Console.WriteLine();                                   duck = new RedheadDuck();            duck.Display();            duck.Quack();            duck.Swim();            duck.Fly();                        Console.WriteLine();            //现在橡皮鸭呱呱叫还会飞行和橡皮鸭的行为不相符。            duck = new RubberDuck();            duck.Display();            duck.Quack();            duck.Swim();            duck.Fly();                      Console.ReadKey();        }    }}

运行截图

 (二)利用继承添加橡皮鸭和诱饵鸭满足这两种情况下鸭子的行为

为了让橡皮鸭吱吱叫,且不会飞行将Duck超累中的Quck()和Fly()弄成virtual类型。让橡皮鸭RubberDuck继承Duck超类,在Rubber中重写Quack()方法和Fly()方法,用这样继承貌似这样可以解决问题。

但是如果加入诱饵鸭(木头鸭)既不会叫也不会飞,同样需要重写Quack()方法和Fly()方法,要是后续还有很多其他类型的鸭子,这样会重写Quack()方法和Fly()方法,会大大增加代码量。

利用继承Duck来提供Duck的行为,这会导致如下缺点
(1)代码在多个子类中重复
 (2) 运行时行为不容易改变
 (3)很难知道所有鸭子的全部行为

using System;using System.Collections.Generic;using System.Linq;using System.Text;//为了让橡皮鸭吱吱叫,且不会飞行//将Duck超累中的Quck()和Fly()弄成virtual类型。让橡皮鸭RubberDuck继承Duck超类,在Rubber中重写Quack()方法和Fly()方法//用这样继承貌似这样可以解决问题,但是如果加入诱饵鸭(木头鸭)既不会叫也不会飞//同样需要重写Quack()方法和Fly()方法//要是后续还有很多其他类型的鸭子,这样会重写Quack()方法和Fly()方法,会大大增加代码量//利用继承Duck来提供Duck的行为,这会导致如下缺点//(1)代码在多个子类中重复// (2) 运行时行为不容易改变// (3)很难知道所有鸭子的全部行为namespace SmiUDuck2{    class Program    {        public abstract class Duck        {            public virtual void Quack()            {                Console.WriteLine("呱呱叫");            }            public  void Swim()            {                Console.WriteLine("游泳");            }            public abstract void Display();            //我们需要让鸭子能飞            //但并非所有Duck所有派生类都会飞。            //在Duck超类中加上新的行为,会是的某些并不适合该行为的子类也具有该行为            //对代修改码所做的局部修改,影响面可不只是局部的(会飞的橡皮鸭)            public virtual void Fly()            {                Console.WriteLine("我会飞行");            }        }        ///         /// 绿头鸭        ///         public class MallardDuck : Duck        {            public override void Display()            {                Console.WriteLine("外观是绿头");            }        }        ///         /// 红头鸭        ///         public class RedheadDuck : Duck        {            public override void Display()            {                Console.WriteLine("外观是红头");            }        }        ///         /// 橡皮鸭        /// 吱吱叫        /// 不会飞行        ///         public class RubberDuck : Duck        {            public override void Quack()            {                               Console.WriteLine("吱吱叫");            }            public override void Fly()            {                Console.WriteLine("我不会飞行");            }            public override void Display()            {                Console.WriteLine("外观是橡皮鸭");            }        }        ///         ///诱饵鸭(木头鸭)既不会叫也不会飞           ///         public class DecoyDuck : Duck        {            public override void Quack()            {                Console.WriteLine("不会叫");            }            public override void Fly()            {                Console.WriteLine("不会飞行");            }            public override void Display()            {                Console.WriteLine("外观是橡皮鸭");            }        }        static void Main(string[] args)        {            Duck duck;            duck = new MallardDuck();            duck.Display();            duck.Quack();            duck.Swim();            duck.Fly();            Console.WriteLine();            duck = new RedheadDuck();            duck.Display();            duck.Quack();            duck.Swim();            duck.Fly();            Console.WriteLine();                      duck = new RubberDuck();            duck.Display();            duck.Quack();            duck.Swim();            duck.Fly();            Console.WriteLine();                       duck = new DecoyDuck();            duck.Display();            duck.Quack();            duck.Swim();            duck.Fly();            Console.ReadKey();        }    }}

(三)利用接口

我们可以把Fly()从超类中提出出来放在IFlyAble接口中,只有会飞的鸭子才实现此接口,同样可以设计一个IQuackAble,虽然IFlyable与Quaackable可以解决“一部分”问题(不会再有会飞的橡皮鸭)。但是代码无法复用。甚至会飞的鸭子中,飞行的动作可能还有多种变化。

using System;using System.Collections.Generic;using System.Linq;using System.Text;//利用接口//我们可以把Fly()从超类中提出出来放在IFlyAble接口中,只有会飞的鸭子才实现此接口,同样可以设计一个IQuackAble//虽然IFlyable与Quaackable可以解决“一部分”问题(不会再有会飞的橡皮鸭)。但是代码无法复用。甚至会飞的鸭子中,飞行的动作可能还有多种变化namespace SimUDuck3{    class Program    {        public interface IFlyAble        {            void Fly();                    }        public interface IQuackAble        {            void Quack();                   }        public abstract class Duck        {            public void Swim()            {                Console.WriteLine("游泳");            }            public abstract void Display();                               }        ///         /// 绿头鸭        ///         public class MallardDuck : Duck,IQuackAble,IFlyAble        {            public void Quack()            {                Console.WriteLine("呱呱叫");            }             public void Fly()            {                Console.WriteLine("我会飞行");            }            public override void Display()            {                Console.WriteLine("外观是绿头");            }        }        ///         /// 红头鸭        ///         public class RedheadDuck : Duck,IQuackAble,IFlyAble        {            public void Quack()            {                Console.WriteLine("呱呱叫");            }            public void Fly()            {                Console.WriteLine("我会飞行");            }            public override void Display()            {                Console.WriteLine("外观是红头");            }        }        ///         /// 橡皮鸭        /// 吱吱叫        /// 不会飞行        ///         public class RubberDuck : Duck,IQuackAble        {            public void Quack()            {                Console.WriteLine("吱吱叫");            }            public override void Display()            {                Console.WriteLine("外观是橡皮鸭");            }        }        ///         ///诱饵鸭(木头鸭)既不会叫也不会飞           ///         public class DecoyDuck : Duck        {                     public override void Display()            {                Console.WriteLine("外观是诱饵鸭(木头鸭)");            }        }        static void Main(string[] args)        {            MallardDuck mallardDuck = new MallardDuck();            mallardDuck.Display();            mallardDuck.Quack();            mallardDuck.Swim();            mallardDuck.Fly();            Console.WriteLine();            RedheadDuck redheadDuck = new RedheadDuck();            redheadDuck.Display();            redheadDuck.Quack();            redheadDuck.Swim();            redheadDuck.Fly();            Console.WriteLine();            RubberDuck rubberDuck = new RubberDuck();            rubberDuck.Display();            rubberDuck.Quack();            rubberDuck.Swim();                     Console.WriteLine();            DecoyDuck decoyDuck = new DecoyDuck();            decoyDuck.Display();            decoyDuck.Swim();                     Console.ReadKey();        }    }}

 

 

转载地址:http://aerxl.baihongyu.com/

你可能感兴趣的文章
[PHP] 算法-选择排序的PHP实现
查看>>
UWP 扩展/自定义标题栏的方法,一些概念和一些注意事项
查看>>
uio.c 分析【转】
查看>>
MongodDB---初识
查看>>
js调用ajax案例2,使用ok
查看>>
淘宝开放平台获取沙箱token
查看>>
.NET Core下的Spring Cloud——前言和概述
查看>>
GDI+命中测试的效率[r]
查看>>
Yet Another STORM
查看>>
详细解说IIS运用程序池以及运用程序池回收【转】
查看>>
MS CRM 2011 用Jscript打开新窗口的几种方法
查看>>
(轉貼) 5交大生創「推推王」 遠征矽谷 (News)
查看>>
MapInfo格式到ArcInfo格式的转换
查看>>
[CF Skills].NET CF3.5中确定设备的平台类型(版本号)
查看>>
电子书下载:C# 5.0 Pocket Reference
查看>>
AsmStudio 汇编语言集成开发环境 破解
查看>>
Asp.Net 中Report Service (RDLC)动态绑定数据-学习笔记
查看>>
POJ 1201 Intervals
查看>>
HDU 4006 The kth great number (优先队列)
查看>>
AE开发 入门教程
查看>>