说明:本文是《大话设计模式》的学习记录及结合网上相关信息编写,原书代码例子采用C#编写,本文采用Java稍加改写。如有不当,欢迎指正,共同进步。
1.模板方法模式概述:
模板方法模式(Pattern:Template Method)属于行为型模式。其意义是定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 。
2.模板方法模式的角色及其职责:
(1)抽象模板角色[Abstract Template]:抽象模板类,用来定义算法的基本骨架,同时定义一个或多个抽象操作,这些操作由子类进行实现。
(1)抽象模板角色:
①模板方法模式通过把不变的行为搬移到超类,去除了子类中的重复代码。
②子类实现算法的某些细节,有助于算法的扩展。
①在某些类的算法中,用了相同的方法,造成代码的重复。
②控制子类扩展,子类必须遵守算法规则。
1.模板方法模式概述:
模板方法模式(Pattern:Template Method)属于行为型模式。其意义是定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 。
2.模板方法模式的角色及其职责:
(1)抽象模板角色[Abstract Template]:抽象模板类,用来定义算法的基本骨架,同时定义一个或多个抽象操作,这些操作由子类进行实现。
(2)具体模板角色[Concrete Template]:具体模板角色,用来实现算法骨架中的某些步骤,完成于特定子类相关的功能。
3.模板方法模式的设计原则及UML类图:
(1)设计原则:①基于继承,提高代码复用性,实现了反向控制,符合开闭原则。
(2)UML
(1)抽象模板角色:
package Pattern_Template_Method;
/**
* 抽象模板类
*/
public abstract class abstractClass {
public abstract void primitiveOperation1();
public abstract void primitiveOperation2();
public void tempLate() {
primitiveOperation1();
primitiveOperation2();
}
}
(2)具体模板角色:
package Pattern_Template_Method;
/**
* 具体模板角色A
*/
public class ConcreteClassA extends abstractClass {
@Override
public void primitiveOperation1() {
System.out.println("具体类A方法1实现");
}
@Override
public void primitiveOperation2() {
System.out.println("具体类A方法2实现");
}
}
package Pattern_Template_Method;
/**
* 具体模板角色A
*/
public class ConcreteClassB extends abstractClass {
@Override
public void primitiveOperation1() {
System.out.println("具体类B方法1实现");
}
@Override
public void primitiveOperation2() {
System.out.println("具体类B方法2实现");
}
}
(3)客户端测试代码:
package Pattern_Template_Method;
public class test {
public static void main(String[] args) {
abstractClass c;
c=new ConcreteClassA();
c.tempLate();
c=new ConcreteClassB();
c.tempLate();
}
}
(4)客户端测试代码结果:
5.策略模式的优缺点及使用场景:
(1)优点:①模板方法模式通过把不变的行为搬移到超类,去除了子类中的重复代码。
②子类实现算法的某些细节,有助于算法的扩展。
③通过一个父类调用子类实现的操作,通过子类扩展增加新的行为,符合“开放-封闭原则”。
(2)缺点:①每个不同的实现都需要定义一个子类,这会导致类的个数的增加,设计更加抽象。
(3)应用场景:①在某些类的算法中,用了相同的方法,造成代码的重复。
②控制子类扩展,子类必须遵守算法规则。