JAVA SCRIPT设计模式--行为型--设计模式之Template Method模板方法(22)

news2024/12/24 22:01:30

         JAVA SCRIPT设计模式是本人根据GOF的设计模式写的博客记录。使用JAVA SCRIPT语言来实现主体功能,所以不可能像C++,JAVA等面向对象语言一样严谨,大部分程序都附上了JAVA SCRIPT代码,代码只是实现了设计模式的主体功能,不代表全部的正确,特此声明。若读者需要了解设原则、设计变化方向,环境相关等信息请查看设计模式开篇。

        所有JAVA SCRIPT设计模式快捷连接:

              创建型:(1)  抽象工厂 (2) 生成器 (3) 工厂方法 (4) 原型  (5) 单例​

              结构型:(6) 适配器  (7) 桥接  (8) 组合 (9) 装饰 (10) 外观 (11) 享元 (12) 代理​

              行为型:(13) ​职责链 (14) ​命令 (15) ​解释器 (16) ​迭代器 (17) ​中介者 (18) ​备忘录 (119) ​观察者 (20) ​状态​ (21) ​策略 (22) ​模板方法 (23) 访问者​


一、UML类图

参与者:  

1.1 AbstractClass(抽象类,如Application) 

  • 定义抽象的原语操作(primitive operation),具体的子类将重定义它们以实现一个算法的各步骤。
  • 实现一个模板方法,定义一个算法的骨架。该模板方法不仅调用原语操作,也调用定义在AbstractClass或其他对象中的操作。

1.2 ConcreteClass(具体类,如MyApplication) 

  • 实现原语操作以完成算法中与特定子类相关的步骤。

二、意图

    定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。 TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤

三、适用性 

  1. 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现
  2. 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。 
  3. 控制子类扩展。这样就只允许在这些点进行扩展。

四、示例代码

4.1  动机

        考虑一个提供Application和Document类的应用框架。Application类负责打开一个已有的以外部形式存储的文档,如一个文件。一旦一个文档中的信息从该文件中读出后,它就由一
个Document对象表示。

        用框架构建的应用可以通过继承Application和Document来满足特定的需求。例如,一个绘图应用定义DrawApplication和DrawDocument子类;一个电子表格应用定义Spreadsheet-Application和SpreadsheetDocument子类,如下页图所示。

        抽象的Application类在它的OpenDocument操作中定义了打开和读取一个文档的算法:

void Application::OpenDocument(const chat *name) {

    if(!CanOpenDocument(name)) {
        // can not handle this document
        return;
    }
    Documnet *doc=DoCreateDocumnet();
    if(doc){
        _doc->AddDocument(doc);
        AboutToOpentDocument(doc);
        doc->Open();
        doc->DoRead();
    }
}

        OpenDocument定义了打开一个文档的每一个主要步骤。它检查该文档是否能被打开,创建与应用相关的Document对象,将它加到它入的文档集合中,并且从一个文件中读取该Document。


        我们称OpenDocument为一个模板方法(templatemethod)。一个模板方法用一些抽象的操作定义一个算法,而子类将重定义这些操作以提供具体的行为。Application的子类将定义检查一个文档是否能够被打开(CanOpenDocument)和创建文档(DoCreateDocument)的具体算法步骤。Document子类将定义读取文档(DoRead)的算法步骤。如果需要,模板方法也可定义一个操作(AboutToOpenDocument)让Application子类知道该文档何时将被打开。通过使用抽象操作定义一个算法中的一些步骤,模板方法确定了它们的先后顺序,但它允许Application和Document子类改变这些具体步骤以满足它们各自的需求。

4.2  目录结构:

4.3 AbstractClass(抽象类,如Application) 

  • 定义抽象的原语操作(primitive operation),具体的子类将重定义它们以实现一个算法的各步骤。
  • 实现一个模板方法,定义一个算法的骨架。该模板方法不仅调用原语操作,也调用定义在AbstractClass或其他对象中的操作。
