系列文章目录
第六章 行为模式(上)
目录
系列文章目录
前言
一、模板方法模式是什么?
二、模板方法模式的优缺点
三、装饰(Decorator)模式的结构
四、实例演示
1.实例概述
2.代码演示
3.实验结果
总结
前言
设计模式,又称为软件设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。
学习设计模式可以提高程序员的思维能力、编程能力和设计能力,使程序设计更加标准化、代码编制更加工程化,使软件开发效率大大提高,从而缩短软件的开发周期。
一、模板方法模式是什么?
定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。它是一种类行为型模式。
二、模板方法模式的优缺点
优点:
1)它封装了不变部分,扩展可变部分。它把认为是不变部分的算法封装到父类中实现,而把可变部分算法由子类继承实现,便于子类继续扩展;
2)它在父类中提取了公共的部分代码,便于代码复用;
3)部分方法是由子类实现的,因此子类可以通过扩展方式增加相应的功能,符合开闭原则。
缺点:
1)对每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大,设计也更加抽象;
2)父类中的抽象方法由子类实现,子类执行的结果会影响父类的结果,这导致一种反向的控制结构,它提高了代码阅读的难度。
三、装饰(Decorator)模式的结构
模板方法模式包含以下主要角色:
1)抽象类(AbstractClass):负责给出一个算法的轮廓和骨架,包含以下方法:
① 模板方法:定义了算法的骨架,按某种顺序调用其包含的基本方法。
② 基本方法:是整个算法中的一个步骤,包含以下几种类型:
• 抽象方法:在抽象类中申明,由具体子类实现。
• 具体方法:在抽象类中已经实现,在具体子类中可以继承或重写它。
• 钩子方法:在抽象类中已经实现,包括用于判断的逻辑方法和需要子类重写的空方法2种。
2)具体子类(ConcreteClass):实现抽象类中所定义的抽象方法和钩子方法,它们是一个顶级逻辑的一个组成步骤。
四、实例演示
1.实例概述
抽象类:出国留学类
钩子方法:入学申请和索取学校资料
具体子类:PrincetonUniversity(普林斯顿大学),HarvardUniversity(哈弗大学),ColumbiaUniversity(哥伦比亚大学)等类,这里读者可以根据自己喜欢的大学去添加类
2.代码演示
package template;
public class template_demo {
public static void main(String[] args) {
StudyAbroad StudyPrinceton = new PrincetonUniversity();
StudyPrinceton.templateMethod();
StudyAbroad StudyColumbia = new ColumbiaUniversity();
StudyColumbia.templateMethod();
}
}
abstract class StudyAbroad
{
//模板方法
public void templateMethod()
{
LookingForSchool();//钩子方法
ApplyForEnroll(); // 钩子方法
ApplyForVisa();//具体方法
ReadyGoAbroad();//具体方法
System.out.println("出国留学申请已成功!");
}
// 入学申请
protected abstract void ApplyForEnroll();
// 索取学校资料
protected abstract void LookingForSchool();
//申请签证
public void ApplyForVisa()
{
System.out.println("申请签证");
}
// 体检,订机票
public void ReadyGoAbroad()
{
System.out.println("体检,订机票");
}
}
//普林斯顿大学
class PrincetonUniversity extends StudyAbroad
{
@Override
protected void ApplyForEnroll() {
// TODO Auto-generated method stub
System.out.println("Apply For Princeton University");
}
@Override
protected void LookingForSchool() {
// TODO Auto-generated method stub
System.out.println("Looking For Princeton University");
}
}
//哈弗大学
class HarvardUniversity extends StudyAbroad
{
@Override
protected void ApplyForEnroll() {
// TODO Auto-generated method stub
System.out.println("Apply For Harvard University");
}
@Override
protected void LookingForSchool() {
// TODO Auto-generated method stub
System.out.println("Looking For Harvard University");
}
}
//哥伦比亚大学
class ColumbiaUniversity extends StudyAbroad
{
@Override
protected void ApplyForEnroll() {
// TODO Auto-generated method stub
System.out.println("Apply For Columbia University");
}
@Override
protected void LookingForSchool() {
// TODO Auto-generated method stub
System.out.println("Looking For Columbia University");
}
}
3.实验结果
Looking For Princeton University
Apply For Princeton University
申请签证
体检,订机票
出国留学申请已成功!
Looking For Columbia University
Apply For Columbia University
申请签证
体检,订机票
出国留学申请已成功!
总结
设计模式,又称为软件设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。
学习设计模式可以提高程序员的思维能力、编程能力和设计能力,使程序设计更加标准化、代码编制更加工程化,使软件开发效率大大提高,从而缩短软件的开发周期。
定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。它是一种类行为型模式。
二、模板方法模式的优缺点
优点:
1)它封装了不变部分,扩展可变部分。它把认为是不变部分的算法封装到父类中实现,而把可变部分算法由子类继承实现,便于子类继续扩展;
2)它在父类中提取了公共的部分代码,便于代码复用;
3)部分方法是由子类实现的,因此子类可以通过扩展方式增加相应的功能,符合开闭原则。
缺点:
1)对每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大,设计也更加抽象;
2)父类中的抽象方法由子类实现,子类执行的结果会影响父类的结果,这导致一种反向的控制结构,它提高了代码阅读的难度。
三、装饰(Decorator)模式的结构
模板方法模式包含以下主要角色:
1)抽象类(AbstractClass):负责给出一个算法的轮廓和骨架,包含以下方法:
① 模板方法:定义了算法的骨架,按某种顺序调用其包含的基本方法。
② 基本方法:是整个算法中的一个步骤,包含以下几种类型:
• 抽象方法:在抽象类中申明,由具体子类实现。
• 具体方法:在抽象类中已经实现,在具体子类中可以继承或重写它。
• 钩子方法:在抽象类中已经实现,包括用于判断的逻辑方法和需要子类重写的空方法2种。
2)具体子类(ConcreteClass):实现抽象类中所定义的抽象方法和钩子方法,它们是一个顶级逻辑的一个组成步骤。
四、实例演示
1.实例概述
抽象类:出国留学类
钩子方法:入学申请和索取学校资料
具体子类:PrincetonUniversity(普林斯顿大学),HarvardUniversity(哈弗大学),ColumbiaUniversity(哥伦比亚大学)等类,这里读者可以根据自己喜欢的大学去添加类
2.代码演示
package template;
public class template_demo {
public static void main(String[] args) {
StudyAbroad StudyPrinceton = new PrincetonUniversity();
StudyPrinceton.templateMethod();
StudyAbroad StudyColumbia = new ColumbiaUniversity();
StudyColumbia.templateMethod();
}
}
abstract class StudyAbroad
{
//模板方法
public void templateMethod()
{
LookingForSchool();//钩子方法
ApplyForEnroll(); // 钩子方法
ApplyForVisa();//具体方法
ReadyGoAbroad();//具体方法
System.out.println("出国留学申请已成功!");
}
// 入学申请
protected abstract void ApplyForEnroll();
// 索取学校资料
protected abstract void LookingForSchool();
//申请签证
public void ApplyForVisa()
{
System.out.println("申请签证");
}
// 体检,订机票
public void ReadyGoAbroad()
{
System.out.println("体检,订机票");
}
}
//普林斯顿大学
class PrincetonUniversity extends StudyAbroad
{
@Override
protected void ApplyForEnroll() {
// TODO Auto-generated method stub
System.out.println("Apply For Princeton University");
}
@Override
protected void LookingForSchool() {
// TODO Auto-generated method stub
System.out.println("Looking For Princeton University");
}
}
//哈弗大学
class HarvardUniversity extends StudyAbroad
{
@Override
protected void ApplyForEnroll() {
// TODO Auto-generated method stub
System.out.println("Apply For Harvard University");
}
@Override
protected void LookingForSchool() {
// TODO Auto-generated method stub
System.out.println("Looking For Harvard University");
}
}
//哥伦比亚大学
class ColumbiaUniversity extends StudyAbroad
{
@Override
protected void ApplyForEnroll() {
// TODO Auto-generated method stub
System.out.println("Apply For Columbia University");
}
@Override
protected void LookingForSchool() {
// TODO Auto-generated method stub
System.out.println("Looking For Columbia University");
}
}
3.实验结果
Looking For Princeton University
Apply For Princeton University
申请签证
体检,订机票
出国留学申请已成功!
Looking For Columbia University
Apply For Columbia University
申请签证
体检,订机票
出国留学申请已成功!
总结
优点:
1)它封装了不变部分,扩展可变部分。它把认为是不变部分的算法封装到父类中实现,而把可变部分算法由子类继承实现,便于子类继续扩展;
2)它在父类中提取了公共的部分代码,便于代码复用;
3)部分方法是由子类实现的,因此子类可以通过扩展方式增加相应的功能,符合开闭原则。
缺点:
1)对每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大,设计也更加抽象;
2)父类中的抽象方法由子类实现,子类执行的结果会影响父类的结果,这导致一种反向的控制结构,它提高了代码阅读的难度。
模板方法模式包含以下主要角色:
1)抽象类(AbstractClass):负责给出一个算法的轮廓和骨架,包含以下方法:
① 模板方法:定义了算法的骨架,按某种顺序调用其包含的基本方法。
② 基本方法:是整个算法中的一个步骤,包含以下几种类型:
• 抽象方法:在抽象类中申明,由具体子类实现。
• 具体方法:在抽象类中已经实现,在具体子类中可以继承或重写它。
• 钩子方法:在抽象类中已经实现,包括用于判断的逻辑方法和需要子类重写的空方法2种。
2)具体子类(ConcreteClass):实现抽象类中所定义的抽象方法和钩子方法,它们是一个顶级逻辑的一个组成步骤。
四、实例演示
1.实例概述
抽象类:出国留学类
钩子方法:入学申请和索取学校资料
具体子类:PrincetonUniversity(普林斯顿大学),HarvardUniversity(哈弗大学),ColumbiaUniversity(哥伦比亚大学)等类,这里读者可以根据自己喜欢的大学去添加类
2.代码演示
package template;
public class template_demo {
public static void main(String[] args) {
StudyAbroad StudyPrinceton = new PrincetonUniversity();
StudyPrinceton.templateMethod();
StudyAbroad StudyColumbia = new ColumbiaUniversity();
StudyColumbia.templateMethod();
}
}
abstract class StudyAbroad
{
//模板方法
public void templateMethod()
{
LookingForSchool();//钩子方法
ApplyForEnroll(); // 钩子方法
ApplyForVisa();//具体方法
ReadyGoAbroad();//具体方法
System.out.println("出国留学申请已成功!");
}
// 入学申请
protected abstract void ApplyForEnroll();
// 索取学校资料
protected abstract void LookingForSchool();
//申请签证
public void ApplyForVisa()
{
System.out.println("申请签证");
}
// 体检,订机票
public void ReadyGoAbroad()
{
System.out.println("体检,订机票");
}
}
//普林斯顿大学
class PrincetonUniversity extends StudyAbroad
{
@Override
protected void ApplyForEnroll() {
// TODO Auto-generated method stub
System.out.println("Apply For Princeton University");
}
@Override
protected void LookingForSchool() {
// TODO Auto-generated method stub
System.out.println("Looking For Princeton University");
}
}
//哈弗大学
class HarvardUniversity extends StudyAbroad
{
@Override
protected void ApplyForEnroll() {
// TODO Auto-generated method stub
System.out.println("Apply For Harvard University");
}
@Override
protected void LookingForSchool() {
// TODO Auto-generated method stub
System.out.println("Looking For Harvard University");
}
}
//哥伦比亚大学
class ColumbiaUniversity extends StudyAbroad
{
@Override
protected void ApplyForEnroll() {
// TODO Auto-generated method stub
System.out.println("Apply For Columbia University");
}
@Override
protected void LookingForSchool() {
// TODO Auto-generated method stub
System.out.println("Looking For Columbia University");
}
}
3.实验结果
Looking For Princeton University
Apply For Princeton University
申请签证
体检,订机票
出国留学申请已成功!
Looking For Columbia University
Apply For Columbia University
申请签证
体检,订机票
出国留学申请已成功!
总结
抽象类:出国留学类
钩子方法:入学申请和索取学校资料
具体子类:PrincetonUniversity(普林斯顿大学),HarvardUniversity(哈弗大学),ColumbiaUniversity(哥伦比亚大学)等类,这里读者可以根据自己喜欢的大学去添加类
2.代码演示
package template;
public class template_demo {
public static void main(String[] args) {
StudyAbroad StudyPrinceton = new PrincetonUniversity();
StudyPrinceton.templateMethod();
StudyAbroad StudyColumbia = new ColumbiaUniversity();
StudyColumbia.templateMethod();
}
}
abstract class StudyAbroad
{
//模板方法
public void templateMethod()
{
LookingForSchool();//钩子方法
ApplyForEnroll(); // 钩子方法
ApplyForVisa();//具体方法
ReadyGoAbroad();//具体方法
System.out.println("出国留学申请已成功!");
}
// 入学申请
protected abstract void ApplyForEnroll();
// 索取学校资料
protected abstract void LookingForSchool();
//申请签证
public void ApplyForVisa()
{
System.out.println("申请签证");
}
// 体检,订机票
public void ReadyGoAbroad()
{
System.out.println("体检,订机票");
}
}
//普林斯顿大学
class PrincetonUniversity extends StudyAbroad
{
@Override
protected void ApplyForEnroll() {
// TODO Auto-generated method stub
System.out.println("Apply For Princeton University");
}
@Override
protected void LookingForSchool() {
// TODO Auto-generated method stub
System.out.println("Looking For Princeton University");
}
}
//哈弗大学
class HarvardUniversity extends StudyAbroad
{
@Override
protected void ApplyForEnroll() {
// TODO Auto-generated method stub
System.out.println("Apply For Harvard University");
}
@Override
protected void LookingForSchool() {
// TODO Auto-generated method stub
System.out.println("Looking For Harvard University");
}
}
//哥伦比亚大学
class ColumbiaUniversity extends StudyAbroad
{
@Override
protected void ApplyForEnroll() {
// TODO Auto-generated method stub
System.out.println("Apply For Columbia University");
}
@Override
protected void LookingForSchool() {
// TODO Auto-generated method stub
System.out.println("Looking For Columbia University");
}
}
3.实验结果
Looking For Princeton University
Apply For Princeton University
申请签证
体检,订机票
出国留学申请已成功!
Looking For Columbia University
Apply For Columbia University
申请签证
体检,订机票
出国留学申请已成功!
总结
Looking For Princeton University
Apply For Princeton University
申请签证
体检,订机票
出国留学申请已成功!
Looking For Columbia University
Apply For Columbia University
申请签证
体检,订机票
出国留学申请已成功!
总结
以上就是今天要讲的内容,本文仅仅简单介绍了行为模式下模板方法模式的定义,优缺点以及其的模式结构,并通过实例演示,进一步反应了在一定需求条件下,模板方法模式的优点。



