存档

2010年4月 的存档

JavaScript 面向对象编程(1)– 基础

2010年4月29日 没有评论

自从有了Ajax这个概念,JavaScript作为Ajax的利器,其作用一路飙升。JavaScript最基本的使用,以及语法、浏览器对象等等东东在这里就不累赘了。把主要篇幅放在如何实现JavaScript的面向对象编程方面。

1. 用JavaScript实现类

JavaScritpt没有专门的机制实现类,这里是借助它的函数允许嵌套的机制来实现类的。一个函数可以包含变量,又可以包含其它函数,这样,变量可以作为属性,内部的函数就可以作为成员方法了。因此外层函数本身就可以作为一个类了。如下:
[js]
function myClass()
{
//此处相当于构造函数
}
[/js]
这里 myClass就是一个类。其实可以把它看成类的构造函数。至于非构造函数的部分,以后会详细描述。
阅读全文…

分类: javascript 标签:

php设计模式 – 命令链模式

2010年4月27日 没有评论

前面我们介绍了设计模式在php编程中的一些应用: 使用接口实现松散耦合观察者模式

这篇文章我们来介绍一下另外一个设计模式命令链模式, 与观察者模式一样,使用命令链模式可以是php各组件之间避免紧密耦合。

chain
命令链 模式以松散耦合主题为基础,发送消息、命令和请求,或通过一组处理程序发送任意内容。每个处理程序都会自行判断自己能否处理请求。如果可以,该请求被处理,进程停止。您可以为系统添加或移除处理程序,而不影响其他处理程序。下面的代码显示了此模式的一个示例。
阅读全文…

php面向对象编程 – 观察者模式

2010年4月27日 没有评论

observer
这篇文章介绍一下设计模式中的观察者模式。 观察者模式应用到php面向对象编程中,可以避免组件之间紧密耦合。另外的关于如何避免组件之间机密耦合的方法,可以参考php面向对象编程 – 使用接口实现松散耦合这篇文章。

观察者模式非常简单:一个对象通过添加一个方法(该方法允许另一个对象,即观察者 注册自己)使本身变得可观察。当可观察的对象更改时,它会将消息发送到已注册的观察者。这些观察者使用该信息执行的操作与可观察的对象无关。结果是对象可以相互对话,而不必了解原因。
阅读全文…

php面向对象编程 – 使用接口实现松散耦合

2010年4月26日 没有评论

先来看一个紧密耦合的例子:
[php]
<?php

require_once "./AddressFormatters.php";

class Address
{
private $addressLine1;
private $addressLine2;
private $city;
private $state; // or province…
private $postalCode;
private $country;

public function setAddressLine1($line1)
{
$this->addressLine1 = $line1;
}

/* accessors, etc… */

public function getCountry()
{
return $this->country;
}

public function format($type)
{
if ($type == "inline") {
$formatter = new InlineAddressFormatter();
} else if ($type == "multiline") {
$formatter = new MultilineAddressFormatter();
} else {
$formatter = new NullAddressFormatter();
}
return $formatter->format($this->getAddressLine1(),
$this->getAddressLine2(),
$this->getCity(), $this->getState(), $this->getPostalCode(),
$this->getCountry());
}
}

$addr = new Address();
$addr->setAddressLine1("123 Any St.");
$addr->setAddressLine2("Ste 200");
$addr->setCity("Anytown");
$addr->setState("AY");
$addr->setPostalCode("55555-0000");
$addr->setCountry("US");

echo($addr->format("multiline"));
echo("\n");

echo($addr->format("inline"));
echo("\n");

?>
[/php]
在 Address 对象上调用 format() 方法的代码可能看上去很棒 — 这段代码所做的是使用 Address 类,调用 format() 并完成。相反,Address 类就没那么幸运。它需要了解用于正确格式化的各种格式化方法,这可能使 Address 对象无法被其他人很好地重用,尤其是在其他人没有兴趣在 format() 方法中使用格式化方法类的情况下。虽然使用 Address 的代码没有许多依赖关系,但是 Address 类却有大量代码,而它可能只是一个简单的数据对象。

在构建优秀的 OO 设计时,必须考虑称为关注点分离(Separation of Concerns,SoC)的概念。SoC 指尝试通过真正关注的内容分离对象,从而降低耦合度。在最初的 Address 类中,它必须关注如何进行格式化。这可能不是优秀的设计。然而,Address 类应当考虑 Address 的各部分,而某种格式化方法应当关注如何正确格式化地址。
看一下如何通过使用接口来实现松散耦合:
[php]
<?php

interface AddressFormatter
{
public function format($addressLine1, $addressLine2, $city, $state,
$postalCode, $country);
}

class MultiLineAddressFormatter implements AddressFormatter
{
public function format($addressLine1, $addressLine2, $city, $state,
$postalCode, $country)
{
return sprintf("%s\n%s\n%s, %s %s\n%s",
$addressLine1, $addressLine2, $city, $state, $postalCode, $country);
}
}

class InlineAddressFormatter implements AddressFormatter
{
public function format($addressLine1, $addressLine2, $city, $state,
$postalCode, $country)
{
return sprintf("%s %s, %s, %s %s %s",
$addressLine1, $addressLine2, $city, $state, $postalCode, $country);
}
}

