动态表单构建器——建造者模式

在编写一个弹出框时,它可以包含确定按钮,取消按钮,标题栏,关闭按钮,最小化按钮,内容,最大化按钮等内容,但这些内容在不同的需求下又不是必须存在的,不同的需求需要对这些组件自由组合,显然每次组合都要重复编码。将这些不同的,容易变动的组件分离开来,通过一个Builder类一步一步的构造复杂的对象,这就是建造者模式。

下面的例子是通过设计一个表单构造器来演示建造者模式。现在流行的Hybrid App的开发网络请求基本都是通过Ajax实现,设想一下如果应用要求根据不同的用户角色来提交不同的表单,那么我们就需要一个动态生成表单。我们可以将不同的表单控件封装成控件类,然后通过Builder类将不同的空间按照要求进行组合,形成需要的表单。

类实现代码:

var FormControl = Class.extend({
	ctor:function(_label,_name,_id,_type){
		this.label = _label;
		this.name = _name;
		this.id = _id;
		this.type = _type;
	},
	toString:function(){
		return this.label + "<input type = ‘" + this.type + "‘ id = ‘" + this.id + "‘ name = ‘" + this.name + "‘/>";
	}
});

var Button = FormControl.extend({
	ctor:function(_label,_name,_id,_callback){
		this._super(_label,_name,_id,"button");
		this.callback = _callback;
	},
	toString:function(){
		return "<input  value = ‘" + this.label + "‘ type = ‘" + this.type + "‘ id = ‘" + this.id + "‘ name = ‘" + this.name + "‘ onclick = ‘" + this.callback + "()‘/>"
	}
});

var Input = FormControl.extend({
});

var TextArea = FormControl.extend({
	toString:function(){
		return  this.label + "<textarea name = ‘" + this.name +"‘ id = ‘" + this.id + "‘ />";
	}
});

var Select = FormControl.extend({
	ctor:function(_label,_name,_id,_type,_options){
		this._super(_label,_name,_id,_type);
		this.options = _options;
	},
	toString:function(){
		var txt = "";
		for(var i = 0;i < this.options.length;i++){
			txt += "<option value = ‘" + this.options[i].value + "‘>" + this.options[i].text + "</option>";
		}
		return this.label + "<select name = ‘" + this.name + "‘ id = ‘" + this.id + "‘>" + txt + "</select>";
	}
});

var FormBuilder = Class.extend({
	controls:[],
	ctor:function(_id,_controls = []){
		this.id = _id;
		this.controls = _controls;
	},
	addControl:function(_control){
		this.controls.push(_control);
		return this;
	},
	build:function(){
		var form = document.getElementById(this.id);
		var form_txt = "";
		for(var i = 0;i < this.controls.length;i++){
			form_txt += this.controls[i].toString();
		}
		form.innerHTML = form_txt;
	}
});

应用代码

<html>
	<head>
		<meta charset = "gbk"></meta>
		<script src = "Class.js"></script>
		<script src = "Form.js"></script>

	</head>
	<body>
		<form id = "form1" action = "#" method = "post">

		</form>

	</body>
	<script>
		(function(){
			var name = new Input("姓名","username","username","text");
			var password = new Input("密码","password","password","password");
			var submit = new Button("提交","sub","sub",function(){alert("提交");});
			var form  = new Form("form1",[]);
			form.addControl(name).addControl(password).addControl(submit).build();

		})();
	</script>
</html>

效果:

其他说明:

可以将建造者模式和工厂模式组合,将组件的生产委托给工厂模式,建造由建造者模式完成。

建造者模式的优点:组件之间相对独立(上述例子由于样式布局可能实现偏差,在移动Web中表单往往是列表的呈现形式,所以也可以相对独立),易于扩展。

建造者模式的缺点:组件必须具有相似之处,复杂的应用可能需要过多的建造者。

时间: 2024-08-07 11:46:36

动态表单构建器——建造者模式的相关文章

Angular动态表单生成(二)

