在讲设计模式之前,先放一张大合照!一家人最紧要整整齐齐:)
图片来源于百度
模板方法
从全家福来看,模板方法属于类模式,和行为模式。这就意味着,它是可以改变类的行为的一种设计模式(个人理解哈哈)。使用模板方法的好处在于,我们可以写一个抽象类,将公共行为给抽取出来,核心的操作留给其子类根据需求逻辑来完成。也就是说,抽象类兼父类定义了一个公共骨架,而一些步骤将延迟到子类,从而改变了其业务逻辑的结构和行为。
模板方法的优点在于封装不变,扩展可变;提取了公共代码,便于维护;行为由父类控制,子类来实现。
而缺点是每个不同的实现都需要一个子类,导致类增加,系统变得更加庞大。
那么好,概念说完了,我们上代码去体会!
实现代码 1
OperateSystem.java
public abstract class OperateSystem {
abstract void init() ;
abstract void run();
abstract void destroy();
//模板方法
public void go() {
/* 我们可以看到,父类定义了执行顺序,也就是算法(业务逻辑)的约束,然后交给子类去实现 */
init();
run();
destroy();
}
}
MacSystem.java
public class MacSystem extends OperateSystem {
@Override
void init() {
// TODO Auto-generated method stub
System.out.println("mac init");
}
@Override
void run() {
// TODO Auto-generated method stub
System.out.println("mac run");
}
@Override
void destroy() {
// TODO Auto-generated method stub
System.out.println("mac destroy");
}
}
LinuxSystem.java
public class LinuxSystem extends OperateSystem {
@Override
void init() {
// TODO Auto-generated method stub
System.out.println("Linux init");
}
@Override
void run() {
// TODO Auto-generated method stub
System.out.println("Linux run");
}
@Override
void destroy() {
// TODO Auto-generated method stub
System.out.println("Linux destroy");
}
}
运行结果为:
mac init
mac run
mac destroy
Linux init
Linux run
Linux destroy
从上面可以看到,主要父类在定义好 init,run,destroy 方法。然后将这三种方法的执行顺序固定好,这样子类只能去实现相关的逻辑,而不能改变执行的顺序!而且通过子类不同的逻辑,我们就可以写不同的代码,这样就能实现多样化。
实现代码 2
依旧使用操作系统为例子! 因为 Linux 和 Mac 都是通过一个开机键和一个关机键来进行开关机的,所以我们简化一些上面的代码。
OperateSystem.java
public abstract class OperateSystem {
abstract void run();
//模板方法
public void go() {
/* 我们可以看到,父类定义了执行顺序,也就是算法(业务逻辑)的约束,然后交给子类去实现 */
System.out.println("按开机键开机");
run();
System.out.println("按关机键关机");
}
}
MacSystem.java
public class MacSystem extends OperateSystem {
@Override
void run() {
// TODO Auto-generated method stub
System.out.println("mac run");
}
}
LinuxSystem.java
public class LinuxSystem extends OperateSystem {
@Override
void run() {
// TODO Auto-generated method stub
System.out.println("Linux run");
}
}
运行结果:
按开机键开机
mac run
按关机键关机
按开机键开机
Linux run
按关机键关机