策略模式
来源:互联网 发布:阿里云磁盘快照 编辑:程序博客网 时间:2024/05/16 06:26
最近开始看设计模式方面的书,《Head First 设计模式》是一本特别适合入门的书,里面用风趣的语言,搞笑的插图,让你跟着笔者一步一步的思考,每讲完一种模式,都会让你记忆深刻,强烈推荐想要学习设计模式的同学看看。作此记录,能让自己有更深的印象,其中大部分的内容都是该书中的,只不过这本书的语言是java
开始第一种模式——策略模式
定义:定义算法族,分别封装起来,让他们之间互相替换,此模式让算法的变化独立使用算法的客户。
个人理解:此模式将一些易改变的方法封装起来(用接口的方式),让其独立出来,与不需要改变的方法分开,这样可以应对当某些方法需要改变市,只需要改动算法,或者定义新的算法,代码如下
<pre class="csharp" name="code"> /// <summary> /// 虚基类鸭子 /// </summary> public abstract class Duck { /// <summary> /// 飞行接口 /// </summary> public FlyBehavior flyBehavior; /// <summary> /// 叫声接口 /// </summary> public PerforQuark perforQuark; /// <summary> /// 显示 /// </summary> public abstract void Display(); /// <summary> /// 飞行方法 /// </summary> public void PerformFly() { flyBehavior.Fly(); } /// <summary> /// 叫声方法 /// </summary> public void PerformQuark() { perforQuark.Quark(); } /// <summary> /// 公用的方法,确定不会改变的 /// </summary> public void Swim() { Console.WriteLine("游泳 所有的鸭子都会游泳"); } /// <summary> /// 设置飞行行为接口 /// </summary> /// <param name="fb">飞行接口</param> public void SetFlyBehavior(FlyBehavior fb) { flyBehavior = fb; } /// <summary> /// 设置叫声接口 /// </summary> /// <param name="qu">叫声接口</param> public void SetQuackBehavior(PerforQuark qu) { perforQuark = qu; } }
这里定义了虚基类,里面有飞行和叫声接口,将飞行方法和叫声进行了封装,而对于都存在的游泳方法实现,这样把会改变的封装,并且定义了两个设置飞行和叫声的方法,这样可以在动态对方法进行改变
/// <summary> /// 飞行接口 /// </summary> public interface FlyBehavior { void Fly(); } /// <summary> /// 可以飞行类 /// </summary> public class FlyWithWings : FlyBehavior { public void Fly() { Console.WriteLine("可以飞"); } } /// <summary> /// 不能飞行类 /// </summary> public class FlyNoWay : FlyBehavior { public void Fly() { Console.WriteLine("不能飞"); } } /// <summary> /// 火箭飞 /// </summary> public class FlyWithRock : FlyBehavior { public void Fly() { Console.WriteLine("坐在火箭上飞"); } }
这里定义飞行接口及实现接口的方法,将可能会改变的飞行方法定义接口,当有新的方法时,只需要增加类即可
/// <summary> /// 叫声接口 /// </summary> public interface PerforQuark { void Quark(); } /// <summary> /// 嘎嘎叫方法 /// </summary> public class Squeak : PerforQuark { public void Quark() { Console.WriteLine("嘎嘎"); } } /// <summary> /// 嘻嘻方法 /// </summary> public class MuteQuark : PerforQuark { public void Quark() { Console.WriteLine("嘻嘻"); } }
叫声接口及子类实现
</pre><div><pre class="csharp" name="code"> /// <summary> /// 子类鸭 鸭方法 /// </summary> public class MallardDuck : Duck { public MallardDuck() { flyBehavior = new FlyWithWings(); perforQuark = new Squeak(); } public override void Display() { Console.WriteLine("我是绿头鸭"); } }
最后定义子类鸭,子类选择自己实现的飞行类和叫声类,这样不需要管具体的实现。
主方法
static void Main(string[] args) {
//生成鸭类 Duck duck = new MallardDuck();
//调用方法 duck.PerformFly(); duck.PerformQuark(); duck.Swim();
//可以动态改变实现方法 duck.SetFlyBehavior(new FlyWithRock()); duck.PerformFly(); }
以上就是一个简单的策略模式,该模式将变化的算法封装起来,并全能够在调用的时候进行算法的修改
三个原则:
1.封装变化
2.多用组合,少用继承
3.针对接口编程,不针对实现编程
0 0
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- HDU 1877 又一版 A+B
- Action ***cannot be found in the namespace
- Ubuntu使用过程中遇到的问题及解决办法
- hdu3081 Marriage Match II
- AngularJS学习记录-作用域
- 策略模式
- 蓝桥杯:寻找数组中最大值
- 系统时间格式转换
- 关于android硬编h264----一小白踩得坑
- replace与replaceAll()的区别
- map server
- 忠于原著的原汁原味Caffe安装 Ubuntu+Windows双版本
- SQL四种语言:DDL,DML,DCL,TCL
- android 6.0权限适配哥哥踩过的坑