当前位置: 首页 > news >正文

网站 工信部备案 收回wordpress扫码跳转

网站 工信部备案 收回,wordpress扫码跳转,wordpress防36kr,wordpress skype插件1. 引言: 交易管理系统中的模板方法模式 之前做过一个交易管理系统#xff0c;其中有一个核心模块是“交易流程管理”#xff0c;该模块需要处理不同类型的交易#xff0c;比如期货交易、期权交易和股票交易。在构建交易管理系统的过程中#xff0c;我们面临了一个核心挑战…1. 引言: 交易管理系统中的模板方法模式 之前做过一个交易管理系统其中有一个核心模块是“交易流程管理”该模块需要处理不同类型的交易比如期货交易、期权交易和股票交易。在构建交易管理系统的过程中我们面临了一个核心挑战如何高效地管理不同类型的交易流程虽然这些交易类型在流程上存在差异但它们的核心步骤却惊人地相似。如果为每一种交易类型都独立编写一套实现逻辑不仅会增加工作量还会导致代码冗余和维护难度的增加。 1.1 模板方法模式的引入 为了解决这一问题我们采用了模板方法模式。这是一种行为设计模式它允许我们将交易流程中的公共步骤抽象化并在超类中定义这些步骤的执行顺序。同时将那些因交易类型而异的特定步骤留给各个子类去实现。这样我们不仅保持了交易流程的一致性还为每种交易类型提供了定制化的灵活性。 1.2 本文目的 在本文中我将深入探讨模板方法模式的基本概念、设计原则和实现步骤。通过实际案例分析你将能够理解模板方法模式的工作原理并学习如何在项目中有效地应用这一模式以提升代码质量和开发效率 2. 模板方法模式的基本概念 模板方法模式是一种基于继承实现的设计模式属于行为型模式。其主要思想是将定义的算法抽象成一组步骤在抽象类中定义算法的骨架而将具体的操作留给子类来实现。通俗地说模板模式就是将某一行为制定一个框架然后子类填充具体内容使得子类可以不改变算法的结构即可重定义该算法的某些特定步骤。 2.1 模板方法模式的角色构成 抽象类Abstract Class定义了一个模板方法该方法包含了交易的处理步骤算法骨架。这个类还包含了一些基本方法这些方法可以是抽象的由子类实现也可以是具体的在抽象类中已经实现。 具体子类Concrete Class 继承自抽象类并实现其中的抽象方法以完成特定类型交易的具体处理步骤。 钩子方法Hook Method 可选在抽象类中提供默认实现子类可以选择性地覆盖这些方法。 客户端Client可选 使用模板方法来执行算法。 2.2 好处模板方法模式的优势 模板方法模式在软件设计中具有多种好处特别是在需要定义一个算法的骨架同时允许子类提供某些步骤的具体实现时。 代码复用通过将算法的公共部分集中管理减少了代码的重复。在交易管理系统中不同交易类型的处理流程包括初始化、执行交易等公共步骤。通过模板方法模式这些步骤只需在超类中实现一次所有子类都可以复用这些代码。 可扩展性新增导出格式时只需添加一个新的子类而无需修改现有的算法框架。 灵活性子类可以根据自己的需求重写算法的特定步骤而不影响其他部分。 控制反转模板方法模式将算法的控制权从子类转移到了超类使得算法的流程更加清晰。如果交易的策略需要更新只需在超类中修改相应的方法所有子类都会自动继承这一更改。 2.3 坏处模板方法模式的弊端 有优点就会有缺点与其他设计模式一样模板方法模式也有一些潜在的弊端。 灵活性受限模板方法模式必须通过定义一个固定的算法框架来实现代码复用但这也意味着子类在实现时必须遵循这个框架。假设交易流程需要根据市场条件动态调整例如在某些紧急情况下需要跳过某些步骤或增加额外的验证。模板方法模式的固定性可能会限制这种灵活性。 增加复杂性在模板方法模式中算法的公共部分和可变部分被分离到不同的类中这可能会使得理解和维护系统变得更加复杂。如果交易管理系统有多个交易类型每个类型都有其特定的实现开发人员可能需要花费额外的时间去理解整个模板方法的架构和各个子类的实现。 3. 模板方法模式遵循的设计原则 单一职责原则 简称SRP。该原则强调每个类应该只有一个引起它变化的原因。在模板方法模式中抽象类负责定义算法的骨架具体子类负责实现特定的步骤保证了每个类都有明确的职责。 开闭原则简称OCP。该原则强调软件实体类、模块、函数等应该对扩展开放对修改关闭。模板方法模式通过在抽象类中定义算法的骨架允许子类通过扩展即实现抽象方法来改变算法的行为而不需要修改现有的代码。 里氏替换原则简称LSP。该原则强调子类型必须能够替换掉它们的基类型。在模板方法模式中具体子类可以替换抽象类并且客户端代码可以透明地使用这些子类而不会破坏程序的正确性。 依赖倒置原则简称DIP。该原则强调高层模块不应该依赖低层模块两者都应该依赖抽象抽象不应该依赖细节细节应该依赖抽象。模板方法模式中高层模块如客户端代码依赖于抽象类而不是具体的实现类从而实现了依赖的倒置。 接口隔离原则简称ISP。该原则强调客户端不应该被迫依赖它们不使用的方法。在模板方法模式中抽象类定义了模板方法和基本方法但具体子类只需要实现它们需要的方法不需要实现不相关的方法。 迪米特法则简称LoD。该原则强调一个对象应该对其他对象有最少的了解。模板方法模式中客户端只需要知道抽象类和模板方法而不需要了解具体子类的实现细节从而减少了对象之间的耦合。 当然这都是基于业务逻辑相对没那么复杂且处理的流程不需要频繁可变的情况。实际项目中可能有时候没法过于理想化的遵循所有的设计原则。以下是一些可能的情况 单一职责原则SRP 虽然模板方法模式将算法的骨架和具体实现分离但如果抽象类中定义了过多的基本方法或者子类需要实现过多的具体步骤可能会导致抽象类或子类的职责不够单一。 开闭原则OCP 虽然模板方法模式允许通过扩展子类来改变算法的行为但如果算法的骨架需要频繁修改或者需要频繁增加新的基本方法可能会导致抽象类需要不断修改从而违反开闭原则。 里氏替换原则LSP 如果子类的实现与抽象类的预期行为不一致或者子类错误地重写了基本方法可能会导致子类无法正确替换抽象类从而违反里氏替换原则。 依赖倒置原则DIP 虽然模板方法模式鼓励依赖于抽象类但如果抽象类的设计不够稳定或者抽象类与具体子类之间的耦合度过高可能会导致高层模块仍然依赖于低层模块的细节从而违反依赖倒置原则。 接口隔离原则ISP 如果抽象类中定义了过多的基本方法或者某些基本方法对于某些子类来说并不适用可能会导致子类被迫实现不必要的方法从而违反接口隔离原则。 迪米特法则LoD 虽然模板方法模式减少了客户端对具体子类的了解但如果抽象类与具体子类之间的交互过于复杂或者抽象类暴露了过多的实现细节可能会导致对象之间的耦合度过高从而违反迪米特法则。 4. 模板方法模式的实现流程 下面是一个交易管理系统的伪代码例子展示如何使用模板方法模式来处理不同类型的交易如期货交易、期权交易和股票交易的处理流程。流程大约分为3步。 定义抽象类创建一个抽象类 TransactionProcessor其中包含一个模板方法 processTransaction()以及一些基本方法如 convertParameters()、validateParameters() 和 additionalProcessing()。 // 抽象类 abstract class TransactionProcessor {// 模板方法public final void processTransaction(Object obj) {Object convertedParams convertParameters(obj);validateParameters(convertedParams);additionalProcessing(convertedParams);}// 基本方法protected abstract Object convertParameters(Object obj);protected abstract void validateParameters(Object convertedParams);// 钩子方法可选protected void additionalProcessing(Object convertedParams) {// 默认实现为空子类可以选择性地覆盖} }实现具体子类创建具体子类 FuturesTransactionProcessor、OptionsTransactionProcessor 和 StockTransactionProcessor它们分别实现期货交易、期权交易和股票交易的处理流程。 // 具体子类期货交易 class FuturesTransactionProcessor extends TransactionProcessor Overrideprotected Object convertParameters(Object obj) {// 这里进行具体的参数转换逻辑// ...// 返回转换后的参数return new Object(); }Overrideprotected void validateParameters(Object convertedParams) {// 这里进行具体的参数校验逻辑}Overrideprotected void additionalProcessing(Object convertedParams) {System.out.println(Performing additional processing for futures transaction...);// 这里进行具体的额外处理逻辑// ...} }// 具体子类期权交易 class OptionsTransactionProcessor extends TransactionProcessor {Overrideprotected Object convertParameters(Object obj) {// 这里进行具体的参数转换逻辑// ...// 返回转换后的参数return new Object(); }Overrideprotected void validateParameters(Object convertedParams) {// 这里进行具体的参数校验逻辑// ...}Overrideprotected void additionalProcessing(Object convertedParams) {// 这里进行具体的额外处理逻辑// ...} }// 具体子类股票交易 class StockTransactionProcessor extends TransactionProcessor {Overrideprotected Object convertParameters(Object obj) {// 这里进行具体的参数转换逻辑// ...// 返回转换后的参数return new Object(); }Overrideprotected void validateParameters(Object convertedParams) {// 这里进行具体的参数校验逻辑// ...}// 股票交易不需要额外的处理逻辑因此不覆盖 additionalProcessing 方法 }使用模板方法在客户端代码中使用模板方法来执行交易处理流程。 // 客户端代码 public class TradingSystem {public static void main(String[] args) {TransactionProcessor futuresProcessor new FuturesTransactionProcessor();futuresProcessor.processTransaction(new Object());TransactionProcessor optionsProcessor new OptionsTransactionProcessor();optionsProcessor.processTransaction(new Object());TransactionProcessor stockProcessor new StockTransactionProcessor();stockProcessor.processTransaction(new Object());} }5. 模板方法模式在实际框架中的使用 5.1 HttpServlet 中的模板方法模式 Java Servlet API 中的 HttpServlet 类使用了模板方法模式。HttpServlet 类定义了处理 HTTP 请求的模板方法 service而具体的请求处理逻辑如 doGet、doPost 等则由子类来实现。 public abstract class HttpServlet extends GenericServlet {private static final ResourceBundle lStrings ResourceBundle.getBundle(javax.servlet.http.LocalStrings);protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String method req.getMethod();long lastModified; if (method.equals(GET)) {lastModified this.getLastModified(req);if (lastModified -1L) {this.doGet(req, resp);} else {long ifModifiedSince;try {ifModifiedSince req.getDateHeader(If-Modified-Since);} catch (IllegalArgumentException var9) {ifModifiedSince -1L;}if (ifModifiedSince lastModified / 1000L * 1000L) {this.maybeSetLastModified(resp, lastModified);this.doGet(req, resp);} else {resp.setStatus(304);}}} else if (method.equals(HEAD)) {lastModified this.getLastModified(req);this.maybeSetLastModified(resp, lastModified);this.doHead(req, resp);} else if (method.equals(POST)) {this.doPost(req, resp);} else if (method.equals(OPTIONS)) {this.doOptions(req, resp);} else {String errMsg lStrings.getString(http.method_not_implemented);Object[] errArgs new Object[]{method};errMsg MessageFormat.format(errMsg, errArgs);resp.sendError(501, errMsg);}}protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String msg lStrings.getString(http.method_get_not_supported);this.sendMethodNotAllowed(req, resp, msg);}protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String msg lStrings.getString(http.method_post_not_supported);this.sendMethodNotAllowed(req, resp, msg);}// 其他方法... }5.2 JdbcTemplate 中的模板方法模式 Spring Framework 中的 JdbcTemplate 类也使用了模板方法模式。JdbcTemplate 提供了执行 SQL 查询和更新的模板方法而具体的 SQL 语句和参数则由回调函数来提供。 public class JdbcTemplate extends JdbcAccessor implements JdbcOperations {Nullablepublic T T query(final String sql, final ResultSetExtractorT rse) throws DataAccessException {Assert.notNull(sql, SQL must not be null);Assert.notNull(rse, ResultSetExtractor must not be null);if (this.logger.isDebugEnabled()) {this.logger.debug(Executing SQL query [ sql ]);}class QueryStatementCallback implements StatementCallbackT, SqlProvider {QueryStatementCallback() {}Nullablepublic T doInStatement(Statement stmt) throws SQLException {ResultSet rs null;Object var3;try {rs stmt.executeQuery(sql);var3 rse.extractData(rs);} finally {JdbcUtils.closeResultSet(rs);}return var3;}public String getSql() {return sql;}}return this.execute((StatementCallback)(new QueryStatementCallback()));}public T T query(String sql, Object[] args, ResultSetExtractorT rse) throws DataAccessException {// 创建并执行 PreparedStatement// 处理 ResultSet// 返回结果}// 其他方法... }5.3 RestTemplate 中的模板方法模式 RestTemplate 提供了一系列的 exchange 和 execute 方法这些方法定义了 HTTP 请求的执行流程而具体的请求细节如请求方法、URL、请求头、请求体等则由子类或回调函数来提供。 public class RestTemplate extends InterceptingHttpAccessor implements RestOperationsNullablepublic T T execute(URI url, HttpMethod method, Nullable RequestCallback requestCallback, Nullable ResponseExtractorT responseExtractor) throws RestClientException {return this.doExecute(url, method, requestCallback, responseExtractor);}Nullableprotected T T doExecute(URI url, Nullable HttpMethod method, Nullable RequestCallback requestCallback, Nullable ResponseExtractorT responseExtractor) throws RestClientException {Assert.notNull(url, URI is required);Assert.notNull(method, HttpMethod is required);// 1. 创建请求ClientHttpResponse response null;Object var14;try {ClientHttpRequest request this.createRequest(url, method);if (requestCallback ! null) {requestCallback.doWithRequest(request);}response request.execute();this.handleResponse(url, method, response);var14 responseExtractor ! null ? responseExtractor.extractData(response) : null;} catch (IOException var12) {String resource url.toString();String query url.getRawQuery();resource query ! null ? resource.substring(0, resource.indexOf(63)) : resource;throw new ResourceAccessException(I/O error on method.name() request for \ resource \: var12.getMessage(), var12);} finally {if (response ! null) {response.close();}}return var14;} }
http://www.w-s-a.com/news/947435/

