@xuxuzhaozhao
2017-09-27T03:30:07.000000Z
字数 1612
阅读 500
设计模式
设计模式不具体依赖某一特定编程语言,凡是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();//输出外国话
}
}