@xuxuzhaozhao
2017-09-27T03:30:07.000000Z
字数 1612
阅读 572
设计模式
设计模式不具体依赖某一特定编程语言,凡是OO语言都可以使用策略模式。
初次理解:指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。就如人类都可以说话,但是外国人说外国话,中国人说中国话
更深理解:定义了算法族(一个算法族指实现同一个接口的多个不同类),分别封装起来,让他们之间可以相互转换,此模式让算法的变化独立于使用算法的客户。”
策略模式对应于解决某一问题的一个算法族,允许用户从该算法族中任选一个算法来解决某一问题,同时可以方便地更换算法或者增加新的算法。只要涉及到算法的封装、复用和切换都可以考虑使用策略模式。
public class PersonClass{public virtual void Say(){Console.WriteLine("人类说话");}}public class ForeignerPeople : PersonClass{public override void Say(){Console.WriteLine("外国佬说外国话。");}}public class ChinesePeople : PersonClass{public override void Say(){Console.WriteLine("中国人说中国话。");}}//实现class Program{static void Main(string[] args){var chinese = new Chinese();chinese.Say();//输出"你好,我是中国人。"}}
PS:这样真的好吗,那必须相当的不好啊!(傻逼式的自问自答。2333333)
PSS:万一哪天我不想说中国话,我还得去Chinese类里面改Say()方法,改好了后,过两天我又想说中国话了,又去改Chinese类吗?
牛逼的策略模式登场:
1、定义人类有的行为比如说话public interface ISay{void Say();}2、实现这个行为接口public class ChineseLanguage : ISay{public void Say(){Console.WriteLine("中国话");}}public class ForeignerLanguage : ISay{public void Say(){Console.WriteLine("外国话");}}3、定义超类public class PersonClass{public ISay _say;public void Say(){_say.Say();}//动态设定行为public void setDynamicFun(ISay say){_say = say;}}4、具体人public class ChinesePeople : PersonClass{public ChinesePeople(){_say = new ChineseLanguage();}}5、使用class Program{static void Main(string[] args){var chinese = new ChinesePeople();//今天想说中国话chinese.Say();//输出中国话//明天想说外国话chinese.setDynamicFun(new ForeignerLanguage());chinese.Say();//输出外国话}}