模板模式(十三)

行为模式之-模板方法模式

16.1 豆浆制作问题

编写制作豆浆的程序,说明如下:

  1. 制作豆浆的流程 选材—>添加配料—>浸泡—>放到豆浆机打碎
  2. 通过添加不同的配料,可以制作出不同口味的豆浆
  3. 选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的
  4. 请使用模板方法模式完成 (说明:因为模板方法模式,比较简单,很容易就想到这个方案,因此就直接使用, 不再使用传统的方案来引出模板方法模式)

16.2 模板方法模式基本介绍

  1. 模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern), 在一个抽象类公开定义了执行它的方法的模板,它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。
  2. 简单说,模板方法模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤
  3. 这种类型的设计模式属于行为型模式

16.3 模板方法模式原理类图

16.3.1模板方法模式的原理类图

原理类图的说明-即(模板方法模式的角色及职责)

  1. AbstractClass 抽象类, 类中实现了模板方法(template),定义了算法的骨架,具体子类需要去实现其它的抽象方法 operation2,3,4
  2. ConcreteClass 实现抽象方法operation2,3,4, 以完成算法中特点子类的步骤

16.4 模板方法模式解决豆浆制作问题

  1. 应用实例要求
    编写制作豆浆的程序,说明如下:
    流程 选材—>添加配料—>浸泡—>放到豆浆机打碎通过添加不同的配料,可以制作出不同口味的豆浆
    选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的(红豆、花生豆浆…)

2.思路分析和图解(类图)

16.5 模板方法模式的钩子方法

  1. 在模板方法模式的父类中,我们可以定义一个方法,它默认不做任何事,子类可以视情况要不要覆盖它,该方法称为“钩子”。
  2. 还是用上面做豆浆的例子来讲解,比如,我们还希望制作纯豆浆,不添加任何的配料,请使用钩子方法对前面的模板方法进行改造
  3. 代买实现
// 1.抽象类
public abstract class SoyMilk {

    // 模版方法make 可以写成final,不让子类重写
    final void make() {
        select();
        if(customerWantCondiments()){
            addCondiment();
        }
        soak();
        beat();
        System.out.println("------------------------");
    }

    // 选材
    void select() {
        System.out.println(" 选择新鲜上好的黄豆 ");
    }

    // 2.加入配料
    abstract void addCondiment();

    // 3.浸泡
    void soak() {
        System.out.println(" 将黄豆和配料一起浸泡3小时 ");
    }

    // 4.打碎
    void beat() {
        System.out.println(" 将黄豆和配料打碎,制成豆浆,豆浆完成 ");
    }

    // 钩子方法,决定是否需要配料
    //钩子方法,决定是否需要添加配料
    boolean customerWantCondiments() {
        return true;
    }
}
// 2.制作花生豆浆
public class PeanutSoyMilk extends SoyMilk {
    @Override
    void addCondiment() {
        System.out.println(" 加入上好的花生 ");
    }
}


// 2.制作纯豆浆
public class PureSoyMilk extends SoyMilk{
    @Override
    void addCondiment() {

    }
    //钩子方法,决定是否需要添加配料
    boolean customerWantCondiments() {
        return false;
    }
}



// 2.制作红豆豆浆
public class RedBeanSoyMilk extends SoyMilk {
    @Override
    void addCondiment() {
        System.out.println(" 加入上好的红豆 ");
    }
}


// 3.客户端测试
public class Client {
    public static void main(String[] args) {
        SoyMilk soyMilk = new PeanutSoyMilk();
        soyMilk.make();

        soyMilk = new RedBeanSoyMilk();
        soyMilk.make();

        // 钩子方法使用
        soyMilk = new PureSoyMilk();
        soyMilk.make();
    }
}

16.6 模板方法模式在 Spring 框架应用的源码分析

  1. Spring IOC 容器初始化时运用到的模板方法模式
  2. 代码分析+角色分析+说明类图

  1. 针对源码的类图(说明层次关系)

16.7 模板方法模式的注意事项和细节

  1. 基本思想是:算法只存在于一个地方,也就是在父类中,容易修改。需要修改算法时,只要修改父类的模板方法或者已经实现的某些步骤,子类就会继承这些修改
  2. 实现了最大化代码复用。父类的模板方法和已实现的某些步骤会被子类继承而直接使用。
  3. 既统一了算法,也提供了很大的灵活性。父类的模板方法确保了算法的结构保持不变,同时由子类提供部分步骤的实现。
  4. 该模式的不足之处:每一个不同的实现都需要一个子类实现,导致类的个数增加,使得系统更加庞大
  5. 一般模板方法都加上 final 关键字, 防止子类重写模板方法.
  6. 模板方法模式使用场景:当要完成在某个过程,该过程要执行一系列步骤 ,这一系列的步骤基本相同,但其个别步骤在实现时 可能不同,通常考虑用模板方法模式来处理
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
设计模式是在软件设计过程中,对于常见问题的解决方案的总结和模板化的提炼。Java语言中广泛应用的设计模式有23种,分为三个大类:创建型模式、结构型模式和行为型模式。 首先是创建型模式,包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式。单例模式确保一个类只有一个实例化对象,简单工厂模式通过一个工厂类来创建对象,工厂方法模式通过使用工厂接口来创建对象,抽象工厂模式为一个产品族提供创建对象的接口,建造者模式逐步构建一个复杂对象,原型模式通过复制现有对象来创建新对象。 其次是结构型模式,包括适配器模式、桥接模式、装饰器模式、组合模式、外观模式、享元模式和代理模式。适配器模式用于将一个接口转换成客户端所期待的接口,桥接模式将抽象和实现解耦,装饰器模式动态地给对象添加额外职责,组合模式将对象组合成树形结构以表示“部分-整体”的层次结构,外观模式提供了一个简化客户端调用复杂子系统的接口,享元模式通过共享对象来有效地支持大量细粒度的对象,代理模式为其他对象提供一种代理以控制对这个对象的访问。 最后是行为型模式,包括模板方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式和访问者模式模板方法模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中实现,命令模式将请求封装成一个对象,以使不同的请求能够参数化客户端对象,迭代器模式提供一种访问容器对象中各个元素的方式,观察者模式定义了对象之间的一对多依赖,中介者模式用一个中介对象来封装一系列对象的交互,备忘录模式在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,解释器模式给定一个语言,定义它的文法的一种表示,并定义一个解释器,状态模式允许一个对象在其内部状态改变时改变它的行为,策略模式定义了算法家族,分别封装起来,让它们之间可以互相替换,以使得算法的变化不影响到使用算法的客户,访问者模式可以在不改变数据结构的前提下,定义作用于这个结构元素的新操作。通过使用这些设计模式,可以提高软件系统的可维护性、可扩展性和可重用性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值