export default class Application {
  doc;
  constructor() {

  }
  AddDocument(doc) {
	//add docs list
  }
   /** 
    * 模板方法
    * 定义了打开和读取一个文档的算法
   */
  OpenDocument(filename) { 
    if (!this.CanOpenDocument(filename)) {
      // can not handle this document
      return;
    }
    let newdoc=this.DoCreateDocumnet(filename);
    if (newdoc) {
      this.AddDocument(newdoc);
      this.AboutToOpentDocument(newdoc);
      newdoc.Open();
      newdoc.DoRead();
    }
  }
  
  CanOpenDocument() {
  	console.log(` you must implemnet this funciton  `);
  }
  
  DoCreateDocument() {
	console.log(` you must implemnet this funciton  `);
  }
 
  AboutToOpentDocument() {
	console.log(` you must implemnet this funciton  `);
  }

}

4.5 ConcreteClass(具体类,如MyApplication) 

  • 实现原语操作以完成算法中与特定子类相关的步骤。
import Application  from '../Application.js'; 
import WordDocument  from '../../Document/impl/WordDocument.js'; 

export default  class WordApplication extends Application {
     
	constructor(  ) {
	 super();
	}

	DoCreateDocumnet(docname) {
		 console.log(` WordApplication DoCreateDocument `);
		 return new WordDocument(docname);
	}
	CanOpenDocument() {
		 console.log(` WordApplication CanOpenDocument `);
		 return true;
	}
	AboutToOpentDocument() {
		 console.log(` WordApplication AboutToOpenDocument `);
	}
   
	 
  } 
import Application  from '../Application.js'; 
import ExcelDocument  from '../../Document/impl/ExcelDocument.js'; 

export default  class ExcelApplication extends Application {
     
	constructor(  ) {
	 super();
	}

	DoCreateDocumnet(docname) {
		 console.log(` ExcelApplication DoCreateDocument `);
		 return new ExcelDocument(docname);
	}
	CanOpenDocument() {
		 console.log(` ExcelApplication CanOpenDocument `);
		 return true;
	}
	AboutToOpentDocument() {
		 console.log(` ExcelApplication AboutToOpenDocument `);
	}
   
	 
  } 

4.6  Client

import ExcelApplication  from './Application/impl/ExcelApplication.js';
import WordApplication  from './Application/impl/WordApplication.js';
import ExcelDocument  from './Document/impl/ExcelDocument.js'; 
import WordDocument  from './Document/impl/WordDocument.js'; 
 

export default class Application{
    menu;
	doc;
	zooRect;
    constructor(ctx,zooRect) {
    	this.ctx=ctx;
		this.zooRect=zooRect;
		let excelApplication=new ExcelApplication();
		excelApplication.OpenDocument('path');//调用模板方法


		let wordApplication=new WordApplication();
		wordApplication.OpenDocument('path');//调用模板方法


	 
    }
    
   
 }

4.6 测试HTML

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">


		<script type="module">
			import Client from './Client.js';
			var canvas = document.getElementById("mycanvas")
			var ctx = canvas.getContext("2d") //create 2d object
			let cl = new Client(ctx,{startx:0,starty:0,width:900,height:900});
	 
		</script>
	</head>
	<body>
		<canvas id="mycanvas" width=900px height=900px></canvas>

	</body>
</html>

测试结果:

ExcelApplication.js:15  ExcelApplication CanOpenDocument 
ExcelApplication.js:11  ExcelApplication DoCreateDocument 
ExcelApplication.js:19  ExcelApplication AboutToOpenDocument 
Document.js:7 Document 统一方法 Open 
ExcelDocument.js:9 ExcelDocument DoRead 方法 
WordApplication.js:15  WordApplication CanOpenDocument 
WordApplication.js:11  WordApplication DoCreateDocument 
WordApplication.js:19  WordApplication AboutToOpenDocument 
Document.js:7 Document 统一方法 Open 
WordDocument.js:8 WordDocument DoRead 方法 

五、源代码下载

        下载链接:https://pan.baidu.com/s/1XuPqp84cccBNVkbnMY3sKw 
         提取码:q2ut

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/73941.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java课程教学过程f6oz5