ng-dynamic-forms源码分析 在两个开源项目中,ng-dynamic-forms的源码相较于form.io,比较简单,所以我还勉强能看懂,下面就我自己的理解进行简单分析,若有不对的地方,请大家多多指正. 整体结构分析 ng-dynamic-forms的主要代码均分布在packages文件夹下,其中的Core是各种控件的抽象,其他的文件夹是各个UI框架的具体封装,每个文件夹都是一个可独立编译运行的项目. Core文件夹内容分析 Core文件夹做的事情,基本上是对于各种组件.布局的抽象,

动态表单数据库设计

需求: 能够根据数据库在界面动态显示表单,包括表单类型.名称等,并且必须提供 添加新表单,修改表单等功能. 为了满足客户不断的需求变化,有时候需要为某商品增加.修改.删除.属性,这样的话以往的数据库表就很难实现, 因为表的字段是定死了 如果你需要增加一个属性的时候 ,就必须修改表,听说这是不允许的~~. 所以我们要设计一个灵活的数据库 下面以电脑设备为例: pc 现有属性 name cpu ram disk 现在我们要为pc添加一个 mainboard 属性. 既然必须提供增加表单,那么我们创建

2017.2.28 activiti实战--第六章--任务表单(一)动态表单(待)

学习资料:<Activiti实战> 第六章 任务表单(一)动态表单 内容概览:本章要完成一个OA(协同办公系统)的请假流程的设计,从实用的角度,讲解如何将activiti与业务紧密相连. 第四章中讲解了两种表单:动态表单和外置表单的区别.这里将使用不同的表单来完成相同的功能. 1 动态表单:<activiti:formProperty> 2 外置表单:<activiti:formKey>

javaweb日记选(动态表单及表的实现)

Java语言也可以创建动态表单,如javaweb创建表单及表 应用场景 项目中往往需要动态的创建一个表单,或者添加一个新的数据模板,这时候因为需要在运行时动态的创建表以及动态的维护表字段甚至表关系 使得普通java解决方案变得困难重重. 实现工具 Hibernate + Spring + Groovy +Freemarker Hibernate 作用很简单负责创建数据库表这样可以避免我们自己去写复杂的sql和判断. Spring 作为桥梁起到连接纽带的作用 Groovy 做为动态语言,在项目运行

Knockout学习之表单绑定器(上)

表单绑定器 “click”绑定 Click 绑定器可以将javascript函数绑定到指定的dom元素,并且再该元素被点击时将触发绑定的函数,大多数情况下都会使用button.input和a元素,当然其他可见的dom元素也是一样可以的.下面我们就简单的举一个例子: 1 <div> 2 你已经点击了<span data-bind="text:numberOfClicks" ></span> 3 <button data-bind="cl

Knockout学习之表单绑定器(下)

“hasFocus”绑定 hasFocus绑定器会将DOM元素的焦点状态与视图模型中的属性相关联,当你设置视图模型中关联的属性为true或false后,将能够设置关键的DOM元素是否获得焦点. 比如下面的例子将会演示如何使用通过代码设置焦点,并且当关联的标签获得焦点后显示一段文本: 1 <div> 2 <input type="text" data-bind="hasfocus: focusState" /> 3 <button typ

JavaScript 之表单验证(表单验证器的封装)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html>     <head>         <meta http-equiv="Content-Type" content="text/html; charset=gbk"/>        

动态表单

毕业后,一直断断续续地在做这个,腻了! 从傻瓜式的字段定义: 到可视化设计: 页面效果还是一个样--丑: 可是这工具的用户,一直是我,ONLY ME! 动态表单

动态表单设计

公司前辈要我做一个动态表单数据库设计,思维愚钝,无法下手.后来前辈帮我把表结构画出来了,才茅塞顿开 现在和大家分享一下. 需求: 能够根据数据库在界面动态显示表单,包括表单类型.名称等,并且必须提供 添加新表单,修改表单等功能. 为了满足客户不断的需求变化,有时候需要为某商品增加.修改.删除.属性,这样的话以往的数据库表就很难实现, 因为表的字段是定死了 如果你需要增加一个属性的时候 ,就必须修改表,听说这是不允许的~~. 所以我们要设计一个灵活的数据库 下面以电脑设备为例: pc 现有属性 n