[关闭]
@xuxuzhaozhao 2017-09-27T03:30:07.000000Z 字数 1612 阅读 500

设计模式 - 策略模式

设计模式


设计模式不具体依赖某一特定编程语言,凡是OO语言都可以使用策略模式。

1 首先策略模式是什么?

初次理解:指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。就如人类都可以说话,但是外国人说外国话,中国人说中国话
更深理解:定义了算法族(一个算法族指实现同一个接口的多个不同类),分别封装起来,让他们之间可以相互转换,此模式让算法的变化独立于使用算法的客户。

2 策略模式使用场景

策略模式对应于解决某一问题的一个算法族,允许用户从该算法族中任选一个算法来解决某一问题,同时可以方便地更换算法或者增加新的算法。只要涉及到算法的封装、复用和切换都可以考虑使用策略模式

3 基本概念到此为止,下面先演示不使用策略模式让不同国家的人说话

  1. public class PersonClass
  2. {
  3. public virtual void Say()
  4. {
  5. Console.WriteLine("人类说话");
  6. }
  7. }
  8. public class ForeignerPeople : PersonClass
  9. {
  10. public override void Say()
  11. {
  12. Console.WriteLine("外国佬说外国话。");
  13. }
  14. }
  15. public class ChinesePeople : PersonClass
  16. {
  17. public override void Say()
  18. {
  19. Console.WriteLine("中国人说中国话。");
  20. }
  21. }
  22. //实现
  23. class Program
  24. {
  25. static void Main(string[] args)
  26. {
  27. var chinese = new Chinese();
  28. chinese.Say();//输出"你好,我是中国人。"
  29. }
  30. }

PS:这样真的好吗,那必须相当的不好啊!(傻逼式的自问自答。2333333)
PSS:万一哪天我不想说中国话,我还得去Chinese类里面改Say()方法,改好了后,过两天我又想说中国话了,又去改Chinese类吗?

4 哪如何实现动态的更改Chinese类想说哪国话就说哪国话呢?

牛逼的策略模式登场:

  1. 1、定义人类有的行为比如说话
  2. public interface ISay
  3. {
  4. void Say();
  5. }
  6. 2、实现这个行为接口
  7. public class ChineseLanguage : ISay
  8. {
  9. public void Say()
  10. {
  11. Console.WriteLine("中国话");
  12. }
  13. }
  14. public class ForeignerLanguage : ISay
  15. {
  16. public void Say()
  17. {
  18. Console.WriteLine("外国话");
  19. }
  20. }
  21. 3、定义超类
  22. public class PersonClass
  23. {
  24. public ISay _say;
  25. public void Say()
  26. {
  27. _say.Say();
  28. }
  29. //动态设定行为
  30. public void setDynamicFun(ISay say)
  31. {
  32. _say = say;
  33. }
  34. }
  35. 4、具体人
  36. public class ChinesePeople : PersonClass
  37. {
  38. public ChinesePeople()
  39. {
  40. _say = new ChineseLanguage();
  41. }
  42. }
  43. 5、使用
  44. class Program
  45. {
  46. static void Main(string[] args)
  47. {
  48. var chinese = new ChinesePeople();
  49. //今天想说中国话
  50. chinese.Say();//输出中国话
  51. //明天想说外国话
  52. chinese.setDynamicFun(new ForeignerLanguage());
  53. chinese.Say();//输出外国话
  54. }
  55. }

总结:

  1. 确定一个超类(PersonClass);
  2. 确定超类有哪些行为(说话,......);
  3. 分别对这些行为定义接口(ISay,......);
  4. 分别对定义的接口实现算法族(ISay的算法族包含:ChineseLanguage、ForeignerLanguage)
  5. 建立具体的人(ChinesePeople)并继承自超类(PersonClass)
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注