对于即将毕业或者即将做课设的同学而言&#xff0c;由于经验的欠缺&#xff0c;面临的第一个难题就是选题&#xff0c;确定好题目之后便是开题报告&#xff0c;如果选题首先看自己学习那些技术&#xff0c;不同技术适合做不同的产品&#xff0c;比如自己会些简单的Java语言&…

BSV 上的 Graftroot

我们已经演示了如何使用无合约的合约在 BSV 上实现 Taproot。我们将展示了其后续提案 Graftroot 可以以类似的方式实施。 BTC 中的 Grabroot 与 Taproot 类似&#xff0c;有两种方式可以使用锁定在由多方创建的聚合公钥 P 中的资金&#xff1a; 合作案例&#xff1a;又名默认…

kubernetes 安装 Harbor 仓库

文章目录kubernetes 安装 Harbor 仓库1. 下载 Harbor2. 安装 docker3. 优化 docker 配置4. 下载 docker-compose5. 安装 Harbor:one: 上传 harbor 文件包:two: 解压:three: 修改配置文件:four: 执行安装脚本安装:five: 配置开机自启6. 登陆测试:one: 浏览器登陆:two: 命令行登陆…

为什么需要对相机标定?

以下内容来自系统教程如何搞定单目/鱼眼/双目/阵列 相机标定&#xff1f; 点击领取相机标定资料和代码 为什么需要对相机标定&#xff1f; 我们所处的世界是三维的&#xff0c;而相机拍摄的照片却是二维的&#xff0c;丢失了其中距离/深度的信息。从数学上可以简单理解为&…

Peppol网络对接流程

Peppol 代表泛欧在线公共采购&#xff0c;现在连接到 Peppol 的组织可以通过高度安全的国际网络交换商业文件。知行软件通过了 PEPPOL 的 AS2 及 AS4 测试&#xff0c;被 OpenPEPPOL AISBL 正式认证为 PEPPOL 接入点供应商。可以在Peppol查询到相关接入点信息&#xff0c;如下&…

TH9-搭建后台系统

TH9-搭建后台系统1、项目架构1.1 概述1.2 API网关1.2.1 搭建网关依赖引导类跨域问题配置类配置文件1.2.2 配置鉴权管理器1.3 Nacos配置中心1.3.1 添加依赖1.3.2 添加bootstrap.yml配置1.3.3 nacos添加配置2、后台系统2.1 概述2.2 环境前端搭建2.2.1 导入数据库2.2.2 导入静态页…

MYSQL-INNODB索引构成详解

作者&#xff1a;郑啟龙 摘要&#xff1a; 对于MYSQL的INNODB存储引擎的索引&#xff0c;大家是不陌生的&#xff0c;都能想到是 B树结构&#xff0c;可以加速SQL查询。但对于B树索引&#xff0c;它到底“长”得什么样子&#xff0c;它具体如何由一个个字节构成的&#xff0c…

插入排序

目录 插入排序 思路: 原理视频: 代码: 时间复杂度: 总结: 题目链接: 插入排序 题目描述&#xff1a; 插入排序基本思想是每一步将一个待排序的记录&#xff0c;插入到前面已经排好序的有序序列中去&#xff0c;直到插完所有元素为止。 输入N个整数&#xff0c;将它们从…

【设计模式】代理模式(Proxy Pattern)

代理模式属于结构型模式&#xff0c;当一个对象不处于相同内存空间时、创建开销大时、需要进行安全控制时或需要代理处理一些其他事物时可以使用代理模式。代理模式通过为另一个类提供一个替身类来控制对这个类的对象的访问。 文章目录代理模式的介绍代理的分类&#xff1a;优点…

了解CloudCompare软件

CloudCompare是一款基于GPL开源协议的3D点云处理软件&#xff0c; 打开一个点云&#xff1b; 按住鼠标拖动旋转会出现坐标轴&#xff1b; 如果选中 TLS/GBL&#xff0c; 会出来右边这个线框&#xff0c;可以一起旋转&#xff1b;查了一下&#xff0c;TLS/GBL似乎是地面激光雷达…