相关文章:

  • 网站用自己的电脑做服务器佛山做网站制作公司
  • 一个网站如何做cdn加速器如何上传网站数据库
  • 汝州住房和城乡建设局新网站营销网站定位
  • yy直播官网seo引擎优化是什
  • 做影视网站违法莫品牌营销是什么
  • 全网最稳最低价自助下单网站wordpress电影网站主题
  • 域名更换网站温州建设工程网站
  • 网站如何优化推广连锁店管理网站开发
  • 伊宁市做网站功能性质网站
  • 北京哪个网站制作公司优化大师免费安装下载
  • 同江佳木斯网站设计做网站联系电话
  • 设计上海展会2023seo网站模板下载
  • 开发一个卖东西的网站多少站长工具永久
  • 公司网站怎么突然多了好多友情链接如何删除宁波有几个区
  • 临沂seo网站推广wordpress新编辑器
  • c2c网站设计店面logo设计制作
  • 网站建设任务执行书重庆今天新闻事件
  • 怎样发布自己的网站南宁制作网站公司
  • wordpress装多站点百度查一下
  • 怎么优化一个网站搭建网站免费空间
  • 山东建设和城乡建设厅注册中心网站首页wordpress安装教材
  • 个人风采网站制作毕节网站开发公司电话
  • 网络网站销售设计主题和设计理念
  • 做网站一般用什么服务器承德专业做网站
  • 松北区建设局网站网站建设分为几种
  • 网站建设的合同 体会智联招聘网站建设情况
  • 记的网站域名wordpress地方信息主题
  • 淄博好的建网站公司网站建设 海口
  • 有人做网站花了10几万2017做啥网站能致富
  • 做网站有什么软件cod建站平台