设计模式之策略模式
在金庸的笑傲江湖里有一个争论持续了数百年,那便是以术御剑?还是以气御剑?最后因为争端不止而各成一派,支持以术御剑者为剑宗,然而支持以气御剑则为气宗。终于剑宗败给气宗而落没。让人意想不到的是,百年以后,有一个叫令狐冲的青年才俊阴错阳差习得剑宗留下的招式,却能打败其师岳不群,认为剑宗强过气宗。不知是天意安排,还是有意为之,令公子又遇到武林公敌任我行,却又习得武林绝学吸星大法,能打败东方不败,最终成为天下第一。
我在这里想讲的不是金老的武侠小说,而是我对技术的理解,技术在我们手里是一柄剑我们究意是以术御剑?还是以气御剑?其实我的理解这个问题,就像当年的“以己之矛攻己之盾,夫何为?”一样无聊,因为这个问题本身就不存在对立面,矛和盾怎么就不能在一起呢?坦克不就同时拥有了矛和盾吗?
那么我们回到工作本身,术,大概指的是千变万化的框架,是直接展示在各位看官眼中的武功招式;气,大概指的是万变不离其宗的设计模式,是一道区分大家与黄毛的鸿沟。但是这真的是一个铜板的两面么?儒家的主要思想是中庸之道,它讲的是认识的方法论:格物、致知、诚意、正心、修身、齐家、治国、平天下。其中格物、致知是接触事物之始的态度,从表面上研究某一个特定的事物,随着认识的不断深入,我们的理解也在加深,,对应着工作的头几年,经历各种各样的困难,解决各种各样的困难,加深自己的生命体验,明白自己当下的处境,如此就是格物、致知的含义了。其实这个时侯我们也到了而立之年,孔子说:“不患无位,患所以立;不患莫己知,求为可知也。”由此可见,自然始成,有些命题始终存在,我们何以安身立命?人不应该担忧自己在社会上地位如何,而应该忧虑的是自己做人的根本是什么;人不应该担忧人家不知道自己,而应该探求的是有什么值得叫人家知道的能力、德行。我们什么都不能依靠,唯有能力和德行。
什么样的能力可以让我们鹤立鸡群?去学习软件世界的规则,这样你才能越走越宽。这些规则,就是设计模式。
花了这么长时间来讲设计模式的重要性,要从根本上知道为什么学习一项技能,比盲目的学习要强得多。
以前写过一篇《简单工厂学习小结》,现在需要再写一篇《策略模式学习小结》了。
策略模式:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少各种算法类与使用算法类之间的耦合。其优点是简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。
Strategy类,定义所有支持的算法的公共接口。
Abstract class Strategy
{
//算法方法
Public abstract void Algorithmlnterface();
}
ConcreteStrategy,封装了具体的算法或行为,继承于Strategy。
//具体算法A
class ConcreteStrategyA:Strategy
{
//算法A实现方法
Public override void AlgorithmInterface()
{
Console.WriteLine(“A”);
}
}
//具体算法B
class ConcreteStrategyB:Strategy
{
//算法B实现方法
Public override void AlgorithmInterface()
{
Console.WriteLine(“B”);
}
}
//具体算法C
class ConcreteStrategyC:Strategy
{
//算法C实现方法
Public override void AlgorithmInterface()
{
Console.WriteLine(“C”);
}
}
Context,用一个ConcreteStrategry来配置,维护一个对Strategy对象的引用。
//上下文
class Context
{
Strategy strategy;
Public Context(Stratety stratetgy)//初始化时,传入具体的策略对象
{
This.strategy = strategy;
}
//上下文接口
Public void ContextInterface()
{
This.strategy.algorithmInterface();
}
}
策略模式本身没有什么难的,因为这种策略模式的优点在于降低程序的耦合程度,保证程序的可维护性。
这种策略模式的实现类似简单工厂,可扩展不强,所以第二种策略模式的实现方法为利用反射技术。


浙公网安备 33010602011771号