策略模式(StragetyPattern)学习记录
来源:互联网 发布:爱淘宝女鞋新款 编辑:程序博客网 时间:2024/06/06 09:42
策略模式定义:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
本章提到三个设计原则:
一:找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。
二:针对接口编程,而不是针对实现编程。
三:多用组合少用继承。
首先我们来看最重要的超类。
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私聊群主要源码。大家一起讨论学习,一起进步。
1 0
- 策略模式(StragetyPattern)学习记录
- PHP学习记录----策略模式
- 成长记录--策略模式
- 策略模式(学习笔记)
- 设计模式学习(一)策略模式
- 设计模式学习(一)、策略模式
- Java记录 -66- 策略模式
- 记录我的学习设计模式的点点滴滴,从这一篇开始——策略模式
- IOS设计模式学习(19)策略
- 学习一策略模式(strategy)
- 策略模式的学习
- 策略模式的学习
- 策略模式学习
- 策略模式学习案例
- 学习日记-策略模式
- 策略模式学习笔记
- 策略模式学习笔记
- 策略模式学习1
- (shell笔记一)shell简介
- 打开sqlserver之后出现的问题:未将对象引用设置到对象的实例
- 聚类算法:DBScan算法
- Mybatis的<where><foreach><set>等标签详解
- 【c/c++】assert()函数
- 策略模式(StragetyPattern)学习记录
- HiveSql(2)Lateral view_转行为列
- Unity 3D Quaternion的使用
- Wireshark(1):Wireshark基本用法
- PHP加密与解密
- Cairo Tutorial for Python Programmers
- Callable,Runnable比较及用法
- 深入分析JavaWeb Item50 -- Spring开发入门
- JedisPoolConfig 参数列表