04、模板模式
模板模式(Template Method)
场景: 在设计一个系统时,知道了算法所需的步骤,而且确定了这些步骤的执行顺序,但是步骤的具体实现还未知,或者说步骤的实现与具体的环境相关。
模板方法模式定义: 定义一个操作的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变算法结构的情况下重定义该算法的某些特定步骤,它是一种类行为型模式。
优点如下:
1.封装了不变的部分,扩展可变的部分。把认为不变的部分封装到父类i中实现,而把可变的部分算法由子类实现。
2.它在父类中提取了公共部分的代码,便于代码复用
3.部分方法是由子类实现的,因此子类可以通过扩展方式增加相应的功能,符合开闭原则
缺点如下:
1.对每个不同的实现都需要定义一个子类,会导致类的数量增加,系统更加庞大,设计更加抽象
2.父类中的抽象方法由子类实现,子类执行的结构会影响到父类的结构,这导致一种反向的控制结构,提高代码阅读难度
设计模式结构:
1.抽象类:负责一个算法的轮廓与骨架,由一个模板方法和若干个基本方法
2.具体的子类:实现抽象类的抽象方法
例如:
起床:吃饭、喝水、工作
人与狗狗是不一样的,则实现如下:
代码实现:
public abstract class WakeUp { public abstract void eat(); public abstract void dreak(); public abstract void work(); public void doSomething(){ eat(); dreak(); work(); } }
public class PeopleWakeUp extends WakeUp { @Override public void eat() { System.out.println("人吃饭"); } @Override public void dreak() { System.out.println("人喝啤酒"); } @Override public void work() { System.out.println("人要上班去了"); } }
public class DogWakeUp extends WakeUp{ @Override public void eat() { System.out.println("狗狗吃狗粮"); } @Override public void dreak() { System.out.println("狗狗要喝水"); } @Override public void work() { System.out.println("狗狗负责看家"); } }
客户端:
public class Client { public static void main(String []args){ WakeUp people = new PeopleWakeUp(); people.doSomething(); WakeUp dog = new DogWakeUp(); dog.doSomething(); } }
测试结果: