策略模式(StragetyPattern)学习记录
2016-01-12 10:24
357 查看
策略模式定义:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
本章提到三个设计原则:
一:找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。
二:针对接口编程,而不是针对实现编程。
三:多用组合少用继承。
首先我们来看最重要的超类。
仔细观察该类。飞和叫的行为被抽象出来了,因为并不是所有的鸭子都是会飞和会叫的。这就符合了设计原则的第一条,把可变的抽象出来。也是策略模式最重要的核心。抽象出可变的行为,交给perform来实现。而接口中只要定义叫和飞的行为就好。
接下来我们看看如何实现。定义一个绿头鸭,继承鸭子的超类。
很简单只要在构造函数中实现飞和叫的行为就好了。
接下来调用验证
对就是这么简单,就实现绿头鸭的功能了。
细心的人会发现在超鸭类中还有两个函数setFlyBehavior和setFlyBehavior两个方法,这两个方法是干什么用的呢,从代码上就可以看出是要动态设置飞行行为和叫的行为的。应用场景呢就是比如一个模型鸭是不会飞的,现在呢需要给模型鸭装上火箭动力。怎么办呢,其实这就用到动态设置鸭子行为的方法了。
首先我们先添加一个模型鸭类跟绿头鸭是一样的。
然后添加一个火箭动力的飞行行为
接下来调用模型鸭
重点就是setFlyBehavior方法,动态给模型鸭添加了火箭动力。
好了,策略模式就是这么多,重点也全部体现在超类Duck中。
第一次写这种类型的文章,哪里有不懂的欢迎留言问我。
也可以加群169767436私聊群主要源码。大家一起讨论学习,一起进步。
本章提到三个设计原则:
一:找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。
二:针对接口编程,而不是针对实现编程。
三:多用组合少用继承。
首先我们来看最重要的超类。
public abstract class Duck { //抽象出飞行行为 public IFlyBehavior flyBehavior; //抽象出叫的行为 public IQuackBehavior quackBehavior; public abstract void display(); public void performQuack() { quackBehavior.quack();//委托给行为类 } public void performFly() { flyBehavior.fly();//委托给行为类 } public void swim() { Console.WriteLine("All ducks float,event decoys!"); } public void setFlyBehavior(IFlyBehavior fb) { flyBehavior = fb;//可以动态设置行为(方便扩展) } public void setQuackBehavior(IQuackBehavior qb) { quackBehavior = qb; } }
仔细观察该类。飞和叫的行为被抽象出来了,因为并不是所有的鸭子都是会飞和会叫的。这就符合了设计原则的第一条,把可变的抽象出来。也是策略模式最重要的核心。抽象出可变的行为,交给perform来实现。而接口中只要定义叫和飞的行为就好。
接下来我们看看如何实现。定义一个绿头鸭,继承鸭子的超类。
public class MallardDuck:Duck { public MallardDuck() { flyBehavior = new FlyWithWings(); quackBehavior = new Quack(); } public override void display() { Console.WriteLine("I'm a real Mallard duck"); } }
很简单只要在构造函数中实现飞和叫的行为就好了。
接下来调用验证
Duck mallard = new MallardDuck(); mallard.display(); mallard.performQuack(); mallard.performFly();
对就是这么简单,就实现绿头鸭的功能了。
细心的人会发现在超鸭类中还有两个函数setFlyBehavior和setFlyBehavior两个方法,这两个方法是干什么用的呢,从代码上就可以看出是要动态设置飞行行为和叫的行为的。应用场景呢就是比如一个模型鸭是不会飞的,现在呢需要给模型鸭装上火箭动力。怎么办呢,其实这就用到动态设置鸭子行为的方法了。
首先我们先添加一个模型鸭类跟绿头鸭是一样的。
public ModelDuck() { flyBehavior = new FlyNoWay(); quackBehavior = new Quack(); } public override void display() { Console.WriteLine("I'm a model duck"); }
然后添加一个火箭动力的飞行行为
public class FlyRocketPowered:IFlyBehavior { public void fly() { Console.WriteLine("I'm flying with a rocket!"); } }
接下来调用模型鸭
Duck model = new ModelDuck(); model.display(); model.performQuack(); model.setFlyBehavior(new FlyRocketPowered()); model.performFly();
重点就是setFlyBehavior方法,动态给模型鸭添加了火箭动力。
好了,策略模式就是这么多,重点也全部体现在超类Duck中。
第一次写这种类型的文章,哪里有不懂的欢迎留言问我。
也可以加群169767436私聊群主要源码。大家一起讨论学习,一起进步。
相关文章推荐
- C#6.0新特性
- 【C#】 get 与 set 方法
- c#控件说明
- c# 调用 WINDOW API DLL
- C#读取ini文件的方法
- C# 插入或删除word分页符
- C#中DllImport用法汇总
- C#反射Assembly 详细说明
- [读书笔记]C#学习笔记二: 委托和事件的用法及不同.
- 一套通过c# sap-rfc 完整处理内表输入输出的程序
- C#数据流
- C# Devexpress 中控件的一些使用技巧
- C#基础回顾(一)—C#访问修饰符
- C# 使用VS导进自己写的dll或者第三方dll
- C# winform combobox控件中子项加删除按钮(原创)
- 迭代器模式 c#
- C# window 窗体 保持最前显示
- C# 读取EXCEL数据
- C# 调用浏览器打开网址
- C# winform 窗体弹出选择目录或文件 的对话框