2022年国际工程行业研究报告

第一章 行业概况 国际工程是指一个工程项目从咨询、投资、招投标、承包(包括分包)、设备采购、培训到监理各个阶段的参与者来自不止一个国家&#xff0c;并且按照国际工程项目管理模式进行管理的工程。国际工程是一种综合性的国际经济合作方式&#xff0c;是国际技术贸易的一种…

了解Linux内核内存映射

【推荐阅读】 深入linux内核架构--进程&线程 路由选择协议——RIP协议 轻松学会linux下查看内存频率,内核函数,cpu频率 纯干货&#xff0c;linux内存管理——内存管理架构&#xff08;建议收藏&#xff09; 概述Linux内核驱动之GPIO子系统API接口 一. 内存映射原理 由于所…

shadow阴影属性

shadow阴影属性 盒子阴影CSS中新增了盒子阴影&#xff0c;我们可以使用box-shadow属性为盒子添加阴影 源代码 box-shadow: h-shadow v-shadow blur spread color inset; h-shadow 必需&#xff0c;水平阴影的位置&#xff0c;允许负值 v-shadow…

AI 揭晓答案,2022世界杯冠军已出炉

卡塔尔世界杯&#xff0c;究竟谁能捧起大力神杯&#xff0c;就让我们用机器学习预测一下吧&#xff01; 文章目录数据源技术提升数据集构建功能开发数据分析模型世界杯模拟结论数据源 为了构建机器学习模型&#xff0c;我们需要来自团队的数据。首先需要一些能够说明球队表现的…

Java学习之多态参数

目录 多态参数 父类-Employee类 子类-Worker类 子类-Manager类 Test类-要求1 main类-PolyParameter 在main类中调用Test类的showEmpAnnual(Employee e) 方法 运行结果 Test类-要求2 代码 main方法内调用 分析 运行结果 多态参数 方法定义的形参类型是父类&#xff0…

青竹画材创业板IPO被终止:年营收4.15亿 文投基金是股东

雷递网 雷建平 12月8日河北青竹画材科技股份有限公司&#xff08;简称&#xff1a;“青竹画材”&#xff09;日前IPO被终止。青竹画材曾计划募资4.1亿元&#xff0c;其中&#xff0c;3.08亿元用于美术画材产能扩建项目&#xff0c;2317.35万元用于研发中心项目&#xff0c;7966…

Selenium+python常见问题,闪退,找不到元素

1、闪退问题&#xff1a; 由于缺少浏览器对应驱动。谷歌&#xff1a;chromedriver驱动&#xff1b;火狐&#xff1a;geckodriver驱动 查看Chrome版本 查找Chrome和ChromeDriver的对应关系 打开Chrome&#xff0c;在设置 – 关于Chrome下载对应ChromeDriver ChromeDriver下载…

本地存储:localStorage,sessionStorage,和cookie。区别

localStorage&#xff1a; 特点&#xff1a; 永久存储支持跨页面通讯&#xff0c;也就是在其他页面同样可以获取到你存好的数据。只能存储字符串类型的数据&#xff0c;不能存储复杂数据类型 sessionStorage&#xff1a; 特点&#xff1a; 临时存储&#xff0c;会话级别&am…

68. 关于 SAP ABAP 报表的多语言显示问题

文章目录 SAP 标准程序的多语言显示支持自开发 Screen 的字段,如何实现多语言显示呢?总结最近一个朋友向我发起知乎咨询,询问 SAP ABAP 报表的字段文本,到底是存储在哪些数据库表里的。 随着后来笔者同这位朋友的深入沟通,得知这位朋友询问的问题背后,实际上包含了一个重…

Windows系统还原失败该怎么办?

系统还原是Windows系统中一个强大的实用程序&#xff0c;它允许您将系统回退到以前的时间点及状态。该功能可以用来撤销对系统所做的一系列更改&#xff0c;比如&#xff0c;当您执行了驱动程序的更新后&#xff0c;计算机出现了异常&#xff0c;您就可以通过系统还原的操作将系…