-
2022-03-26 10:38:47
代码:
/* 抽象类应用--模板设计模式 */ /* 定义一个抽象行为类 */ abstract class Action{ //分别定义吃、睡、工作的命令 public static final int EAT=1111 ; public static final int SLEEP=2222 ; public static final int WORK=3333 ; //行为命令判断 public void command(int flag){ switch (flag){ case EAT: this.eat(); break; case SLEEP: this.sleep(); break; case WORK: this.work(); break; } } //定义子类的标准操作 public abstract void eat(); public abstract void sleep(); public abstract void work(); } /* 定义机器人的行为 */ class Robot extends Action { @Override public void eat() { System.out.println("机器人正在补充能量了..."); } @Override public void sleep() { //空操作 } @Override public void work() { System.out.println("机器人正在努力工作..."); } } /* 定义人的行为 */ class Person extends Action { @Override public void eat() { System.out.println("人正在吃饭..."); } @Override public void sleep() { System.out.println("人正在睡觉..."); } @Override public void work() { System.out.println("人正在为梦想努力工作..."); } } /* 定义猪的行为 */ class Pig extends Action { @Override public void eat() { System.out.println("猪正在吃食..."); } @Override public void sleep() { System.out.println("猪正在睡觉..."); } @Override public void work() { //空操作 } } /* 测试类 */ public class ModelDemo { public static void main(String[] args) { fun(new Robot());//传递机器人行为子类 fun(new Person());//传递人行为子类 fun(new Pig());//传递猪行为子类 } public static void fun(Action action){ //调用各种操作 action.command(Action.EAT); action.command(Action.SLEEP); action.command(Action.WORK); } } 运行结果: 机器人正在补充能量了... 机器人正在努力工作... 人正在吃饭... 人正在睡觉... 人正在为梦想努力工作... 猪正在吃食... 猪正在睡觉...
更多相关内容 -
模板设计模式
2021-08-26 16:04:17简单来说:模板设计就是提前搭建好了一些框架,但是更细节的东西需要实现类再去实现概念:
固定的流程已经写好了,变化的流程定义成了抽象方法,被子类重写。
模板设计就是一种编码风格,把抽象类看作是一个模板,模板中不能决定的东西定义成抽象方法,让使用模板的去重写抽象方法实现需求
简单来说:模板设计就是提前搭建好了一些框架,但是更细节的东西需要实现类再去实现设计模式:
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。
使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。模板设计模式:
把抽象类整体就可以看做成一个模板,模板中不能决定的东西定义成抽象方法,让使用模板的类(继承抽象类的类)去重写抽象方法实现需求,模板已经定义了通用结构,使用者只需要关心自己需要实现的功能即可
模板设计模式的优势:
1.只需要关注不同的流程,相同交给父类(模板类)去做。
2.解耦:各司其职,一个类只关注自己的事情- 模块化:是解耦这种思维的实现方法方式。
- getter/setter就是模块化
演示:
作文模板类
public abstract class CompositionTemplate { public final void write(){ System.out.println("<<我的爸爸>>"); body(); System.out.println("啊~ 这就是我的爸爸"); } public abstract void body(); }
实现类A
public class Tom extends CompositionTemplate { @Override public void body() { System.out.println("那是一个秋天, 风儿那么缠绵,记忆中, " + "那天爸爸骑车接我放学回家,我的脚卡在了自行车链当中, 爸爸蹬不动,他就站起来蹬..."); } }
实现类B
public class Tony extends CompositionTemplate { @Override public void body() { } /*public void write(){ }*/ }
测试类
public class Test { public static void main(String[] args) { Tom t = new Tom(); t.write(); } }
-
Java模板设计模式
2014-08-13 21:47:30java抽象类的程序案例,可以准备参加华为2014年校园招聘机试题 做准备 -
设计模式 – 模板设计模式
2020-10-22 23:36:00模板设计模式 模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern),在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。 该...模板设计模式
模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern),在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。
该模式的主要优点如下。
1) 它封装了不变部分,扩展可变部分。它把认为是不变部分的算法封装到父类中实现,而把可变部分算法由子类继承实现,便于子类继续扩展。
2) 它在父类中提取了公共的部分代码,便于代码复用。
3) 部分方法是由子类实现的,因此子类可以通过扩展方式增加相应的功能,符合开闭原则。案例
JdbcTemplate uml 图:
1 pom
<dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.16</version> </dependency> </dependencies>
2 JdbcFactory
import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSource; import java.util.HashMap; import java.util.Map; public class JdbcFactory { /** * ###########################DB配置######################## */ private static final String URL = "jdbc:mysql://localhost:3306/test?charset=utf8mb4&serverTimezone=UTC&useUnicode=true&useSSL=false"; private static final String USERNAME = "root"; private static final String PASSWORD = "123456"; private static final String DRIVER = "com.mysql.jdbc.Driver"; private static DataSource db; static { Map<String, String> map = new HashMap<>(); map.put(DruidDataSourceFactory.PROP_DRIVERCLASSNAME, DRIVER); map.put(DruidDataSourceFactory.PROP_URL, URL); map.put(DruidDataSourceFactory.PROP_USERNAME, USERNAME); map.put(DruidDataSourceFactory.PROP_PASSWORD, PASSWORD); try { db = DruidDataSourceFactory.createDataSource(map); } catch (Exception e) { db = null; e.printStackTrace(); } } private JdbcFactory() { } public static DataSource getInstance() { return db; } }
3 RowMapper
/** * ORM 定制化接口 */ public interface RowMapper<T> { T mapRow(ResultSet rs, int rowNum) throws SQLException; }
4 JdbcTemplate
import javax.sql.DataSource; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; public abstract class JdbcTemplate { private DataSource dataSource; public JdbcTemplate(DataSource dateSource) { this.dataSource = dateSource; } public <T> List<T> executeQuery(String sql, RowMapper<T> rowMapper, Object[] values) { try { //1 获取连接 Connection connection = this.getConnection(); //2 创建语句集 PreparedStatement pstm = this.createPrepareStatement(connection, sql); //3 执行语句集 ResultSet rs = execute(pstm, values); //4 处理结果集 List<T> list = paresResultSet(rs, rowMapper); //5 关闭结果集 this.closeResultSet(rs); //6 关闭语句集 this.closeStatement(pstm); //7 关闭连接 this.closeConnection(connection); //8 返回 return list; } catch (Exception e) { e.printStackTrace(); } return new ArrayList<>(); } protected void closeConnection(Connection connection) throws SQLException { if (connection != null) { connection.close(); } } protected void closeStatement(PreparedStatement pstm) throws SQLException { pstm.close(); } protected void closeResultSet(ResultSet rs) throws SQLException { rs.close(); } protected <T> List<T> paresResultSet(ResultSet rs, RowMapper<T> rowMapper) throws SQLException { List<T> result = new ArrayList<>(); int rowNum = 1; while (rs.next()) { result.add(rowMapper.mapRow(rs, rowNum++)); } return result; } private ResultSet execute(PreparedStatement pstm, Object[] values) throws SQLException { if (values != null) { for (int i = 0; i < values.length; i++) { pstm.setObject(i, values[i]); } } return pstm.executeQuery(); } protected PreparedStatement createPrepareStatement(Connection connection, String sql) throws SQLException { return connection.prepareStatement(sql); } private Connection getConnection() throws SQLException { return this.dataSource.getConnection(); } }
5 业务类
@Data @AllArgsConstructor @NoArgsConstructor @ToString public class Student { private Integer id; private String name; private Integer age; } public class StudentDao extends JdbcTemplate { public StudentDao(DataSource dateSource) { super(dateSource); } public List<Student> selectAll() { String sql = "select * from t_student"; return super.executeQuery(sql, (rs, rowNum) -> { Student student = new Student(); student.setId(rs.getInt("id")); student.setAge(rs.getInt("age")); student.setName(rs.getString("name")); return student; }, null); } }
6 测试
public class JdbcTest { public static void main(String[] args) throws Exception { DataSource instance = JdbcFactory.getInstance(); StudentDao studentDao=new StudentDao(instance); List<Student> students = studentDao.selectAll(); System.out.println(students.toString()); } }
-
java设计模式之策略模式与模板模式
2019-08-04 01:25:44NULL 博文链接:https://lfl2011.iteye.com/blog/1693685 -
设计模式总结-模板设计模式,单例模式(singleTon)
2017-05-08 11:35:21设计模式总结-模板设计模式,单例模式(singleTon) -
Java设计模式之模板模式
2021-11-06 18:01:13Java设计模式之模板模式1. 模板模式概述2. 模板模式实现 1. 模板模式概述 1.模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern), 在一个抽象类公开定义了执行它的方法的模板。它的子类...Java设计模式之模板模式
1. 模板模式概述
1.1 模板模式介绍
1.模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern), 在一个抽象类公开定义了执行它的方法的模板。它的子类可以更需要重写方法实现,但可以成为典型类中定义的方式进行。
2.简单说,模板方法模式定义了一个操作中的算法的核心定义,而将一些步骤迟缓到子类中,模仿子类可以不改变一一个算法的结构,就可以重新定义该算法的部分特定步骤。
3.这些类型的设计模式属于行为型模式。模板模式适用于通用步骤的操作,比如做菜,不管你是西红柿炒鸡蛋,还是土豆炖牛肉实现步骤都是一样的,备料,做菜,上菜。
再比如投放系统,不管你是投放巨量引擎,广点通还是百度,前期工作实现步骤也都是一样的,配置物料信息,构建投放对象,投放广告。1.2 模板模式类图
对原理类图的说明-即(模板方法模式的角色及职责)
1.AbstractClass 抽象类, 类中实现了模板方法(template),定义了算法的骨架,具体子类需要去实现 其它的抽象方法。
2.ConcreteClass 实现抽象方法, 以完成算法中特点子类的步骤。1.3 模板方法模式的注意事项和细节
- 基本思想是:算法只存在于一个地方,也就是在父类中,容易修改.需要修改算法时,只要修改父类的模板方 法或者已经实现的某些步骤,子类就会继承这些修改
- 实现了最大化代码复用.父类的模板方法和已实现的某些步骤会被子类继承而直接使用.
- 既统一了算法,也提供了很大的灵活性.父类的模板方法确保了算法的结构保持不变,同时由子类提供部分步 骤的实现.
- 该模式的不足之处:每个不同的实现都需要一个子类实现,导致类的个数增加,使得系统更加庞大
- 一般模板方法都加上 final 关键字, 防止子类重写模板方法.
- 模板方法模式使用场景:当要完成在某个过程,该过程要执行一系列步骤 ,这一系列的步骤基本相同,但其 个别步骤在实现时 可能不同,通常考虑用模板方法模式来处理
2. 模板模式实现
模板模式实现案例采用三种方式:
第一案例是做菜,无论做什么菜都是这三个步骤,备料,做菜,上菜,但是三个步骤都不相同,模板定义步骤流程,通过不同的子类继承抽象模板实现模板设计模式。第二个案例是银行办理业务,无论办理什么业务都是取号,办理业务,评价。这里取号与评价都是相同的,各个子类只需要处理不同业务即可,通过不同的子类继承抽象模板实现模板设计模式。
第三个案例是银行办理业务的Java8函数式编程消费者模式Consumer模式改造,原理相同。
2.1 做菜模板模式
DishEggsWithTomato
package com.zrj.design.template.dish; /** * 西红柿炒鸡蛋 * * @author zrj * @since 2022/2/8 */ public class DishEggsWithTomato extends DishTemplate { @Override public void preparation() { System.out.println("准备西红柿鸡蛋..."); } @Override public void doing() { System.out.println("开始炒西红柿鸡蛋..."); } @Override public void carriedDishes() { System.out.println("西红柿鸡蛋装盘..."); } }
DishOnionWithTofu
package com.zrj.design.template.dish; /** * 小葱拌豆腐 * * @author zrj * @since 2022/2/8 */ public class DishOnionWithTofu extends DishTemplate { @Override public void preparation() { System.out.println("准备小葱豆腐..."); } @Override public void doing() { System.out.println("开始炒小葱拌豆腐..."); } @Override public void carriedDishes() { System.out.println("小葱拌豆腐装盘..."); } }
DishTemplate
package com.zrj.design.template.dish; /** * 做菜模板类 * 用于定义做菜的执行步骤,所有菜都可以按照这种方式做菜 * * @author zrj * @since 2022/2/8 */ public abstract class DishTemplate { /** * 做菜执行步骤 */ public final void doDish() { this.preparation(); this.doing(); this.carriedDishes(); } /** * 备料 */ public abstract void preparation(); /** * 做菜 */ public abstract void doing(); /** * 上菜 */ public abstract void carriedDishes(); }
DishTemplateTest
package com.zrj.design.template.dish; import org.junit.Test; /** * 模板模式 * 抽象父类定义方法模板,子类自定义实现方式。 * 优点: 1、封装不变部分,扩展可变部分。 2、提取公共代码,便于维护。 3、行为由父类控制,子类实现。 * 缺点:每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。 * 使用场景: 1、有多个子类共有的方法,且逻辑相同。 2、重要的、复杂的方法,可以考虑作为模板方法。 * 注意事项:为防止恶意操作,一般模板方法都加上 final 关键词。 * * 使用场景很多,只要有相同的执行逻辑,或者重要的复杂的方法,都可以交给父类管理。 * 比如开发XX系统步骤都是一样的,立项,需求,开发,测试,上线。 * * @author zrj * @since 2022/2/8 */ public class DishTemplateTest { @Test public void templateTest() { System.out.println("----------西红柿炒鸡蛋----------"); DishTemplate eggsWithTomato = new DishEggsWithTomato(); eggsWithTomato.doDish(); System.out.println("----------小葱拌豆腐----------"); DishTemplate onionWithTofu = new DishOnionWithTofu(); onionWithTofu.doDish(); } }
2.2 银行办理业务模板模式
BankBusinessHandler
package com.zrj.design.template.bank; import cn.hutool.core.util.RandomUtil; /** * 模板方法设计模式的抽象类 * 模板设计模式主要用来处理相同处理流程中的不同点,例如银行办理业务,无论什么业务,首先需要取号,其次处理业务,然后评价不同之处在于处理不同的业务使用不同的方式。 * BankBusinessHandler作为抽象模板 * BankSaveMoneyHandler作为存钱业务处理类,继承抽象模板BankBusinessHandler * BankDrawMoneyHandler作为理财业务处理类,继承抽象模板BankBusinessHandler * * @author zrj * @since 2022/2/8 **/ public abstract class BankBusinessHandler { /** * 模板方法,执行器 */ public final void execute() { getNumber(); handle(); judge(); } /** * 取号 */ private void getNumber() { System.out.println("取号:" + RandomUtil.randomNumbers(8)); } /** * 办理业务 */ public abstract void handle(); /** * 评价 */ private void judge() { System.out.println("评价:五星好评!"); } }
BankBusinessHandlerTest
package com.zrj.design.template.bank; /** * 模板方法测试类 * * @author zrj * @since 2022/2/8 **/ public class BankBusinessHandlerTest { public static void main(String[] args) { //存钱业务处理 BankSaveMoneyHandler bankSaveMoneyHandler = new BankSaveMoneyHandler(); bankSaveMoneyHandler.execute(); System.out.println("------------------------------"); //理财业务处理 BankDrawMoneyHandler bankDrawMoneyHandler = new BankDrawMoneyHandler(); bankDrawMoneyHandler.execute(); } }
BankDrawMoneyHandler
package com.zrj.design.template.bank; /** * 理财业务 * * @author zrj * @since 2022/2/8 **/ public class BankDrawMoneyHandler extends BankBusinessHandler { /** * 办理业务 */ @Override public void handle() { System.out.println("理财:2000$"); } }
BankSaveMoneyHandler
package com.zrj.design.template.bank; /** * 存钱业务 * * @author zrj * @since 2022/2/8 **/ public class BankSaveMoneyHandler extends BankBusinessHandler { /** * 办理业务 */ @Override public void handle() { System.out.println("存钱:1000$"); } }
2.3 银行办理业务函数式编程改造
BankBusinessHandlerCustomer
package com.zrj.design.template.customer; import cn.hutool.core.util.RandomUtil; import java.math.BigDecimal; import java.util.function.Consumer; /** * 模板设计模式的抽象类 * Java8函数式编程消费者模式Customer实现模板设计模式 * * @author zrj * @since 2022/2/8 **/ public class BankBusinessHandlerCustomer { /** * 存钱 */ public void save(BigDecimal amount) { execute(a -> System.out.println("存钱:" + amount)); } /** * 理财 */ public void draw(BigDecimal amount) { execute(a -> System.out.println("理财:" + amount)); } /** * 模板方法,执行器 */ public void execute(Consumer<BigDecimal> consumer) { getNumber(); consumer.accept(null); judge(); } /** * 取号 */ private void getNumber() { System.out.println("取号:" + RandomUtil.randomNumbers(8)); } /** * 评价 */ private void judge() { System.out.println("评价:五星好评!"); } }
BankBusinessHandlerCustomerTest
package com.zrj.design.template.customer; import java.math.BigDecimal; /** * @author zrj * @since 2022/2/8 **/ public class BankBusinessHandlerCustomerTest { public static void main(String[] args) { //构建银行业务处理对象 BankBusinessHandlerCustomer businessHandler = new BankBusinessHandlerCustomer(); //存钱业务处理 businessHandler.save(new BigDecimal("3000")); System.out.println("------------------------------"); //理财业务处理 businessHandler.draw(new BigDecimal("6000")); } }
-
Python设计模式之模板方法模式实例详解
2020-12-24 11:19:18本文实例讲述了Python设计模式之模板方法模式。分享给大家供大家参考,具体如下: 模板方法模式(Template Method Pattern):定义一个操作中的算法骨架,将一些步骤延迟至子类中.模板方法使得子类可以不改变一个算法的... -
Java中常用的设计模式【模板模式】
2022-02-26 15:27:50【本专栏的代码都放在:Java中常用的几种设计模式】 在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种... -
设计模式--模板方法模式java例子
2017-02-09 16:00:09设计模式--模板方法模式java例子 -
C++设计模式之模板方法模式(TemplateMethod)
2020-08-27 17:38:36主要为大家详细介绍了C++设计模式之模板方法模式TemplateMethod,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
设计模式回顾——模板模式(C++)
2020-10-24 18:22:53模板模式(Template Pattern),指的是定义一个抽象(算法)模板结构父类,具体实现方法由子类实现。模板模式是行为型设计模式中使用较为广泛的设计模式。 -
设计模式之模板模式和工厂模式
2019-06-15 16:02:49模板模式和工厂模式的类别分类为“交给子类”,即两种设计模式都是通过子类来实现具体的功能。主角是子类,而不像上次的适应设计模式,主角是连接器。这种差别着重体现在我们在工业设计中对需求的不同理解和实现。 ... -
设计模式 模板模式和策略模式
2022-03-19 20:17:12模板模式和策略模式,有...这种类型的设计模式属于行为型模式。 例子 假设我们需要设计两款游戏,他登录账号的方式是一样的,然后开始游戏和结束游戏的行为是不一样的,那么我们可以用模板模式来实现这个逻辑。 类图 -
模板设计模式,工厂设计模式,和代理设计模式的详解和区别?
2017-02-19 13:40:52JAVA中,模板设计模式,工厂设计模式,和代理设计模式的详解和区别?有资料介绍下也行。 -
java中使用模板设计模式
2021-12-30 11:39:08也就是我们干某些东西的时候,都会有固定的步骤,如springboot集成mybatis等和rentranlock中,都是使用了模板的设计模式,调用的时候都需要按照步骤来进行,但每个步骤里面可能大家都不相同,所以就可以用这种模式;... -
PHP设计模式之模板方法模式实例浅析
2020-12-20 00:54:39本文实例讲述了PHP设计模式之模板方法模式。分享给大家供大家参考,具体如下: 定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 模板... -
Java设计模式之模板模式(Template模式)介绍
2020-09-03 22:17:20主要介绍了Java设计模式之模板模式(Template模式)介绍,定义一个操作中算法的骨架,将一些步骤的执行延迟到其子类中,需要的朋友可以参考下 -
设计模式之模板方法模式讲解,优缺点、使用场景分析概述
2020-08-01 23:15:42模板方法模式是最为简单也最常用的设计模式之一了,它主要利用了Java的多态的特性,通过把所有的不会变化的定义放到一个抽象类(模板类)里实现,会变化的方法定义成抽象方法,再使用其子类对会变化的地方进行自定义... -
设计模式-原型模式与模板方法模式的对比总结
2019-11-12 20:19:51前面几个设计模式几乎都是以代码的形式进行汇总,和解析具体的流程。这节原型模式和模板方法模式大致上我觉得是有很多相似的地方,所以就来总结下,那些地方相同。那些地方不同! -
Java设计模式-模板模式
2021-08-05 11:19:49Java设计模式-模板模式 什么是模板模式? 模板模式,顾名思义,就是通过模板拓印的方式。 定义模板,就是定义框架、结构、原型。定义一个我们共同遵守的约定。 定义模板,我们的剩余工作就是对其进行充实、丰润,... -
详解设计模式中的模板方法模式及在C++中的使用
2020-12-31 09:32:15模板方法模式是设计模式行为型中最简单的一种设计模式。在实际中你甚至可能经常用到,只是你自己不知道它是一种设计模式罢了。 模板方法模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得... -
详解C#设计模式编程中的模板方法模式使用
2020-12-31 14:06:19在设计模式中,模板方法模式中模板和生活中模板概念非常类似,下面让我们就详细介绍模板方法的定义,大家可以根据生活中模板的概念来理解模板方法的定义。 二、模板方法模式详细介绍 2.1 模板方法模式的定义 模板... -
设计模式_模板方法模式.zip
2020-07-31 00:06:36在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式...这种类型的设计模式属于行为型模式。 模板方法模式 java demo -
c++设计模式-行为型模式-模板方法模式
2022-06-19 10:36:57c++设计模式-行为型模式-模板方法模式;qt工程;c++简单源码; 模板方法(Template Method)模式的定义如下:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重... -
javascript设计模式 – 模板方法模式原理与用法实例分析
2020-11-20 19:41:55本文实例讲述了javascript设计模式 – 模板方法模式原理与用法。分享给大家供大家参考,具体如下: 介绍:模板方法模式是结构最简单的行为型设计模式,在其结构中只存在父类与子类之间的继承关系。使用模板方法模式...