`
abcxo
  • 浏览: 32398 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

4.分解共同性-策略模式(Strategy)+模板方法(Template method)

阅读更多


重复的工作是让人最反感的,也是最打击生活的,特别是反复的写相同的代码,相同的功能,相类似的软件,你会发现自己沦落成为了一只程序鸭,每天都被这些死人的系统软件强*,当初学软件的的那一种幸福的心情顿时就没有了,说起以前,我觉得一辈子之中,肯定你会遇到几个让你改变一生的人的,那时已经是大一末了,班主任布置了一个编程项目,我抱着积极的心态去试了一下,没想到这就是我编程的开始,此时我很幸运的去到c#和数据库的选修课,我很认真的听讲,我记得那一段时间是一个月,那个月是亚运月,我要去地铁上班,那一个月我完全沉浸在编程的高潮之中,无论是搭地铁,还是上班,我在看书,我在组织功能逻辑,恨不得回到去就马上实现,那一个月是非常疯狂的一个月,是我大学里面最值得骄傲的一件事情,我除了编程,还是编程,我觉得自己就像一个艺术家在雕刻着自己的雕塑,一点一点,废寝忘食,最终作品得到了老师的高度赞扬,但是往后的一年时间我再也没有编程了,为什么呢,可能是“纵欲过度吧”,但是我觉得过多的原因是老师接项目的拖拉,一个项目可以弄一年都没有确定完全接下来,这是多么消磨一个人的意志啊,对于我的性格,我主张的就是快很准,想到了就去实践,拖拖拉拉的程序项目才是最烦人的,其中最受不了的是没有边际的功能,所谓的需求就是老师的一把嘴,今天想到了就要加进去,,明天不要了,又要删掉,我只能说,做这样的项目,我宁愿去做乞丐,我想说的是,程序员不是码农,他们的思维往往引领着潮流,一场革命(这个千百个故事证明了),然后发挥程序员独有的看法,还有积极性,我觉得是每一家it公司都需要认真对待和考虑的问题,好吧,回归正题,分解共同性:应用“一次且只能有一次” 原则产生最基本的模式,将变化的那部分代码放到方法里。这个想法最新提出的应该程序员,因为公司中的人(不是程序员)他们往往认为,程序基本都是可以复用的,如果要做另外一个软件,需要变得可能也就是界面的那一部分而已,为了满足这些想法,我们这里需要用到一些模式.




策略模式(Strategy):
运行时刻选择算法,其实策略模式和状态模式很像,仅看代码,你会发现根本就是相同的东西,这就是我刚才说的东西了,代码相同,模式的思想才是指导你的真正的手,策略模式更加强调的是通过上下文的不同,选择不同的策略应对,而状态模式强调的是切换不同的状态,来引导出不同的行为。示例代码我就不写了,因为就是你提供一个上下文,然后通过一个方法选择不同的策略(这策略往往代表的是不同的算法),还是举个例子吧,就是当你处于一个环境(项目没有完成,但是很赶),这时候你有两种策略来应对这个环境,1.不停的加班,不停的赶代码,  2,.给自己放假,去玩,然后回来看看设计模式,然后开始工作。这个就是两种策略,又或者是大学城南到岗顶,你可以做地铁+走路,或者你可以巴士+地铁+自行车+飞机+走路,这又是两种不同的策略。策略模式更加进一步的泛化,Policy模式,通常情况下,把Strategy 模式和Policy 模式区别开来是很有好处的,用Strategy 模式处理一个方法(变化)的情况,而用Policy 模式处理多个方法。









模板方法(Template method):
应用程序框架使你可以从一个或者一系列类继承下来,进而创建一个新的应用程 序,你可以重用既有类的大多数代码并且按照你自己的需要覆写其中的某些方法,从 而实现应用程序的定制。Template Method 是应用程序框架的一个基本概念,它通常隐 藏在(框架)背后,通过调用基类的一组方法(有些方法你可能已经覆写 (overridden)过了)来驱动应用程序。  这是书上的概念,不过我觉得写得够好了,模版方法一直是我想深入了解的东西,因为我想写框架什么的。而很多时候一下经典的例子使用最大的概念就是模版方法,而内部就使用其他各种模式实现这样。
Template Method 的一个重要特征是:它是在基类里定义的,而且不能够被(派生类)更改。有时候它是私有方法(private method),但实际上它经常被声明为final(的确是这样,不能修改,只能重写)。它通过调用其它的基类方法(覆写过的)来工作,但它经常是作为初始化过程的一部分被调用的,这样就没必要让客户端程序员能够直接调用它了。
示例


public class applicatonframework{
public applicatonframework(){
templateMethod();
}


//模版方法
final void templateMethod(){

customize1();
customize2();
}

abstact void customize1();
abstact void customize2();
}


//实现它
class myapp extends applicationframework{

void customize1() {
System.out.print("Hello ");
}
void customize2() {
System.out.println("World!");
}
}


//测试
myapp a=new myapp();


这样就是一个基本的调用了模版方法,而我现在接触得最多的就是回调了接口的模版方法,当你重写这个模版方法的时候必须实现其接口,而且是final,这往往就是事件驱动了。我在想,框架应该也是这样实现的,只不过是复杂一点而已,无论是弄android还是j2ee还是其他,不要重复发明轮子这个思想还是挺奏效的,要展现你的编程才华,我觉得衡量的标准是这个系统的扩展性质量等,这个系统使用的人力物力是否是最低的。个人看法而已,还是那一句话,程序能够很好的反映出你对这个世界的理解...

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics