装饰器和jQuery

优质
小牛编辑
145浏览
2023-12-01

同我们所涵盖的其它模式一起,也有许多装饰器模式的示例能够使用jQuery来实现。jQuery.extend()允许我们将两个或者更多个对象(以及它们的属性)扩展(或者混合)到一个对象中,不论是在运行时或者动态的在一个稍后的时点上。

在这一场景中,目标对象没必要打断或者重载源/超类中现有的方法(尽管这可以被做到)就能够使用新的功能装饰起来。

在接下来的示例中,我们定义了三个对象:默认、选项和设置。任务的目标是用在选项中找到的附加功能来装饰默认对象。

  • 将“默认”放置在一个不可触及的状态之中,在这里我们不会失去访问稍后会在其中发现的属性和方法的能力
  • 赢得了使用在“选项”中找到被装饰起来的属性和函数的能力。
var decoratorApp = decoratorApp || {};
// define the objects we're going to use
decoratorApp = {
	defaults: {
		validate: false,
		limit: ,
		name: "foo",
		welcome: function () {
			console.log( "welcome!" );
		}
	},
	options: {
		validate: true,
		name: "bar",
		helloWorld: function () {
			console.log( "hello world" );
		}
	},
	settings: {},
	printObj: function ( obj ) {
		var arr = [],
		next;
		$.each( obj, function ( key, val ) {
			next = key + ": ";
			next += $.isPlainObject(val) ? printObj( val ) : val;
			arr.push( next );
		} );
		return "{ " + arr.join(", ") + " }";
	}
};
// merge defaults and options, without modifying defaults explicitly
decoratorApp.settings = $.extend({}, decoratorApp.defaults, decoratorApp.options);
// what we have done here is decorated defaults in a way that provides
// access to the properties and functionality it has to offer (as well as
// that of the decorator "options"). defaults itself is left unchanged
$("#log")
.append( decoratorApp.printObj(decoratorApp.settings) + decoratorApp.printObj(decoratorApp.options) + decoratorApp.printObj(decoratorApp.defaults));
// settings -- { validate: true, limit: , name: bar, welcome: function (){ console.log( "welcome!" ); },
// helloWorld: function (){ console.log("hello!"); } }
// options -- { validate: true, name: bar, helloWorld: function (){ console.log("hello!"); } }
// defaults -- { validate: false, limit: , name: foo, welcome: function (){ console.log("welcome!"); } }

优点 & 缺点

因为它可以被透明的使用,并且也相当的灵活,因此开发者都挺乐意去使用这个模式——如我们所见,对象可以用新的行为封装或者“装饰”起来,而后继续使用,并不用去担心基础的对象被改变。在一个更加广泛的范围内,这一模式也避免了我们去依赖大量子类来实现同样的效果。

然而在实现这个模式时,也存在我们应该意识到的缺点。如果穷于管理,它也会由于引入了许多微小但是相似的对象到我们的命名空间中,从而显著的使得我们的应用程序架构变得复杂起来。这里所担忧的是,除了渐渐变得难于管理,其他不能熟练使用这个模式的开发者也可能会有一段要掌握它被使用的理由的艰难时期。

足够的注释或者对模式的研究,对此应该有助益,而只要我们对在我们的应程序中的多大范围内使用这一模式有所掌控的话,我们就能让两方面都得到改善。