设计模式之模板方法模式 (九)

  • Post author:
  • Post category:其他


说到了模板方法模式,顺便提一下,这个模式让我更深入理解抽象类的使用。在我初学JAVA的时候,很不理解为什么会有抽象类的存在,接口不就能代替实现和抽象类一样的功能吗,也同样不是很能理解一个接口的作用,当我学习了设计模式,更深入理解了面向抽象编程,才知道原来接口是这么强大的东西,同时在学习了模板方法模式之后,我就了解到了抽象类与接口的不同之处,原来抽象类是这么用的,瞬间体会到了抽象类的强大。


定义:模板方法模式一般是为了统一一些方法的实现步骤,在抽象类中定好了方法实现的步骤,但具体的一些方法推迟到子类上去完成。

下面举个例子。一般正常人一天的作息是早上起床洗漱,然后去上班,然后午休,然后下班,然后就是下班后的空闲时间了,这是正常人的作息顺序。在抽象类中写好作息的顺序,每个人起床吃饭下班都是一样的,但是怎么工作,空闲时间怎么安排是根据不同人而不同的,具体的实现是推迟到子类去实现的。

package test;

//人一天的作息安排
public abstract class AbstractSchedule {

	public void schedule() {
		System.out.println("起床--洗漱--准备去上班");
		// 工作
		work();
		System.out.println("吃午饭");
		// 午休时间,自由安排
		RestTime();
		System.out.println("下班了");
		// 下班时间,自由安排
		FreeTime();
	}

	abstract void work();

	abstract void RestTime();

	abstract void FreeTime();

}

两个子类,一个是上进的人,一个是懒惰的人。

package test;


//具体勤奋的人的作息
public class HardWorkPerson extends AbstractSchedule {

	@Override
	void work() {
		System.out.println("勤奋工作,不敢懈怠");
	}

	@Override
	void RestTime() {
		System.out.println("好好午休,养好精神开始下午的工作");
	}

	@Override
	void FreeTime() {
		System.out.println("看书,提升自我");
	}

}
package test;

//具体懒惰的人的作息
public class LazyPerson extends AbstractSchedule {

	@Override
	void work() {
		System.out.println("浑浑噩噩,潦草做事");
	}

	@Override
	void RestTime() {
		System.out.println("先玩一会");
	}

	@Override
	void FreeTime() {
		System.out.println("光速回家,进行各种娱乐");
	}

}

接下来看实现吧。

package test;

public class testA {

	public static void main(String[] args) {
		HardWorkPerson hardWorkPerson = new HardWorkPerson();
		LazyPerson lazyPerson = new LazyPerson();

		hardWorkPerson.schedule();
		System.out.println("--------------------");
		lazyPerson.schedule();
	}
}

控制台打印

我们发现,根据父类的模板,我们实现了不同的人的不同的作息方式,而有一些固定的比如起床吃饭在父类已经写好,并且作息的顺序父类也已经定好,具体不同的空闲安排才让子类来决定,这样就能得到一个上进的人和懒惰的人的作息安排啦。模板方法模式大致就是写好一个方法(算法)的骨架,它还有一种使用方式,为了不强制子类实现不必要的方法,可以提供一些方法给子类选择性覆盖,自由度很高。下面修改一下骨架(抽象类)。

package test;

//人一天的作息安排
public abstract class AbstractSchedule {

	public void schedule() {
		System.out.println("起床--洗漱--准备去上班");
		// 工作
		work();
		System.out.println("吃午饭");
		// 午休时间,自由安排
		RestTime();
		System.out.println("下班了");
		// 下班时间,自由安排
		FreeTime();
		FreeTime2();
	}

	public void FreeTime2() {};

	abstract void work();

	abstract void RestTime();

	abstract void FreeTime();

}

我们在勤奋的人的作息里覆盖空闲时间2方法,但在懒惰的人里不实现它

package test;

//具体勤奋的人的作息
public class HardWorkPerson extends AbstractSchedule {

	@Override
	void work() {
		System.out.println("勤奋工作,不敢懈怠");
	}

	@Override
	void RestTime() {
		System.out.println("好好午休,养好精神开始下午的工作");
	}

	@Override
	void FreeTime() {
		System.out.println("看书,提升自我");
	}

	@Override
	public void FreeTime2() {
		System.out.println("研究一会设计模式");
	}
}

然后客户端代码不变,看控制台打印

可以看到,父类骨架不强制你FreeTime2要做什么,勤奋的人在第二个空闲时间选择去研究一会设计模式,懒惰的人在第二个空闲时间可以选择不实现(不做任何事情),让子类自由选择是否实现这个方法,大概,这就是成功的人与一般人的区别吧,总是能挤出点时间强化自我,坚持做那些懒得做但正确的事情,就能得到一般人想得到却得不到的东西。

看到这里,你是否也学到了抽象类的强大之处?

注:由于我的水平有限,有些地方说的可能有问题?欢迎大家指出,互相讨论互相学习进步!



版权声明:本文为qq_41737716原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。