日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

模板模式

發(fā)布時(shí)間:2023/12/9 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 模板模式 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言:邊動(dòng)手,邊動(dòng)腦,才能進(jìn)步,只動(dòng)手不動(dòng)腦,一塌糊涂
定義

又稱模板方法模式,定義一個(gè)算法的骨架,并且允許子類為一個(gè)或多個(gè)步驟提供實(shí)現(xiàn),屬于行為性設(shè)計(jì)模式

用途

用來(lái)梳理流程標(biāo)準(zhǔn)化的業(yè)務(wù)場(chǎng)景

應(yīng)用場(chǎng)景

一次性實(shí)現(xiàn)一個(gè)算法不變的部分,并將可變的部分留給子類去實(shí)現(xiàn)

Demo1

以員工從一家公司離職到另一家公司面試并上班為例(假定必須先離職才能去面試)

package com.ns.template.demo1;/*** 找工作類(抽象類,部分方法為protected修飾--保證子類可訪問(wèn),部分方法為final修飾--保證方法不被允許修改)*/ public abstract class FindWork {/*** 找工作方法,protected定義保證只有子類才能調(diào)用*/protected final void find(){//1.先給當(dāng)前公司提交離職申請(qǐng)this.applyLeave();//2.審批通過(guò)this.approveLeave();//3.拿到離職證明this.getLeaveProve();//4.找到下家要面試的公司this.findCompany();//5.人事面試this.personalInterview();//6.技術(shù)面試this.technologyInterview();//7.提交各種資料(不一定是必須的)//在模板模式中,此類方法被稱作鉤子方法,用來(lái)靈活的干預(yù)流程if(necessary()){submitInformation();}//8.入職this.doWork();}final void doWork() {System.out.println("入職辦理完成,開(kāi)始上班了");}abstract void submitInformation();protected boolean necessary() {return false;}final void technologyInterview() {System.out.println("技術(shù)面試也通過(guò)了,準(zhǔn)備辦理入職");}final void personalInterview() {System.out.println("物色到一家不錯(cuò)的公司,人事面試通過(guò)了");}final void findCompany() {System.out.println("目前成為了無(wú)業(yè)人員,開(kāi)始尋找下家公司");}final void getLeaveProve() {System.out.println("員工拿到離職證明");}final void approveLeave() {System.out.println("公司同意該員工離職");}final void applyLeave(){System.out.println("準(zhǔn)備申請(qǐng)離職");} } package com.ns.template.demo1;/*** 普通員工,不需要提交任何入職資料,不需要重寫(xiě)鉤子方法*/ public class GeneralPerson extends FindWork{@Overridevoid submitInformation() {} } package com.ns.template.demo1;/*** 特殊員工,需要提交入職部分資料,通過(guò)重寫(xiě)鉤子方法*/ public class SpecialPerson extends FindWork{private Boolean necessary;public SpecialPerson(Boolean necessary){this.necessary = necessary;}@Overridevoid submitInformation() {System.out.println("提交離職證明");System.out.println("提交薪資流水單");}@Overrideprotected boolean necessary() {return this.necessary;} } package com.ns.template.demo1;/*** 測(cè)試類*/ public class TestTemplate {public static void main(String[] args) {GeneralPerson generalPerson = new GeneralPerson();generalPerson.find();SpecialPerson specialPerson = new SpecialPerson(true);specialPerson.find();} }

Demo2

以JDBC連接數(shù)據(jù)庫(kù)的過(guò)程為例

package com.ns.template.demo2;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;/*** JDBC連接、數(shù)據(jù)獲取、釋放類*/ public abstract class JdbcTemp {private DataSource dataSource;public JdbcTemp(DataSource dataSource){this.dataSource = dataSource;}public List<?> executeQuery(String sql, RowMapper<?> rowMapper, Object[] values){List<?> result;try {//1.獲取連接,從dataSource中獲取Connection coon = this.getConnection();//2.創(chuàng)建語(yǔ)句集,通過(guò)連接對(duì)象創(chuàng)建執(zhí)行語(yǔ)句PreparedStatement pstm = this.createStatement(coon,sql);//3.執(zhí)行語(yǔ)句集,設(shè)置參數(shù)并執(zhí)行ResultSet rs = this.executeSql(pstm,values);//4.處理結(jié)果集result = this.parseResultSet(rs,rowMapper);//5.關(guān)閉結(jié)果集this.closeResultSet(rs);//6.關(guān)閉語(yǔ)句集this.closeStatement(pstm);//7.關(guān)閉連接this.closeConnection(coon);} catch (SQLException e) {e.printStackTrace();throw new RuntimeException();}return result;}private void closeConnection(Connection coon) throws SQLException {coon.close();}private void closeStatement(PreparedStatement pstm) throws SQLException {pstm.close();}private void closeResultSet(ResultSet rs) throws SQLException {rs.close();}private List<?> parseResultSet(ResultSet rs, RowMapper<?> rowMapper) throws SQLException {List<Object> result = new ArrayList<>();int rowNum = 1;while (rs.next()){result.add(rowMapper.mapRow(rs,rowNum++));}return result;}private ResultSet executeSql(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();}private PreparedStatement createStatement(Connection coon, String sql) throws SQLException {return coon.prepareStatement(sql);}private Connection getConnection() throws SQLException {return this.dataSource.getConnection();} } package com.ns.template.demo2;import java.sql.ResultSet; import java.sql.SQLException;/*** 約束ORM邏輯的接口(實(shí)現(xiàn)實(shí)體之間映射關(guān)系)* @param <T>*/ public interface RowMapper<T> {T mapRow(ResultSet rs, int rowNum) throws SQLException; } package com.ns.template.demo2;/*** 人員實(shí)體類*/ public class Person {private String userCode;private String userName;private String password;private int age;public String getUserCode() {return userCode;}public void setUserCode(String userCode) {this.userCode = userCode;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Person{" +"userCode='" + userCode + '\'' +", userName='" + userName + '\'' +", password='" + password + '\'' +", age=" + age +'}';} } package com.ns.template.demo2;import javax.sql.DataSource; import java.util.List;/*** 數(shù)據(jù)庫(kù)操作類*/ public class MemberDao extends JdbcTemp {public MemberDao(DataSource dataSource) {super(dataSource);}/*** 此處可擴(kuò)展,如果把查詢到的字段與實(shí)體字段映射起來(lái),而不是一個(gè)個(gè)get(小小的思考)*/public List<?> select(){String sql = "select * from person";return super.executeQuery(sql, (RowMapper<Person>) (rs, rowNum) -> {Person person = new Person();person.setAge(rs.getInt("age"));person.setPassword(rs.getString("password"));person.setUserCode(rs.getString("user_code"));person.setUserName(rs.getString("user_name"));return person;},null);} } package com.ns.template.demo2;import org.apache.commons.dbcp.BasicDataSource;/*** 將數(shù)據(jù)源初始化封裝成簡(jiǎn)單的單例模式*/ public class DataSourceSingleton {private static BasicDataSource dataSource;private DataSourceSingleton(){}static {dataSource = new BasicDataSource();dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/redis?serverTimezone=UTC");dataSource.setUsername("root");dataSource.setPassword("123456");}public static BasicDataSource getInstance(){return dataSource;} } package com.ns.template.demo2;import java.util.List;/*** 測(cè)試類*/ public class TestJdbcTemplate {public static void main(String[] args) {MemberDao memberDao = new MemberDao(DataSourceSingleton.getInstance());List<?> result = memberDao.select();System.out.println(result);} }

建表語(yǔ)句

CREATE TABLE `person` (`user_code` varchar(10) DEFAULT NULL COMMENT '用戶代碼',`user_name` varchar(20) DEFAULT NULL COMMENT '用戶名稱',`password` varchar(20) DEFAULT NULL COMMENT '密碼',`age` int(2) DEFAULT NULL COMMENT '年齡' ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='人員表';INSERT INTO `person` VALUES ('1', '測(cè)試用戶1', '123456', '1000');

總結(jié)

優(yōu)點(diǎn):
1.將相同處理邏輯放到父類,提高了代碼的復(fù)用性
2.將不同的代碼放到子類中處理,提高了代碼的可擴(kuò)展性
缺點(diǎn):
1.類數(shù)目的增加,每個(gè)子類都要去繼承父類,導(dǎo)致類文件數(shù)量的增多
2.父類如果添加新的抽象方法,子類都要跟著修改

最后,希望大家都能學(xué)以致用!!!

總結(jié)

以上是生活随笔為你收集整理的模板模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。