模板方法模式(Template Method):父类中定义一组操作算法骨架,而降一些实现步骤延迟到子类中,使得子类可以不改变父类的算法结构的同时可重新定义算法中某些实现步骤。

项目经理体验了各个页面的交互功能,发现每个页面的弹出框样式都不太一致,有的是高度高一些,有的是字体大了些,有的是按钮歪了些。 于是我们就需要将这些页面中的弹出框归一化。

我们首先要做的就是创建一个基本提示框基类,然后其他提示框类只需要在继承的基础上,拓展自己所需即可了吧,这样日后需求再变动我们修改基础类就可以使所有提示框的样式都统一化了。

基本提示框,它有一个提示内容、一个关闭按钮和确定按钮

// 模板类 基础提示框 data 渲染数据

var Alert = function(data) {
// 没有数据则返回,防止后面程序执行
if(!data) return;
// 设置内容
this.content = data.content;
// 创建提示框模板
this.panel = document.createElement('div');
// 创建提示内容组件
this.contentNode = document.createElement('p');
// 创建确定按钮组件
this.confirmBtn = document.createElement('span');
// 创建关闭按钮组件
this.closeBtn = document.createElement('b');
// 为提示框模板添加类
this.panel.className = 'alert';
// 为关闭按钮添加类
this.closeBtn.className = 'a-closse';
// 为确定按钮添加类
this.confirmBtn.className = 'a-confirm';
// 为确定按钮添加文案
this.confirmBtn.innerHTML = data.confirm || '确认';
// 为提示内容添加文本
this.contentNode.innerHTML = this.content;
// 点击确定按钮执行方法 如果data中有success方法则为success方法,否则为空函数
this.success = data.success || function();
// 点击关闭按钮执行方法
this.fail = data.fail || function();
}

模板的原型方法

既然这个基本提示框是可创建的,那么它也应该具有一些基本方法,比如应该有init方法来组装提示框, bindEvent方法来绑定点击确定或关闭按钮事件,等等。

// 提示框原型方法
Alert.prototype = {
// 创建方法
init: function() {
// 生成提示框
this.panel.appendChild(this.closeBtn);
this.panel.appendChild(this.contentNode);
this.panel.appendChild(this.confirmBtn);
// 插入页面中
document.body.appendChild(this.panel);
// 绑定事件
this.bindEvent();
// 显示提示框
this.show();
},
bindEvent: function() {
var me = this;
// 关闭按钮点击事件
this.closeBtn.onclick = function() {
// 执行关闭取消方法
me.fail();
// 隐藏弹层
me.hide();
}
// 确定按钮点击事件
this.confirmBtn.onclick = function() {
// 执行关闭确认方法
me.success();
// 隐藏弹层
me.hide();
}
},
// 隐藏弹层方法
hide: function() {
this.panel.style.display = 'none';
},
// 显示弹层方法
show: function() {
this.panel.style.display = 'block';
},
// 确认方法
success: function() {
console.log('success');
}
// 取消方法
fail: function() {
console.log('fail');
}
}

有了这个提示框基类,再想拓展其他类型弹层则容易多了,比如右侧按钮提示框

// 右侧按钮提示框
var RightAlert = function(data) {
// 继承基本提示框的构造函数
Alert.call(this. data);
// 为确认按钮添加right类设置位置偏右
this.confirmBtn.className = this.confirmBtn.className + ' right';
} // 继承基本提示框方法
RightAlert.prototype = new Alert();

取消按钮提示框

// 取消按钮提示框

var CancelAlert = function(data) {
Alert.call(this, data);
this.cancelBtn = document.createElement('span');
this.cancelBtn.innerHTML = data.cancelText || '取消';
this.cancelBtn.className = 'a-cancel btn';
} CancelAlert.prototype = new Alert(); CancelAlert.prototype.init = function() {
Alert.prototype.init.call(this);
this.panel.appendChild(this.cancelBtn);
}

右侧取消按钮提示框

/ 右侧取消按钮提示框
var RightCancelAlert = function(data) {
// 继承取消提示框的构造函数
CancelAlert.call(this, data);
this.cancelBtn.className = this.cancelBtn.className + ' right'
} RightCancelAlert.prototype = new CancelAlert(); RightCancelAlert.prototype.init = function() {
CancelAlert.prototype.init.call(this);
}

