模板方法模式(解决一类问题完整逻辑)
看到模板,可能会想到解决问题的一套模板,一个套路,通用的手法,具体的场景里面某个细节点不一样。把很多的方法有逻辑性(有先后顺序)的组织在一起就称之为模板方法模式,里面的抽象方法,必须依靠具体的场景(子类)实现。
在生活中,比如有的男生做饭,有的女生做饭,做饭是有一个套路,先买菜,切菜,再煮饭,然后再吃饭。但是有一个地方不一样,某某喜欢吃辣的,就多放些辣椒,某某喜欢吃咸的,就多放点咸盐。区别就是某个细节点不一样。所以放调料的时候是抽象方法。
在spring中 AbstractFactoryBean 抽象factoryBean对象创建,部分功能留给子类去实现。
遵循了设计模式6大原则中的里氏替换原则,父类出现的地方,子类一定可以出现。
1、首先玩游戏的套路都一样:所以抽象出类
package com.weizhaoyang.template;/*** 游戏模板*/public abstract classGame{abstract void intialize();abstract void startPlay();abstract void endPlay();//玩游戏方法public final void play(){//初始化游戏intialize();//开始游戏startPlay();//结束游戏endPlay();}}
2、提供一个足球的游戏
package com.weizhaoyang.template;publicclassFootballGame extends Game{@Overridevoid intialize() {System.out.println("游戏初始化");}@Overridevoid startPlay() {System.out.println("游戏开始,用脚踢球");}@Overridevoid endPlay() {System.out.println("游戏结束");}}
3、提供 一个篮球的游戏
package com.weizhaoyang.template;publicclassBasketBallGame extends Game{@Overridevoid intialize() {System.out.println("游戏初始化");}@Overridevoid startPlay() {System.out.println("游戏开始,用手拍球");}@Overridevoid endPlay() {System.out.println("游戏结束");}}
4、提供一个测试类:
package com.weizhaoyang.template;/*** 测试类*/publicclassGameTest{publicstaticvoid main(String[] args) {//进行测试Game game=newFootballGame();game.play();}}
运行的结果如下:
在上面的FootBallGame或者BasketBallGame这两个类也可以在做一个抽象类,把startPlay方法做为抽象方法,因为可以用力,或者轻力去操作球,所以在框架中有很多抽象类继承抽象类,它就是这种思想,抽象是无场景化的。在上面的例子中,抽象类中有一套的逻辑,而接口是没有的,必须保证所有方法实现。上面的例子football和basketBall还没有具体到某个人。
在框架中用的最多的就是模板方法模式。