class AddressFormatUtils
{
public static function formatAddress($type, $address)
{
$formatter = AddressFormatUtils::createAddressFormatter($type);

return $formatter->format($address->getAddressLine1(),
$address->getAddressLine2(),
$address->getCity(), $address->getState(),
$address->getPostalCode(),
$address->getCountry());
}

private static function createAddressFormatter($type)
{
if ($type == "inline") {
$formatter = new InlineAddressFormatter();
} else if ($type == "multiline") {
$formatter = new MultilineAddressFormatter();
} else {
$formatter = new NullAddressFormatter();
}
return $formatter;
}
}

$addr = new Address();
$addr->setAddressLine1("123 Any St.");
$addr->setAddressLine2("Ste 200");
$addr->setCity("Anytown");
$addr->setState("AY");
$addr->setPostalCode("55555-0000");
$addr->setCountry("US");

echo(AddressFormatUtils::formatAddress("multiline", $addr));
echo("\n");

echo(AddressFormatUtils::formatAddress("inline", $addr));
echo("\n");
?>

[/php]

在上面的代码中,省略了address的部分代码。关键部分展示了:格式化地址的代码被移到接口、实现类和工厂中 — 养成 “使用接口” 的习惯。现在,AddressFormatUtils 类负责创建格式化方法并格式化 Address。任何其他对象现在都可以使用 Address 而不必担心要求获得格式化方法的定义。

当然,缺点是只要使用模式,通常就意味着工件(类、文件)的数量会增加。但是,通过减少每个类中的维护可以弥补这个缺点,甚至在获得正确的可重用性时反而可以减少工件量。

如果你想对php面向对象编程中接口的使用方法进一步了解的话,可以参考一下这篇文章:php接口学习 —— php面向对象编程

作者: 石巍
原载: 在 PHP 中养成 7 个面向对象的好习惯
版权所有,转载时必须以超链接形式注明作者和原始出处及本声明。

本文链接: http://www.smartwei.com/php-separation-of-concerns.html

强大的jQuery选择器

2010年4月2日 没有评论

用过jquery的朋友肯定会发现,jquery的选择器非常强大,在html页面进行DOM操作时,很容易的就能娶到我们要的元素。现在给大家展示一下jquery都提供了那些选择器:
阅读全文…

分类: javascript 标签: ,

jQuery框架中$.each()函数的应用

2010年4月2日 1 条评论

最近在做中国教育在线的培训机构项目,开发工作中需要做一个开课时间表, 效果图如下所示:

js-schedule

如果直接写html代码,麻烦是麻烦点,但是这个表单很好实现。这两天在看jquery的相关知识,发现其中的$.each()这个函数功能十分强大,这里先对$.each()函数做个简单介绍,然后在给大家看一下,我是如何用$.each()这个函数实现上面这个表单的。

可以代替for循环的$.each()

$.each()函数封装了十分强大的遍历功能,它可以遍历一维数组、多维数组、DOM, JSON 等等,在javascript开发过程中使用$each可以大大的减轻我们的工作量。下面看几个例子:

[js]
var arr1 = [ &quot;one&quot;, &quot;two&quot;, &quot;three&quot;, &quot;four&quot;, &quot;five&quot; ];
$.each(arr1, function(){
alert(this);
});
//输出:one two three four five

var arr2 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
$.each(arr2, function(i, item){
alert(item[0]);
});
//输出:1 4 7

var obj = { one:1, two:2, three:3, four:4, five:5 };
$.each(obj, function(key, val) {
alert(obj[key]);
});
//输出:1 2 3 4 5

[/js]

使用$.each()实现前面提到的表单

[js]
//引入jquery,根据你的jquery文件的不同路径,做出相应的替换,
&lt;script type=&quot;text/javascript&quot; src=&quot;/js/jquery-1.3.min.js&quot;&gt;&lt;/script&gt;

var weekday = ['','周一','周二','周三','周四','周五','周六','周日'];

var day = ['','上午','下午','晚上'];

var table = document.createElement(‘table’);

$(table).attr({ width:&quot;400&quot;, border:&quot;0&quot;, cellpadding:&quot;0&quot;, cellspacing:&quot;1&quot;, bgcolor:&quot;#CCCCCC&quot;});
$.each(day, function(key, val) {
var row = table.insertRow(key);
if(key == 0) {
$.each(weekday, function(m, n) { n = n || ‘&amp;nbsp;’; $(row.insertCell(m)).html(n); });
}
else {
$.each(weekday, function(m, n) { n = !n?day[key]:’&lt;input type=&quot;checkbox&quot; name=&quot;classtime[]&quot; /&gt;’; $(row.insertCell(m)).html(n); });
}
});

//在id=calendarDiv的那个DIV中嵌入上面的代码
$(‘#calendarDiv’).append(table);

[/js]
效果如下所示:


作者: 石巍
原载: 10V
版权所有,转载时必须以超链接形式注明作者和原始出处及本声明。

本文链接: http://www.smartwei.com/jquery-each-function.html

分类: javascript 标签: ,