javascript设计模式(张容铭)学习笔记 - 照猫画虎-模板方法模式的更多相关文章

  1. javascript设计模式(张容铭)学习笔记 - 外观模式绑定事件

    有一个需求要为document对象绑定click事件来是想隐藏提示框的交互功能,于是小白写了如下代码: document.onclick = function(e) { e.preventDefaul ...

  2. javascript设计模式(张容铭) 第14章 超值午餐-组合模式 学习笔记

    JS 组合模式更常用于创建表单上,比如注册页面可能有不同的表单提交模块.对于这些需求我们只需要有基本的个体,然后通过一定的组合即可实现,比如下面这个页面样式(如图14-2所示),我们来用组合模式实现. ...

  3. JavaScript设计模式之观察者模式(学习笔记)

    设计模式(Design Pattern)对于软件开发来说其重要性不言而喻,代码可复用.可维护.可扩展一直都是软件工程中的追求!对于我一个学javascript的人来说,理解设计模式似乎有些困难,对仅切 ...

  4. min-max容斥学习笔记

    min-max容斥学习笔记 前置知识 二项式反演 \[ f(n)=\sum_{i=0}^n\binom{n}{i}g(i)\Leftrightarrow g(n)=\sum_{i=0}^n(-1)^{ ...

  5. 【Head-First设计模式】C#版-学习笔记-开篇及文章目录

    原文地址:[Head-First设计模式]C#版-学习笔记-开篇及文章目录 最近一年断断续续的在看技术书,但是回想看的内容,就忘了书上讲的是什么东西了,为了记住那些看过的东西,最好的办法就是敲代码验证 ...

  6. 《JavaScript DOM 编程艺术》 学习笔记

    目录 <JavaScript DOM 编程艺术> 学习笔记 第一章 js简史 第二章 js语法 准备工作 语法 第三章 DOM DOM中的D DOM中的O DOM中的M 第四章 js图片库 ...

  7. thinkphp学习笔记6—url模式

    原文:thinkphp学习笔记6-url模式 入口文件是应用的唯一入口,因为可以多入口,每个应用可以对应一个入口文件,系统会从rul参数中解析当前请求的模块,控制器,操作.ThinkPHP是区分大小写 ...

  8. JavaScript闭包(Closure)学习笔记

    闭包(closure)是JavaScript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 下面就是我的学习笔记,对于JavaScript初学者应该是很有用的. 一.变量的作用域 要理解 ...

  9. 设计模式学习笔记--备忘录(Mamento)模式

    写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方式,这就是软件模式:每个模式描写叙述了一个在我们程序设计中常常发生的问题,以及该问题的解决方式:当我们碰到模 ...

随机推荐

  1. 微信小程序云开发之云函数的创建与环境配置

    云函数的使用与环境配置: 1.创建云函数 右键cloudfunctions文件选择新建Node.js云函数,云函数命名为updateVoice用于修改用户语音数量. 2.安装node.js及npm: ...

  2. chmod 详解

    http://man.linuxde.net/chmod chmod u+x,g+w f01 //为文件f01设置自己可以执行,组员可以写入的权限 chmod u=rwx,g=rw,o=r f01 c ...

  3. LVS 负载均衡器总结

    下面部分原理部分,是从网上摘录,源网址已经无从获取,我将其中一小部分模糊的说明加入了一些自己的理解,仅最大可能让全文容易阅读,也方便自己以后参考,若你是大牛希望能给我一些宝贵的建议,将理解有误的地方加 ...

  4. python_argparse

    使用python argparser处理命令行参数 #coding:utf-8 # 导入模块 import argparse # 创建ArgumentParser()对象 parser = argpa ...

  5. [ZPG TEST 114] 括号匹配【树分治 点分治 括号序列】

    1.      括号匹配   有一棵树,每个节点上都有一个括号(左括号或者右括号).有多少个有序点对(u, v)从u到v的路径上的节点构成的字符串是一个合法的括号匹配?(我们称这样的点对是合法的) 输 ...

  6. UVa12304(计算几何中圆的基本操作)

    断断续续写了250多行的模拟,其间被其他事情打扰,总共花了一天才AC吧~ 这道题目再次让我明白,有些事情看起来很难,实际上并没有我们想象中的那么难.当然了我主要指的不是这个题的难度…… 也是初学计算几 ...

  7. 从navicat for mysql导出数据库语句时应该加上的两条语句

    为了不引起编码问题,一般在从navict for mysql导出一个数据库时在文件最前面添加这2句语句: CREATE DATABASE IF NOT EXISTS `` default charac ...

  8. eShopOnContainers 是一个基于微服务的.NET Core示例框架

    找到一个好的示例框架很难,但不是不可能.大多数是小型Todo风格的应用程序,通常基于SimpleCRUD.值得庆幸的是,Microsoft已经为eShopOnContainers创建了一个基于微服务的 ...

  9. Xenu使用随记

    经试验发现,如果配置了host进行网站检测时,Xenu和浏览器一样,都需要配置了host之后,重新打开Xenu程序(浏览器),host的配置才能生效.

  10. 关于JavaDate数据返回到前端变数字的问题(并引申到前后端时间的传输)

    不知道为什么,前端显示的所有数据项都没有错,就只有时间那一项很奇怪,是一串数字,而且这个数字在数据库怎么都找不到…… 然后我在后端从service到controller都debug了一遍,发现数据都没 ...