Java模版方法的另一种实现
面试荔枝FM杯具,遂死磕AQS途中发现一个有趣的模版用法,记下来。
模版方法是很重要的设计模式,在数据访问层、众多的插件接口都可见其影子,一般的实现都是在模版中定义抽象方法并使用其方法进行算法,让具体的模版定义定制的功能,类似:
public abstract class Template {
public abstract A productA();
private void strategy(){
//......
A a = productA();
//......
}
}
然而有时候你可能没办法让productA() 称为抽象方法,比喻你需要把该方法用在构造器模式中,也就是在静态内部类模式中时;
然而有时候你的模版可能有多个抽象方法,但不要求子类实现所有抽象方法,只需要实现个别就好了(参考AQS同步器的acquire()和acquireShare()就不需要全部实现)
这个时候也要实现模版方法怎么办呢?
下面介绍一种好方法,就是用异常,上代码
public class Template {
public A productA(){
throw new UnsupportedOperationException();
}
public B productB(){
throw new UnsupportedOperationException();
}
private void strategy(){
//......
A a = productA();
//......
}
}
这样子类如果调用相关方法就会抛出check异常了,如果一个子类的职责需要用到productA,那么编译器就会要求A生产方法必须要被重写或者处理异常。是不是非常完美?
Java模版方法的另一种实现的更多相关文章
- python设计模式之模版方法设计模式
我们在使用python的flask框架时,可能会经常用到生命周期函数如:before_request, before_first_request,或者信号等,刚开始学的时候就想只要写一个函数,然后加上 ...
- java分享第十六天( java读取properties文件的几种方法&java配置文件持久化:static块的作用)
java读取properties文件的几种方法一.项目中经常会需要读取配置文件(properties文件),因此读取方法总结如下: 1.通过java.util.Properties读取Propert ...
- 几种任务调度的 Java 实现方法与比较
综观目前的 Web 应用,多数应用都具备任务调度的功能.本文由浅入深介绍了几种任务调度的 Java 实现方法,包括 Timer,Scheduler, Quartz 以及 JCron Tab,并对其优缺 ...
- Java实现字符串反转的8种方法
/** * */ package com.wsheng.aggregator.algorithm.string; import java.util.Stack; /** * 8 种字符串反转的方法, ...
- Java读取Excel文件的几种方法
Java读取 Excel 文件的常用开源免费方法有以下几种: 1. JDBC-ODBC Excel Driver 2. jxl.jar 3. jcom.jar 4. poi.jar 简单介绍: 百度文 ...
- 24种设计模式--模版方法模式【Template Method Pattern】
周三,9:00,我刚刚坐到位置,打开电脑准备开始干活.“小三,小三,叫一下其它同事,到会议室,开会”老大跑过来吼,带着淫笑.还不等大家坐稳,老大就开讲了,“告诉大家一个好消息,昨天终于把牛叉模型公司的 ...
- 几种任务调度的 Java 实现方法与比较Timer,ScheduledExecutor,Quartz,JCronTab
几种任务调度的 Java 实现方法与比较 综观目前的 Web 应用,多数应用都具备任务调度的功能.本文由浅入深介绍了几种任务调度的 Java 实现方法,包括 Timer,Scheduler, Quar ...
- 几种任务调度的 Java 实现方法与比较--转载
前言 任务调度是指基于给定时间点,给定时间间隔或者给定执行次数自动执行任务.本文由浅入深介绍四种任务调度的 Java 实现: Timer ScheduledExecutor 开源工具包 Quartz ...
- Java获取ip地址的几种方法
以下内容介绍下java获取ip地址的几种思路. 1.直接利用java.net.InetAddress类获取,不过这种方法只在windows环境下有效,在linux环境下只能获取localhost地址( ...
随机推荐
- 13、spark-submit
- netty中的ChannelHandler和ChannelPipeline
netty中的ChannelHandler和ChannelPipeline ChannelHandler 家族 https://www.w3cschool.cn/essential_netty_in_ ...
- Docker构建YApi镜像, Docker安装YApi, Docker部署YApi
概述 YApi 是高效.易用.功能强大的 api 管理平台,旨在为开发.产品.测试人员提供更优雅的接口管理服务.可以帮助开发者轻松创建.发布.维护 API,YApi 还为用户提供了优秀的交互体验,开发 ...
- mysql导入自定义函数不成功的解决方法
进入mysql控制台:mysql -uroot -p set global log_bin_trust_function_creators=1;
- TensorFlow实战Google深度学习框架10-12章学习笔记
目录 第10章 TensorFlow高层封装 第11章 TensorBoard可视化 第12章 TensorFlow计算加速 第10章 TensorFlow高层封装 目前比较流行的TensorFlow ...
- jenkins获取git上的源码
jenkins获取git上的源码会遇到三种情况,我们在这里会分别介绍一下: 一.获取git上public(公有)的项目 只需配置仓库的URL即可 jenkins下使用git获取源码的配置方法 二.获取 ...
- 通过Comparable来实现对自身的比较
import org.apache.commons.lang.builder.CompareToBuilder; import org.apache.commons.lang.builder.Equa ...
- 【转】最近很火的 Safe Area 到底是什么
iOS 7 之后苹果给 UIViewController 引入了 topLayoutGuide 和 bottomLayoutGuide 两个属性来描述不希望被透明的状态栏或者导航栏遮挡的最高位置(st ...
- asp.net mvc 根据浏览器判断,如果是微信浏览器则进行网页授权,否则直接访问
遇到这个需求,想到的第一点就是,这个肯定是需要写在一个通用的地方.方便调用.一般可以定义个 父类控制器在OnActionExcuting方法执行前写逻辑,先上代码,一边写代码一边讲解: /// < ...
- Python3将ipa包中的文件按大小排序
[本文出自天外归云的博客园] 给你个ipa包,解压前输出包大小,解压后把里面的文件按大小排序.代码如下: import os import shutil import zipfile _ipa_zip ...