﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Franky's LIFE-文章分类-IT知识</title><link>http://www.blogjava.net/franky/category/14854.html</link><description>Anything... ...</description><language>zh-cn</language><lastBuildDate>Fri, 30 Jul 2010 04:52:22 GMT</lastBuildDate><pubDate>Fri, 30 Jul 2010 04:52:22 GMT</pubDate><ttl>60</ttl><item><title>计算机世界：“狗日的”腾讯 搅局者还是终结者</title><link>http://www.blogjava.net/franky/articles/327059.html</link><dc:creator>Franky</dc:creator><author>Franky</author><pubDate>Sat, 24 Jul 2010 23:03:00 GMT</pubDate><guid>http://www.blogjava.net/franky/articles/327059.html</guid><wfw:comment>http://www.blogjava.net/franky/comments/327059.html</wfw:comment><comments>http://www.blogjava.net/franky/articles/327059.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/franky/comments/commentRss/327059.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/franky/services/trackbacks/327059.html</trackback:ping><description><![CDATA[<h1 id="artibodyTitle" pid="2" tid="1" did="4467150" fid="2108" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 1px; border-left-width: 0px; border-style: initial; border-color: initial; font-weight: normal; height: 35px; line-height: 35px; overflow-x: hidden; overflow-y: hidden; text-align: center; font-family: 黑体; font-size: 20px; color: #03005c; border-bottom-color: #c8d8f2; border-bottom-style: solid; ">计算机世界：&#8220;狗日的&#8221;腾讯 搅局者还是终结者</h1>
<div class="artInfo" style="font-family: Arial, Helvetica, sans-serif; line-height: 14px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 10px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; font-size: 12px; overflow-x: hidden; overflow-y: hidden; text-align: center; "><span id="art_source" style="font-family: 宋体, Verdana, Arial, Helvetica, sans-serif; line-height: 1.5; "><a href="http://www.sina.com.cn/" style="color: #000000; text-decoration: none; ">http://www.sina.com.cn</a></span>&nbsp;&nbsp;<span id="pub_date" style="font-family: 宋体, Verdana, Arial, Helvetica, sans-serif; line-height: 1.5; ">2010年07月24日&nbsp;20:43</span>&nbsp;&nbsp;<span id="media_name" style="font-family: 宋体, Verdana, Arial, Helvetica, sans-serif; line-height: 1.5; color: #cc0000; "><a href="http://www.ccw.com.cn/" target="_blank" style="color: #cc0000; text-decoration: none; ">计算机世界</a></span></div>
<div class="blkContainerSblkCon" id="artibody" style="font-family: 宋体, Verdana, Arial, Helvetica, sans-serif; line-height: 23px; margin-top: 15px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; font-size: 14px; "><center style="font-size: 12px; "><center style="font-size: 12px; "></center></center>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　记者&nbsp;&nbsp;许磊</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　&#8220;有什么业务是腾讯不做的吗？&#8221;美团网CEO王兴的语气中难掩郁闷。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　7月9日，腾讯QQ团购网上线，这让王兴如闻惊雷，也如坐针毡。从2003年回国到现在，王兴先后创办了校内、海内、饭否和美团4个网站，而美团网被他视为&#8220;最靠谱&#8221;的一次创业。3月初上线的美团网是国内第一家团购网站，创立仅仅4个月，美团网已经能够盈亏平衡。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　就在这时候，一直悄无声息的腾讯杀了进来，这让王兴完全猝不及防，也让处于草创时期的数百家团购网站倒吸了一口凉气。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　谁也不知道，这一次，这个&#8220;企鹅仔&#8221;将是搅局者、掠食者，还是终结者。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　<strong>&#8220;狗日的&#8221;腾讯</strong></p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　别上腾讯盯上其实，王兴应该早就想到会有这么一天。因为在中国互联网发展历史上，腾讯几乎没有缺席过任何一场互联网盛宴。它总是在一开始就亦步亦趋地跟随、然后细致地模仿，然后决绝地超越。比如当初的游戏。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　&#8220;从QQ游戏平台上线那天起，联众的失败就已经注定了。&#8221;多年以后，在北京知春路的一家咖啡馆，联众创始人鲍岳桥谈起当年腾讯对联众的围剿和逼迫，仍然耿耿于怀。在两个小时的采访中，他连续抽了两包烟。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　联众是中国最早做游戏平台的公司，一度占有在线棋牌游戏市场85%以上的市场份额，在新浪、搜狐等门户网站亏损缠身的时候，联众是最早实现赢利的中国互联网企业，一时风光无两。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　2003年8月，腾讯QQ游戏第一个公开测试版本正式发布。鲍岳桥发现，从平台到游戏设计，QQ游戏完全是联众游戏的翻版。愤怒之余，&#8220;感到危险很大&#8221;的鲍岳桥首先想到的是&#8220;主动低头&#8221;寻求合作，于是他赶赴深圳，约见马化腾和时任腾讯公司首席运营官的曾李青，但是遭到了腾讯方面的拒绝。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　&#8220;现在想来，那时候是太天真了。&#8221;鲍岳桥说，&#8220;与大型网游不同，棋牌类游戏规则固定，没有技术门槛，玩家又与QQ用户高度重合，腾讯很容易模仿。&#8221;</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　2004年9月，QQ游戏平台将联众赶下了中国第一休闲游戏门户的宝座。而在此之后，联众的业绩一路下滑，出售、转型，经历了一系列风波后，联众在中国网络游戏市场份额已不足1%。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　腾讯则扶摇直上，在今年一季度，QQ游戏同时在线人数达到了680万。而更重要的是，依托QQ游戏平台，腾讯终于在2009年第二季度超越盛大，坐上了中国网络游戏领域的头把交椅。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　对鲍岳桥来说，腾讯就是自己的终结者。2006年底，鲍岳桥离开了江河日下的联众，成为了一名天使投资人。他告诉记者，现在他做投资的原则之一就是：只做腾讯不会做、不能做的项目。所以三年来，他绝对不碰游戏，已经投资的医疗器械和数据存储项目都跟腾讯毫无关联。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　而这个终结者又有了新的目标，那就是&#8220;站长之王&#8221;蔡文胜的4399小游戏平台。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　&#8220;说不担心QQ竞争那是骗人的。&#8221;蔡文胜在微博上表达了自己的忧虑，直接原因就是今年7月初，腾讯旗下小游戏平台3366.com上线公测。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　据记者调查，去年蔡文胜买下的4399小游戏平台，通过广告联盟和联合运营网页游戏，月营收已达3000~5000万元，正在筹备国内A股上市。而腾讯刚刚上线的3366，在游戏种类和网站设计上与4399几无二致。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　而且这只&#8220;企鹅仔&#8221;似乎更加来势汹汹。从7月1日开始，不断有网友看到QQ弹窗对这一游戏平台的推广信息，而截止记者发稿时，3366.com同时在线人数已突破10万。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　只要是一个领域前景看好，腾讯就肯定会伺机充当掠食者。除了王兴和蔡文胜，腾讯最近还&#8220;默默地&#8221;动了另外一个人的奶酪，他就是奇虎360董事长周鸿祎。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　5月31日，杀毒领域两大巨头360与金山的一场口水战激战正酣，腾讯的QQ医生3.3升级版却悄然上线。很快人们就发现，这款原本只是用来查杀QQ盗号木马的防护软件，已经了包含云查杀木马、系统漏洞修补、实时防护、清理插件等多项安全防护功能，甚至还搭载了免费半年的诺顿杀毒。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　此前，周鸿祎曾在多个公开场合对腾讯创始人马化腾在产品上的功力赞不绝口，同时还声称，腾讯绝不会成为360的竞争对手，因为&#8220;腾讯是一个娱乐公司，在安全方面，应该由一个很专业的公司更专注地去解决问题&#8221;。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　很显然，马化腾毫不客气地给了周鸿祎当头一棒。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　在腾讯还没有出手的互联网领域，小企鹅那些潜在的竞争对手们仍是战战兢兢，如履薄冰。比如暴风影音CEO冯鑫。自从2008年9月腾讯发布了本地播放软件QQ影音首个Beta版本，冯鑫恐怕就没睡过一天好觉。因为这款无广告、无插件播放软件，让暴风影音的盈利模式变得岌岌可危。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　而在各大视频网站因为版权打得不可开交，频频对簿公堂之时，同样有一种声音在业内流传：无论你们现在打得多欢实，等市场培育得差不多了，就该轮到腾讯来收场了。事实确实如此，QQLive的平台早就搭好了，拼版权，中国的互联网公司谁敢说自己比腾讯更有钱？</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　这就是腾讯，中国第一、全球第三大互联网公司，一家全球罕见的互联网全业务公司，即时通讯、门户、游戏、电子商务、搜索等等无所不做。它总是默默地布局、悄无声息地出现在你的背后；它总是在最恰当的时候出来搅局，让同业者心神不定。而一旦时机成熟，它就会毫不留情地划走自己的那块蛋糕，有时它甚至会成为终结者，霸占整个市场。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　&#8220;某网站贪得无厌，没有它不染指的领域，没有它不想做的产品，这样下去物极必反，与全网为敌，必将死无葬身之地。&#8221;6月29日，新浪网总编陈彤以&#8220;老沉&#8221;为名发布了一则微博，言辞之激烈，让人震惊。这条微博迅速被转发了500多次，无数的人力挺&#8220;老沉&#8221;。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　谈起此事，一位互联网创业者几乎是脱口而出，&#8220;狗日的腾讯！&#8221;</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　<strong>腾讯，非草根创业样本</strong></p>
<p class="newtext" align="center" style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; "><a href="http://imgs.ccw.com.cn/resources/2010_07/2010_07_24/201007241791279955930287_origin.jpg" target="_blank" style="color: #000099; text-decoration: none; "><img alt="计算机世界：&#8220;狗日的&#8221;腾讯搅局者还是终结者" src="http://i1.sinaimg.cn/IT/cr/2010/0724/2591006303.jpg" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; border-top-color: #000000; border-right-color: #000000; border-bottom-color: #000000; border-left-color: #000000; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; " /></a><br style="font-family: 宋体, Verdana, Arial, Helvetica, sans-serif; line-height: 1.5; " />
<span style="font-family: 宋体, Verdana, Arial, Helvetica, sans-serif; line-height: 1.5; font-size: 12px; ">马化腾(左)李彦宏(右)</span></p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　始终&#8220;贪得无厌&#8221;</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">&nbsp;&nbsp;&nbsp; &#8220;既没有马云那么好的口才，也没有李彦宏那么帅。&#8221;马化腾曾经多次自嘲，说自己&#8220;很不幸&#8221;，&#8220;大家都是圈地，他们(马云、李彦宏)圈的都是楼，可以直接住。我们圈到的却是荒地，只能从铲沙、挖土开始，建自己的楼。&#8221;</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　实际上，马化腾算不上纯粹的&#8220;草根创业&#8221;。据传，在腾讯创立初期，其父马陈术曾开着奔驰前来给儿子做账。在11年的发展历史上，腾讯只是在早期遭遇过资金困局，从获得第一笔融资开始就一直是稳扎稳打，先利用无线增值服务实现盈利，转而依靠互联网增值服务壮大，布局网络游戏和门户业务。2010年最新一季财报显示，腾讯的网络广告业务收入为2990万美元，已经远远超过网易的1340万美元，稳居门户第三。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　马化腾在业界以低调、务实著称，这在一定程度上决定了腾讯的企业风格：其疾如风，其徐如林，侵掠如火，不动如山。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　2006年7月，QQ同时在线突破2000万人，腾讯公司内部决定办一个庆功会，会上腾讯联席CTO熊明华问了马化腾一个问题：QQ同时在线人数何时能够到1亿？马化腾一笑：&#8220;这辈子我可能看不到了。&#8221;事实上，2010年3月5日，他就看到了。熊明华一定很后悔，没有和马化腾打赌&#8220;裸奔&#8221;。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　实际上，马化腾有很多值得&#8220;裸奔式&#8221;庆祝的理由。目前，腾讯是中国最赚钱的互联网公司，公司现金储备达到15亿美元；拥有中国本土用户量最大的即时通讯软件，账户数近10亿；是中国第一流量的门户；在网络游戏市场排名第一，占据超过20%以上的市场份额；电子邮箱流量也已经超过网易，雄踞榜首。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　资本市场对这只彪悍的企鹅也是极力追捧。在香港，腾讯的股价一度高达每股171.80港元，上市6年间腾讯股价上涨了超过了35倍。要知道，被世界公认为近年来最具创新能力的苹果，其股价增幅才只有腾讯的一半。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　<strong>一只企鹅为何如此贪婪？</strong></p>
<p class="newtext" align="center" style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; "><a href="http://imgs.ccw.com.cn/resources/2010_07/2010_07_24/201007241821279955996880_origin.jpg" target="_blank" style="color: #000099; text-decoration: none; "><img alt="计算机世界：&#8220;狗日的&#8221;腾讯搅局者还是终结者" src="http://i2.sinaimg.cn/IT/cr/2010/0724/2179038776.jpg" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; border-top-color: #000000; border-right-color: #000000; border-bottom-color: #000000; border-left-color: #000000; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; " /></a><br style="font-family: 宋体, Verdana, Arial, Helvetica, sans-serif; line-height: 1.5; " />
<span style="font-family: 宋体, Verdana, Arial, Helvetica, sans-serif; line-height: 1.5; font-size: 12px; ">左起：丁磊、马化腾、张朝阳、李彦宏</span></p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　腾讯为什么还不满足？一只企鹅为何如此贪婪？</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　是的，&nbsp;&#8220;腾讯不是一般的有钱&#8221;，但股东的钱不是用来供着的，腾讯必须不断寻找新的利润增长点。蔡文胜就曾表示，腾讯现在什么都想做，从中可以看出它面对快速增长的巨大压力，这个压力终有一天会压垮腾讯。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　在美团网创始人王兴看来，腾讯之所以染指团购，是因为这模式已经被证明&#8220;能赚钱&#8221;。&#8220;做团购没有技术门槛，盈利模式又清晰，腾讯没有理由不做。&#8221;王兴指出，团购与他之前创办的校内和饭否最大的不同在于，&#8220;网站从上线第一天开始就有收入&#8221;。——如此唾手可得的生意，腾讯怎么可能放过？</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　搜索也将是腾讯的下一个目标。今年3月，马化腾与李彦宏在深圳有过一场对话。李彦宏问马化腾，&#8220;腾讯凭什么做搜索？&#8221;马化腾给出了两点理由：一是用户需要，腾讯这个一站式互联网服务平台中的很多环节都需要搜索功能；二是搜索能赚钱，腾讯拥有全球最大互联网社交网络系统，社区的盈利模式中，除了个人收费以外，未来还要结合页面内容分析，匹配相关性的广告。因此，已有业内人士指出，而在这一类似于Google的AdWords模式的探索过程中，腾讯未来必将对百度正在培育的广告联盟形成威胁。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　也许，在马化腾看来，无论是搜索，还是团购，甚至是将来的视频，这些业务都是腾讯水到渠成的业务延伸。因为马化腾为腾讯未来的构想是，一站式互联网服务提供商。——围绕腾讯QQ打造&#8220;在线生活社区&#8221;，也就是&#8220;用户要什么，腾讯就有什么&#8221;。百度董事局主席兼CEO李彦宏对腾讯所谓的&#8220;在线生活&#8221;、&#8220;一站式服务&#8221;的评价是：基本上就是不给别人任何空间。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　在CSDN总裁蒋涛看来，腾讯之所以什么都做，是因为它是一家以人(用户)为中心的企业，同类型的企业还有软件巨头微软，两家公司的产品战略更是惊人的相似。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　长期以来，以操作系统为核心的微软也是个典型的&#8220;全民公敌&#8221;。为了&#8220;抓住&#8221;用户，微软每个阶段都会根据市场变化，布局新的应用，以巩固其用户终端的垄断地位。在个人消费领域上，微软先后推出了浏览器IE、邮件系统Hotmail、即时通讯MSN、邮件客户端outlook、免费杀毒软件MSE，以及今年5月刚刚发布的在线版Office软件。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　而从另一方面讲，腾讯的进攻也是一种防御。互联网产业往往形势突变，Google市值超越雅虎，Facebook流量超越Google都发生在旦夕之间。腾讯最怕的就是突然冒出一个企业，被一种意想不到的商业模式或竞争策略打败。所以腾讯对于任何一个互联网的新应用都不敢掉以轻心。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　&#8220;360安全卫士、暴风影音的装机量都已经上亿了，如果周鸿祎或者冯鑫有一天跟新浪合作，也推新闻弹出框，马化腾不就郁闷了？&#8221;蒋涛认为，腾讯的产品策略之一就是：所有的互联网应用，只要用户量到了一定级别，腾讯一定要有，别人的产品可以暂时比腾讯做得好，但腾讯绝不会让它不可替代。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　当被问及腾讯的核心竞争力时，腾讯CTO熊明华给记者的答案不是超过10亿的QQ的注册用户，也不是某一项产品、技术方面优势，而是&#8220;耐心&#8221;：懂得在合适的时间推出合适的产品。&#8221;</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　因此，究竟腾讯还会做什么，没有人知道。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　<strong>&#8220;山寨&#8221;的腾讯</strong></p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　一直在模仿</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">&nbsp;&nbsp;&nbsp; 腾讯从来不做第一个吃螃蟹的人，却总能在成熟的市场中找到空间，横插一杠子。然而它选择的路径也使其饱受争议，那就是模仿，有时甚至是肆无忌惮地&#8220;山寨&#8221;。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　早在2006年，新浪网创始人王志东就公开指责马化腾是业内有名的&#8220;抄袭大王&#8221;，而且是明目张胆地抄袭。几年以来，类似的声音一直不绝于耳。直到最近，DCCI互联网数据中心主任胡延平还在质疑腾讯的创新能力，说它不仅不是卓越创新者，反倒是中小互联网企业的&#8220;创新天敌&#8221;。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　从模仿ICQ推出自己的第一款产品OICQ(腾讯QQ的前身)开始，腾讯似乎就埋下了自己的&#8220;模仿基因&#8221;——先是从韩国引入了QQ秀和其他一系列增值服务，又模仿新浪建起了门户网站；在网游领域，学联众开发平台，跟着盛大引进国外网友，随着网易自主研发，之后布局的C2C电子商务网站拍拍，以及第三方支付财付通，无一不是&#8220;山寨货&#8221;，这也是腾讯遭人恨的根本原因。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　&#8220;微博、杀毒、电子商务到今天的团购，这些领域的商业模式在那儿摆着，人人都在抄，你凭什么要求腾讯高抬贵手，不去挣这个钱了？&#8221;互联网资深人士谢文在接受记者采访时表示，业界这种对腾讯的埋怨，就像&#8220;小孩儿撒娇&#8221;，是五十步笑一百步。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　对于模仿的指责，马化腾的回应是：模仿是最稳妥的创新。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　&#8220;创新可以分为三个层次：技术创新、产品创新和应用创新，产品和应用层面的创新比较容易被人忽略。&#8221;一位资深互联网产品经理告诉记者，几乎腾讯的每款产品都能找出市场上其他同类产品所没有的优点，如腾讯QQ的群和显示最近联系人功能，QQ邮箱的超大附件功能，QQ游戏平台一上线就号称能承载上千万的同时在线，QQ还解决了困扰很多IM产品的联通、电信的互联互通问题等等。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　事实上，腾讯获得突破的领域往往得益于应用层面的创新，腾讯总是能够通过QQ用户行为习惯的把握，将新产品与腾讯QQ这一核心进行结合，使其用户的优势得到发挥。同为技术出身，奇虎360董事长周鸿祎坦言如果同是做即时通讯，自己在产品细节和技术上能够比马化腾做得好，但很难比QQ成功。因为马化腾是把互联网产品当成服务来做，其成功在于&#8220;打动人心&#8221;。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　CSDN总裁蒋涛在接受本报记者采访时也表示，虽然从商业竞争的角度，腾讯通过复制别人的商业模式进行无限扩张，是无可厚非的，但在客观上必然会扼杀一些创新的好苗头。这也和胡延平的观点一致，从某种程度上说，腾讯是互联网创新者的杀手。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　腾讯的麻烦四面制造麻烦的腾讯并非每次都能凯旋而归，甚至给自己惹上了不少麻烦。2009年6月，搜狐就因为输入法将腾讯告上法庭，称腾讯侵犯了其旗下搜狗拼音输入法的软件自主知识产权，并且利用QQ拼音输入法破坏搜狗拼音输入法服务，对搜狗实施不正当竞争，因此请求法院判令腾讯停止不正当竞争行为，并索赔2000万元。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　能够让同为互联网巨头的搜狐撕下脸面，腾讯&#8220;与全网为敌&#8221;所招致的民愤可见一斑。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　不过，身为山寨之王的腾讯也在遭遇&#8220;被山寨&#8221;。2005年成立的51.com，几乎腾讯每推出一个新的功能与应用，它都会加以&#8220;学习&#8221;、&#8220;消化&#8221;，并迅速在自己的平台上开发出来。如目前在51.com平台上的&#8220;51商城&#8221;、&#8220;51群组&#8221;、&#8220;51秀&#8221;、&#8220;51问问&#8221;，它甚至曾经开发出彩虹QQ，免费提供IP地址探测、显示隐身好友等腾讯QQ的&#8220;增值&#8221;功能。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　<strong>怎样才能抗衡腾讯呢</strong></p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　&#8220;能不能给大家一点建议，怎样才能抗衡腾讯呢？&#8221;在2009年游戏产业年会的高峰对话环节，当主持人抛给腾讯游戏总裁任宇昕这样一个问题时，除了任宇昕自己一脸骄傲，举坐皆苦笑。这位中国最大互联网公司的游戏业务负责人也不谦虚：&nbsp;只有跟腾讯合作，共同把市场一同做大。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　在外界看来，腾讯庞大的身躯，依然潜伏着诸多暗流。实际上，因为腾讯在互联网界&#8220;无耻模仿抄袭&#8221;的恶名，使得腾讯全线树敌，成为众矢之的。当越来越多的互联网企业开始时时提防着腾讯的时候，腾讯将不再像以前那样收放自如。比如，为应对腾讯的搜索，百度就将搜索的提成比例从10%提升到15%。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　而且，腾讯还算不上真正强大。互联网资深人士谢文则表示，腾讯的模仿充其量只能让保持强大的现状，却不能使其引领潮流，真正走向伟大。&#8220;事实上，如果腾讯一味模仿下去，随着平台上的服务越来越多，单个服务的效率会大幅降低。&#8221;谢文表示，&#8220;而且，如果腾讯只是针对现有的QQ用户群体开发应用，未来QQ用户的人口特性将被固定在年轻群体的娱乐需求上，随着网民年龄结构的变化，腾讯就会被最终边缘化，而开心网、人人网及<a href="http://t.sina.com.cn/" target="_blank" style="color: #000099; text-decoration: none; ">新浪微博</a>(<a href="http://t.sina.com.cn/" target="_blank" style="color: #000099; text-decoration: none; ">http://t.sina.com.cn</a>)的崛起已经为腾讯的迟钝敲下了警钟。&#8221;</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　在很多人眼中，腾讯是最近接近Google的一家本土互联网公司。因为虽然Google目前的主要盈利点还是围绕其搜索产品的AdSense和AdWords，但它也是邮箱、地图、音乐无所不做，腾讯也是如此，虽然号称全民公敌，但它的主要收入仍然来自IM和网络游戏所带来的互联网增值服务。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　但谢文却指出这只是表面现象：&#8220;腾讯和Google完全不在一个档次上&#8221;。他指出，Gmail、Google地图、Google&nbsp;Earth等产品虽然不赚钱，但是它们之所以被开发都是围绕着一个核心理念：就信息整合与信息呈现。相比之下，腾讯的产品则显得杂乱无章，IM、网游、电子商务与门户业务之间并不必然的关联，其他公司单独做也能成功。据此，谢文认为，腾讯只是利用先发优势抓住了一大批用户，产品研发都是针对用户市场展开，追求短期效益，而对自己的未来缺乏清晰地规划。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　&#8220;建立在用户群上的腾讯是不牢靠的。&#8221;蒋涛认为，一旦未来人们更喜欢用Facebook和Twitter这样的工具彼此联络，不再以IM为中心，腾讯的&#8220;大本营&#8221;就被攻克了，这意味其虚拟货币系统必将被超越，而网游、门户这些现有盈利点也不能保证一直有市场竞争力。</p>
<p style="margin-top: 15px; margin-right: 0px; margin-bottom: 15px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; font-size: 14px; line-height: 23px; ">　　&#8220;如果人们未来都不再依赖PC，改用Ipad和手机的话，微软无疑就完蛋了&#8221;蒋涛说。微软的今天可能就是腾讯的明天，IT产业往往形势突变，用户习惯的变化又是在旦夕之间，看看facebook和google所带来的一场场变革，腾讯当以微软和雅虎为戒。</p>
</div>
<img src ="http://www.blogjava.net/franky/aggbug/327059.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/franky/" target="_blank">Franky</a> 2010-07-25 07:03 <a href="http://www.blogjava.net/franky/articles/327059.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转 Fronting Tomcat with apache or iis</title><link>http://www.blogjava.net/franky/articles/323436.html</link><dc:creator>Franky</dc:creator><author>Franky</author><pubDate>Sat, 12 Jun 2010 07:24:00 GMT</pubDate><guid>http://www.blogjava.net/franky/articles/323436.html</guid><wfw:comment>http://www.blogjava.net/franky/comments/323436.html</wfw:comment><comments>http://www.blogjava.net/franky/articles/323436.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/franky/comments/commentRss/323436.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/franky/services/trackbacks/323436.html</trackback:ping><description><![CDATA[Running cluster of Tomcat servers behind the Web server can be demanding
task if you wish to archive maximum performance and stability.
This article describes best practices how to accomplish that.
<br />
<h5>By Mladen Turk</h5>
<hr />
<h3>Fronting Tomcat</h3>
<p>
One might ask a question <em>Why to put the Web server in front of Tomcat</em>
at all? Thanks to the latest advances in Java Virtual Machines (JVM)
technology and the Tomcat core itself, the Tomcat standalone is quite
comparable with performance to the native web servers.
Even when delivering static content it is only 10%
slower than recent Apache 2 web servers.
<br />
The answer is: <strong>scalability</strong>.
</p>
<p>Tomcat can serve many concurrent users by assigning a separate thread
of
execution to each concurrent client connection. It can do that nicely
but
there is a problem when the number of those concurrent connections rise.
The time the Operating System will spend on managing those threads will
degrade
the overall performance. JVM will spend more time managing and switching
those
threads then doing a real job, serving the requests.
</p>
<p>Besides the connectivity there is one more significant problem, and
it caused
by the applications running on the Tomcat. A typical application will
process
client data, access the database, do some calculations and present the
data
back to the client. All that can be a time consuming job that in most
cases
must be finished inside half a second, to achieve user perception of a
working
application. Simple math will show that for a 10ms application response
time you
will be able to serve at most 50 concurrent users, before your users
start
complaining. So what to do if you need to support more users?
The simplest thing is to buy a faster hardware, add more CPU or add more
boxes.
A two 2-way boxes are usually cheaper then a 4-way one, so adding more
boxes
is generally a cheaper solution then buying a mainframe.
</p>
<p>First thing to ease the load from the Tomcat is to use the Web server
for serving static content like images, etc..
</p>
<table border="0">
    <tbody>
        <tr>
            <td><img src="http://people.apache.org/%7Emturk/docs/article/fig1.gif" alt="Figure 1." /></td>
        </tr>
        <tr>
            <td><em>Figure 1. Generic configuration</em></td>
        </tr>
    </tbody>
</table>
<p>Figure 1. shows the simplest possible configuration scenario. Here
the
Web server is used to deliver static context while Tomcat only does the
real job - serving application. In most cases this is all that you will
need.
With 4-way box and 10ms application time you'll be capable of serving
200
concurrent users, thus giving 3.5 million hits per day, that is by all
means a respectable number.
</p>
<p>For that kind of load you generally do not need the Web server in
front of
Tomcat. But here comes the second reason why to put the Web server in
front, and
that is creating an DMZ (demilitarized zone). Putting Web server on a
computer host inserted as a "neutral zone" between a company's private
network
and the internet or some other outside public network gives the
applications
hosted on Tomcat capability to access company private data, while
securing
the access to other private resources.
</p>
<table border="0">
    <tbody>
        <tr>
            <td><img src="http://people.apache.org/%7Emturk/docs/article/fig2.gif" alt="Figure 2." /></td>
        </tr>
        <tr>
            <td><em>Figure 2. Secure generic configuration</em></td>
        </tr>
    </tbody>
</table>
<p>Beside having DMZ and secure access to a private network there can
be many other factors like the need for the custom authentication for
example.
</p>
If you need to handle more load you will eventually have to add more
Tomcat
application servers. The reason for that can be either caused by the
fact
that your client load just can not be handled by a single box or that
you
need some sort of failover in case one of the nodes breaks.
<table border="0">
    <tbody>
        <tr>
            <td><img src="http://people.apache.org/%7Emturk/docs/article/fig3.gif" alt="Figure 3." /></td>
        </tr>
        <tr>
            <td><em>Figure 3. Load balancing configuration</em></td>
        </tr>
    </tbody>
</table>
<p>
Configuration containing multiple Tomcat application servers needs a
load balancer
between web server and Tomcat. For Apache 1.3, Apache 2.0 and IIS Web
servers
you can use Jakarta Tomcat Connector (also known as JK), because it
offers
both software load balancing and sticky sessions. For the upcoming
Apache 2.1/2.2
use the advanced mod_proxy_balancer that is a new module designed and
integrated
within the Apache httpd core.
</p>
<hr />
<h3>Calculating Load</h3>
<p>When determining the number of Tomcat servers that you will need to
satisfy
the client load, the first and major task is determining the Average
Application
Response Time (hereafter AART). As said before, to satisfy the user
experience
the application has to respond within half of second. The content
received by the client
browser usually triggers couple of physical requests to the Web server
(e.g. images). The
web page usually consists of html and image data, so client issues a
series
of requests, and the time that all this gets processed and delivered is
called AART. To get most out of Tomcat you should limit the number of
concurrent
requests to 200 per CPU.
</p>
<p>So we can come with the simple formula to calculate the maximum
number of concurrent connections a physical box can handle:</p>
<pre>                              500<br />
Concurrent requests = ( ---------- max 200 ) * Number of CPU's<br />
AART (ms)<br />
</pre>
<p>The other thing that you must care is the Network throughput between
the
Web server and Tomcat instances. This introduces a new variable called
Average Application Response Size (hereafter AARS), that is the number
of
bytes of all context on a web page presented to the user. On a standard
100Mbps network card with 8 Bits per Byte, the maximum theoretical
throughput is 12.5 MBytes.
</p>
<pre>                               12500 <br />
Concurrent requests = ---------------<br />
AARS (KBytes)<br />
</pre>
<p>For a 20KB AARS this will give a theoretical maximum of 625
concurrent
requests. You can add more cards or use faster 1Gbps hardware if need
to handle more load.
</p>
<br />
<p>The formulas above will give you rudimentary estimation of the number
of
Tomcat boxes and CPU's that you will need to handle the desired
number of concurrent client requests.
If you have to deploy the configuration without
having actual hardware, the closest you can get is to measure the AART
on
a test platform and then compare the hardware vendor Specmarks.
</p>
<hr />
<h3>Fronting Tomcat with Apache</h3>
<p>If you need to put the Apache in front of Tomcat use the Apache2 with
worker MPM. You can use Apache1.3 or Apache2 with prefork MPM for
handling
simple configurations like shown on the Figure 1. If you need to front
several Tomcat boxes and implement load balancing use Apache2 and worker
MPM compiled in.
</p>
<p>
MPM or Multi-Processing Module is Apache2 core feature and it is
responsible
for binding to network ports on the machine, accepting requests,
and dispatching children to handle the requests.
MPMs must be chosen during configuration, and compiled into the server.
Compilers are capable of optimizing a lot of functions if threads are
used,
but only if they know that threads are being used. Because some MPMs use
threads
on Unix and others don't, Apache will always perform better if the MPM
is
chosen at configuration time and built into Apache.
</p>
<p>Worker MPM offers a higher scalability compared to a standard prefork
mechanism where each client connection creates a separate Apache
process.
It combines the best from two worlds, having a set of child processes
each
having a set of separate threads. There are sites that are running
10K+ concurrent connections using this technology.
</p>
<br />
<h4>Connecting to Tomcat</h4>
<p>In a simplest scenario when you need to connect to single Tomcat
instance
you can use mod_proxy that comes as a part of every Apache distribution.
However, using the mod_jk connector will provide approximately double
the performance.
There are several reasons for that and the major is that mod_jk manages a
persistent connection pool to the Tomcat, thus avoiding opening and
closing
connections to Tomcat for each request. The other reason is that mod_jk
uses a custom
protocol named AJP an by that avoids assembling and disassembling header
parameters for each request that are already processed on the Web
server.
You can find more details about AJP
protocol on the <a href="http://jakarta.apache.org/tomcat/connectors-doc/">
Jakarta Tomcat connectors</a> site.
</p>
<p>For those reasons you can use mod_proxy only for the low load sites
or for the testing purposes. From now on I'll focus on mod_jk for
fronting
Tomcat with Apache, because it offers better performance and
scalability.
</p>
<p>One of the major design parameters when fronting Tomcat with Apache
or any other Web server is to synchronize the maximum number of
concurrent
connections. Developers often leave default configuration values from
both Apache and
Tomcat, and are faced with spurious error messages in their
log files. The reason for that is very simple. Tomcat and Apache can
each accept only
a predefined number of connections. If those
two configuration parameters differs, usually with Tomcat having
lower configured number of connections, you will be faced with the
sporadic connection errors. If the load gets even higher, your users
will
start receiving HTTP 500 server errors even if your hardware is capable
of dealing with the load.
</p>
<p>
Determining the number of maximum of connections to the Tomcat
in case of Apache web server depends on the MPM used.
</p>
<table>
    <tbody>
        <tr>
            <th>MPM</th><th>configuration parameter</th>
        </tr>
        <tr>
            <td>Prefork</td>
            <td>MaxClients</td>
        </tr>
        <tr>
            <td>Worker</td>
            <td>MaxClients</td>
        </tr>
        <tr>
            <td>WinNT</td>
            <td>ThreadsPerChild</td>
        </tr>
        <tr>
            <td>Netware</td>
            <td>MaxThreads</td>
        </tr>
    </tbody>
</table>
<p>
On the Tomcat side the configuration parameter that limits the number
of allowed concurrent requests is maxProcessors with default value of
20. This number needs to be equal to the MPM configuration parameter.
</p>
<p>
<br />
</p>
<h4>Load balancing</h4>
<p>
Load balancing is one of the ways to increase the number of concurrent
client connections to the application server. There are two types of
load balancers that you can use. The first one is hardware load balancer
and the second one is software load balancer. If you are using load
balancing
hardware, instead of a mod_jk or proxy, it must support a compatible
passive
or active cookie persistence mechanism, and SSL persistence.
</p>
<p>Mod_jk has an integrated virtual load balancer worker that can
contain
any number of physical workers or particular physical nodes.
Each of the nodes can have its own balance factor or the worker's
quota or lbfactor. Lbfactor is <em>how much we expect this worker
to work</em>, or <em>the workers's work quota</em>.
This parameter is usually dependent on the hardware topology itself, and
it offers to create a cluster with different hardware node
configurations.
Each lbfactor is compared to all other lbfactors in the cluster and its
relationship gives the actual load. If the lbfactors are equal the
workers
load will be equal as well (e.g. 1-1, 2-2, 50-50, etc...). If first
node has lbfactor 2 while second has lbfactor 1, than the first node
will receive two times more requests than second one.
This asymmetric load configuration enables to have nodes with different
hardware architecture.
</p>
<p>In the simplest load balancer topology with only two nodes in the
cluster, the number of concurrent connections on a web server side
can be as twice as high then on a particular node. But ...
</p>
<pre>    1 + 1 != 2<br />
</pre>
<p>
The upper statement means that the sum of allowed connections on a
particular nodes does not give the total number of connections allowed.
This means that each node has to allow a slightly higher number of
connections than the desired total sum. This number is usually a
20% higher and it means that
</p>
<pre>    1 * 1.2 + 1 * 1.2 == 2<br />
</pre>
<p>
So if you wish to have a 100 concurrent connections with two nodes,
each of the node will have to handle the maximum of 60 connections.
The 20% margin factor is experimental, and depends on the Apache
server used. For prefork MPMs it can rise up to 50%, while for
the NT or Netware its value is 0%. The reason for that is that
each particular child process menages its own balance statistics
thus giving this 20% error for multiple child process web servers.
</p>
<pre>    worker.node1.type=ajp13<br />
worker.node1.host=10.0.0.10<br />
worker.node1.lbfactor=1<br />
<br />
worker.node2.type=ajp13<br />
worker.node2.host=10.0.0.11<br />
worker.node2.lbfactor=2<br />
<br />
worker.node3.type=ajp13<br />
worker.node3.host=10.0.0.12<br />
worker.node3.lbfactor=1<br />
<br />
worker.list=lbworker<br />
worker.lbworker.type=lb<br />
worker.lbworker.balance_workers=node1,node2,node3    <br />
</pre>
<p>The minimum configuration for a three node cluster shown in the
upper example will give the 25%-50%-25% distribution of the load,
meaning that the node2 will get as much load as the rest of the two
members.
It will also impose the following number of maxProcessors for each
particular
node in case of the MaxClients=200.
</p>
<pre>    node1 :<br />
&lt;Connector ... maxProcessors="60" ... /&gt;<br />
node2 :<br />
&lt;Connector ... maxProcessors="120" ... /&gt;<br />
node3 :<br />
&lt;Connector ... maxProcessors="60" ... /&gt;<br />
</pre>
<p>Using simple math the load should be 50-100-50 but we needed to add
the
20% load distribution error. In case this 20% additional load is not
sufficient,
you will need to set the higher value up to the 50%. Of course the
average
number of connections for each particular node will still follow the
load balancer distribution quota.
</p>
<br />
<h4>Sticky sessions and failower</h4>
<p>One of the major problems with having multiple backend
application servers is determining the client-server relationship.
Once the client makes a request to a server application that
needs to track user actions over a designated time period,
some sort of state has to be enforced inside a stateless http
protocol. Tomcat issues a session identifier that
uniquely distinguishes each user. The problem with that session
identifier is that he does not carry any information about the
particular Tomcat instance that issued that identifier.
</p>
<p>Tomcat in that case adds an extra <strong>jvmRoute</strong> configurable
mark to that session. The jvmRoute can be any name that will
uniquely identify the particular Tomcat instance in the cluster.
On the other side of the wire the mod_jk will use that jvmRoute
as the name of the worker in it's load balancer list. This means
that the name of the worker and the jvmRoute must be equal.
</p>
<pre>jvmRoute is appended to the session identifier :<br />
http://host/app;jsessionid=0123456789ABCDEF0123456789ABCDEF.jvmRouteName<br />
</pre>
<p>When having multiple nodes in a cluster you can improve your
application
availability by implementing failover. The failover means that if the
particular elected node can not fulfill the request the another node
will be selected automatically. In case of three nodes you are actually
doubling your
application availability. The application response
time will be slower during failover, but none
of your users will be rejected. Inside the mod_jk configuration there
is a special configuration parameter called worker.retries that has
default value of 3, but
that needs to be adjusted to the actual number of nodes in the cluster.
</p>
<pre>    ...<br />
worker.list=lbworker<br />
worker.lbworker.type=lb<br />
# Adjust to the number of workers<br />
worker.retries=4<br />
worker.lbworker.balance_workers=node1,node2,node3,node4    <br />
</pre>
<p>If you add more then three workers to the load balancer
adjust the <strong>retries</strong> parameter to reflect that number.
It will ensure that even in the worse case scenario the request
gets served if there is a single operable node. Of course, the
request will be rejected if there are no free connections available on
the
Tomcat side , so you should increase the allowed number of connections
on each Tomcat instance. In the three node scenario (1-2-1)
if one of the nodes goes down, the other
two will have to take its load. So if the load is divided equally you
will need
to set the following Tomcat configuration:
</p>
<pre>    node1 :<br />
&lt;Connector ... maxProcessors="120" ... /&gt;<br />
node2 :<br />
&lt;Connector ... maxProcessors="160" ... /&gt;<br />
node3 :<br />
&lt;Connector ... maxProcessors="120" ... /&gt;<br />
</pre>
<p>This configuration will ensure that 200 concurrent connections will
always be allowable no matter which of the nodes goes down. The reason
for
doubling the number of processors on node1 and node3 is because they
need to handle the additional load in case node2 goes down (load 1-1).
Node2 also needs the adjustment because
if one of the other two nodes goes down, the load will be 1-2. As you
can see the 20% load error is always calculated in.
</p>
<table border="0">
    <tbody>
        <tr>
            <td><img src="http://people.apache.org/%7Emturk/docs/article/fig4.gif" alt="Figure 4." /></td>
        </tr>
        <tr>
            <td><em>Figure 4. Three node example load balancer</em></td>
        </tr>
        <tr>
            <td><img src="http://people.apache.org/%7Emturk/docs/article/fig5.gif" alt="Figure 5." /></td>
        </tr>
        <tr>
            <td><em>Figure 5. Failover for node2</em></td>
        </tr>
    </tbody>
</table>
<p>As shown in the two figures above setting maxProcessors depends both
on 20% load balancer error and expected single node failure. The
calculation must include the node with the highest lbfactor as
the worst case scenario.
</p>
<br />
<h4>Domain Clustering model</h4>
<p>Since JK version 1.2.8 there is a new domain clustering model and
it offers horizontal scalability and performance of tomcat cluster.
</p>
<p>
Tomcat cluster does only allow session replication to all nodes in the
cluster.
Once you work with more than 3-4 nodes there is too much overhead and
risk in
replicating sessions to all nodes. We split all nodes into clustered
groups.
The newly introduced worker attribute <strong>domain</strong> let
mod_jk know, to which other nodes a session gets replicated (all workers
with
the same value in the domain attribute). So a load balancing worker
knows, on
which nodes the session is alive. If a node fails or is being taken down
administratively, mod_jk chooses another node that has a replica of the
session.
</p>
<p>For example if you have a cluster with four nodes you can make
two virtual domains and replicate the sessions only inside the domains.
This will lower the replication network traffic by half
</p>
<table border="0">
    <tbody>
        <tr>
            <td><img src="http://people.apache.org/%7Emturk/docs/article/fig6.gif" alt="Figure 6." /></td>
        </tr>
        <tr>
            <td><em>Figure 6. Domain model clustering</em></td>
        </tr>
    </tbody>
</table>
<p>For the above example the configuration would look like:
</p>
<pre>    worker.node1.type=ajp13<br />
worker.node1.host=10.0.0.10<br />
worker.node1.lbfactor=1<br />
worker.node1.domain=A<br />
<br />
worker.node2.type=ajp13<br />
worker.node2.host=10.0.0.11<br />
worker.node2.lbfactor=1<br />
worker.node2.domain=A<br />
<br />
worker.node3.type=ajp13<br />
worker.node3.host=10.0.0.12<br />
worker.node3.lbfactor=1<br />
worker.node3.domain=B<br />
<br />
worker.node4.type=ajp13<br />
worker.node4.host=10.0.0.13<br />
worker.node4.lbfactor=1<br />
worker.node4.domain=B<br />
<br />
worker.list=lbworker<br />
worker.lbworker.type=lb<br />
worker.lbworker.balance_workers=node1,node2,node3,node4<br />
</pre>
<p>
Now assume you have multiple Apaches and Tomcats. The Tomcats are
clustered and
mod_jk uses sticky sessions. Now you are going to shut down
(maintenance) one
tomcat. All Apache will start connections to all tomcats. You end up
with all
tomcats getting connections from all apache processes, so the number of
threads
needed inside the tomcats will explode.
If you group the tomcats to domain as explained above, the connections
normally
will stay inside the domain and you will need much less threads.
</p>
<hr />
<h3>Fronting Tomcat with IIS</h3>
<p>Just like Apache Web server for Windows, Microsoft IIS maintains
a separate child process and thread pool for serving concurrent client
connections. For non server products like Windows 2000 Professional or
Windows XP the number of concurrent connections is limited to 10.
This mean that you can not use workstation products for production
servers unless the 10 connections limit will fulfil your needs.
The server range of products does not impose that 10 connection
limit, but just like Apache, the 2000 connections is a limit when
the thread context switching will take its share and slow down the
effective number of concurrent connections.
If you need higher load you will need to deploy additional web servers
and use Windows Network Load Balancer (WNLB) in front of Tomcat servers.
</p>
<table border="0">
    <tbody>
        <tr>
            <td><img src="http://people.apache.org/%7Emturk/docs/article/fig7.gif" alt="Figure 7." /></td>
        </tr>
        <tr>
            <td><em>Figure 7. WNLB High load configuration</em></td>
        </tr>
    </tbody>
</table>
<p>For topologies using Windows Network Load Balancer the same rules are
in place
as for the Apache with worker MPM. This means that each Tomcat instance
will have to handle 20% higher connection load per node than its real
lbfactor.
The workers.properties configuration must be
identical on each node that constitutes WNLB, meaning that you will have
to
configure all four Tomcat nodes.
</p>
<hr />
<h3>Apache 2.2 and new mod_proxy</h3>
<p>For the new Apache 2.1/2.2 mod_proxy has been rewriten and has
a new AJP capable protocol module (mod_proxy_ajp) and integrated
software load balancer (mod_proxy_balancer).
</p>
<p>Because it can maintain a constant connection pool to backed
servers it can replace the mod_jk functionality.
</p>
<pre>    LoadModule proxy_module modules/mod_proxy.so<br />
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so<br />
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so<br />
...<br />
&lt;Proxy balancer://mycluster&gt;<br />
BalancerMember ajp://10.0.0.10:8009 min=10 max=100 route=node1 loadfactor=1<br />
BalancerMember ajp://10.0.0.11:8009 min=20 max=200 route=node2 loadfactor=2    <br />
&lt;/Proxy&gt;<br />
ProxyPass /servlets-examples balancer://mycluster/servlets-examples<br />
</pre>
<p>
The above example shows how easy is to configure a Tomcat cluster with
proxy loadbalancer. One of the major advantages of using proxy is the
integrated caching, and no need to compile external module.
</p>
<p>Mod_proxy_balancer has integrated manager for dynamic parameter
changes.
It offers changing session routes or disabling a node for maintenance.
</p>
<pre>    &lt;Location /balancer-manager&gt;<br />
SetHandler balancer-manager<br />
Order deny,allow<br />
Allow from localhost<br />
&lt;/Location&gt;<br />
</pre>
<table border="0">
    <tbody>
        <tr>
            <td><img src="http://people.apache.org/%7Emturk/docs/article/fig8.jpg" alt="Figure 8." /></td>
        </tr>
        <tr>
            <td><em>Figure 8. Changing BalancerMember parameters</em></td>
        </tr>
    </tbody>
</table>
<p>The future development of mod_proxy will include the option to
dynamically discover the particular node topology. It will also allow
to dynamically update loadfactors and session routes.
</p>
<hr />
<h3>About the Author</h3>
<p>Mladen Turk is a Developer and Consultant for JBoss Inc in Europe,
where he is
responsible for native integration. He is a long time commiter for
Jakarta Tomcat Connectors,
Apache Httpd and Apache Portable Runtime projects.
</p>
<img src ="http://www.blogjava.net/franky/aggbug/323436.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/franky/" target="_blank">Franky</a> 2010-06-12 15:24 <a href="http://www.blogjava.net/franky/articles/323436.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转 Network Security Basics</title><link>http://www.blogjava.net/franky/articles/323434.html</link><dc:creator>Franky</dc:creator><author>Franky</author><pubDate>Sat, 12 Jun 2010 07:22:00 GMT</pubDate><guid>http://www.blogjava.net/franky/articles/323434.html</guid><wfw:comment>http://www.blogjava.net/franky/comments/323434.html</wfw:comment><comments>http://www.blogjava.net/franky/articles/323434.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/franky/comments/commentRss/323434.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/franky/services/trackbacks/323434.html</trackback:ping><description><![CDATA[<div>Posted by <strong>soudmaijer</strong>  | on 01
Oct 2009 under <a href="http://www.oudmaijer.com/blog/category/development/security/" title="View all posts in Security" rel="category tag">Security</a></div>
<div>This post describes a few network security
topologies which I`m required to be familiar with on my current Job. I`m
writing this down for future reference. If you want to learn more about
Firewalls and network security and infrastructure, I recommend reading &#8216;<a href="http://www.amazon.com/Best-Damn-Firewall-Book-Period/dp/1931836906">The
Best Damn Firewall Book Period</a>&#8216;.<br />
<br />
<h3>DMZ</h3>
<p><em>Firewalls</em> protect backend resources, such as databases in
multiple machine systems. You can also use firewalls to protect
Application Servers and Web servers from unauthorized outside access. A <em>demilitarized
zone</em> (DMZ) configuration involves multiple firewalls that add
layers of security between the Internet and critical data and business
logic.</p>
</div>
<div><a href="http://www.oudmaijer.com/blog/wp-content/uploads/2009/10/top_simpdmz.gif"><img size-full="" wp-image-150="" title="top_simpdmz" src="http://www.oudmaijer.com/blog/wp-content/uploads/2009/10/top_simpdmz.gif" alt="" width="522" height="228" /></a></div>
<p>A wide variety of topologies are appropriate for a DMZ environment,
the basic locations of elements in a simple DMZ topology follow.</p>
<p>The main purpose of a DMZ configuration is to protect the business
logic and data in the environment from unauthorized access. A typical
DMZ configuration includes:</p>
<ul>
    <li>An outer firewall between the public Internet and the Web server or
    servers processing the requests originating on the company Web site.</li>
    <li>An inner firewall between the Web server and the Application Servers
    to which it is forwarding requests. Company data also resides behind
    the inner firewall.</li>
</ul>
<p>The area between the two firewalls gives the DMZ configuration its
name. Additional firewalls can further safeguard access to databases
holding administrative and application data.</p>
<ul>
    <li>
    <div><strong>Avoids critical business data in the DMZ.</strong> A DMZ
    configuration protects application logic and data, by creating a buffer
    between the public Internet Web site and the internal intranet, where
    Application Servers and the data tier reside. Desirable DMZ topologies
    do not have databases or application  servers with critical business
    data in the DMZ.</div>
    </li>
</ul>
<ul>
    <li>
    <div><strong>Supports Network Address Translation (NAT).</strong> A
    firewall product that runs NAT receives packets for one IP address, and
    translates the headers of the packet to send the packet to a second IP
    address. In environments with firewalls employing NAT, avoid
    configurations involving complex protocols in which IP addresses are
    embedded in the body of the IP packet, such as Java Remote Method
    Invocation (RMI) or Internet Inter-Orb Protocol (IIOP). These IP
    addresses are not translated, making the packet useless.</div>
    </li>
</ul>
<ul>
    <li>
    <div><strong>Avoids the DMZ protocol switch.</strong> The Web server
    sends HTTP requests to Application Servers behind firewalls. It is
    simplest to open an HTTP port in the firewall to let the requests
    through. Configurations that require switching to another protocol, such
    as IIOP, and opening firewall ports corresponding to the protocol, are
    less desirable. They are often more complex to set up, and the protocol
    switching overhead can impact performance.</div>
    </li>
</ul>
<ul>
    <li>
    <div><strong>Allows an encrypted link between Web server and Application
    Server.</strong> Configurations that support encryption of
    communication between the Web server and application server reduce the
    risk that attackers are able to obtain secure information by <em>sniffing</em>
    packets sent between the Web server and Application Server. A
    performance penalty usually accompanies such encryption.</div>
    </li>
</ul>
<ul>
    <li>
    <div><strong>Avoids a single point of failure.</strong> A point of
    failure exists when one process or machine depends on another process or
    machine. A single point of failure is especially undesirable because if
    the point fails,  the whole system becomes unavailable. When comparing
    DMZ solutions, a single point of failure refers to a single point of
    failure between the Web server and Application Server. Various failover
    configurations can minimize downtime and possibly even prevent a
    failure. However, these configurations usually require additional
    hardware and administrative resources.</div>
    </li>
</ul>
<ul>
    <li>
    <div><strong>Minimizes the number of firewall holes.</strong>
    Configurations that minimize the number of firewall ports are desirable
    because each additional firewall port leaves the firewall more
    vulnerable to attackers.</div>
    </li>
</ul>
<p><em><a href="http://publib.boulder.ibm.com/infocenter/wasinfo/v5r1//index.jsp?topic=/com.ibm.websphere.nd.doc/info/ae/ae/ctop_firewall.html">http://publib.boulder.ibm.com/infocenter/wasinfo/v5r1//index.jsp?topic=/com.ibm.websphere.nd.doc/info/ae/ae/ctop_firewall.html</a></em></p>
<h3><strong>Reverse proxy</strong> (IP forwarding)</h3>
<p><em>Reverse proxy</em>, or <em>IP-forwarding</em> topologies use a
reverse proxy server to receive incoming HTTP requests and forward them
to a Web server. The Web server forwards the requests to the Application
Servers for actual processing. The reverse proxy returns completed
requests to the client, hiding the originating Web server.</p>
<p>The following figure shows a simple reverse proxy topology.</p>
<p><a href="http://www.oudmaijer.com/blog/wp-content/uploads/2009/10/top_reverseprx.gif"><img size-full="" wp-image-149="" title="top_reverseprx" src="http://www.oudmaijer.com/blog/wp-content/uploads/2009/10/top_reverseprx.gif" alt="" width="600" height="228" /></a></p>
<p>In this example, a reverse proxy resides in a demilitarized zone
(DMZ) between the outer and inner firewalls.  It listens on an HTTP
port, typically port 80, for HTTP requests. The reverse proxy then
forwards such requests to an HTTP server that resides on the same
machine as WebSphere Application Server.  After the requests are
fulfilled, they are returned through the reverse proxy to the client,
hiding the originating Web server.</p>
<p><strong>Typical use</strong></p>
<p>Reverse proxy servers are typically used in DMZ configurations to
provide additional security between the public Internet and the Web
servers (and application servers) servicing requests.</p>
<p>Reverse proxy configurations support high performance DMZ solutions
that require as few open ports in the firewall as possible. The reverse
proxy capabilities of the Web server inside the DMZ require as few as
one open port in the second firewall, potentially two if using Secure
Sockets Layer (SSL) &#8211; port 443.</p>
<p>Advantages of using a reverse proxy server in a DMZ configuration
include:</p>
<ul>
    <li>The reverse proxy server does not need database access through the
    firewall.</li>
    <li>The reverse proxy configuration supports WebSphere Application
    Server security and NAT firewalls.</li>
    <li>The basic reverse proxy configuration is well known and tested in
    the industry, resulting in less customer confusion than other DMZ
    configurations.</li>
    <li>The reverse proxy configuration is reliable and its performance is
    relatively fast.</li>
    <li>The reverse proxy configuration eliminates protocol switching, by
    using the HTTP protocol for all forwarded requests.</li>
    <li>The reverse proxy server uses only one HTTP firewall port for
    requests and responses.</li>
</ul>
<p>The reverse proxy configuration is also a disadvantage in some
environments where security policies prohibit using the same port or
protocol for inbound and outbound traffic across a firewall.</p>
<p>Disadvantages of using a reverse proxy server in a DMZ configuration
include the following:</p>
<ul>
    <li>The presence of a reverse proxy server in a DMZ  is not suitable for
    some environments.</li>
    <li>The reverse proxy configuration requires more hardware and  software
    than similar topologies that do not include a reverse proxy server,
    which makes it more complicated to configure and maintain.</li>
</ul>
<p><em><a href="http://publib.boulder.ibm.com/infocenter/wasinfo/v5r1//index.jsp?topic=/com.ibm.websphere.nd.doc/info/ae/ae/ctop_firewall.html">http://publib.boulder.ibm.com/infocenter/wasinfo/v5r1//index.jsp?topic=/com.ibm.websphere.nd.doc/info/ae/ae/ctop_firewall.html</a></em></p>
<img src ="http://www.blogjava.net/franky/aggbug/323434.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/franky/" target="_blank">Franky</a> 2010-06-12 15:22 <a href="http://www.blogjava.net/franky/articles/323434.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux下Nginx+Tomcat整合的安装与配置</title><link>http://www.blogjava.net/franky/articles/323429.html</link><dc:creator>Franky</dc:creator><author>Franky</author><pubDate>Sat, 12 Jun 2010 06:58:00 GMT</pubDate><guid>http://www.blogjava.net/franky/articles/323429.html</guid><wfw:comment>http://www.blogjava.net/franky/comments/323429.html</wfw:comment><comments>http://www.blogjava.net/franky/articles/323429.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/franky/comments/commentRss/323429.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/franky/services/trackbacks/323429.html</trackback:ping><description><![CDATA[<div>
<p><strong>一、安装Tomcat和JDK</strong></p>
<p>1、上传apache-tomcat-6.0.18.tar.gz和jdk-6u12-linux-i586.bin至/usr/local<br />
2、执行如下命令安装tomcat：</p>
<div id="highlighter_392234">
<div>
<blockquote>
<div><code>#cd /usr/local </code></div>
<div><code>#tar zxvf apache-tomcat-</code><code>6.0</code><code>.</code><code>18</code><code>.tar.gz</code></div>
</blockquote>
</div>
</div>
<p>解压完成后将apache-tomcat-6.0.18重命名为tomcat<br />
3、执行如下命令安装JDK:</p>
<div id="highlighter_430585">
<div>
<blockquote>
<div><code>#./jdk-6u12-linux-i586.bin</code></div>
<div>&nbsp;</div>
</blockquote>
</div>
</div>
<p>4、配置环境变量：<br />
编辑/etc下的profile文件，加上如下内容：<code>&nbsp;</code>&nbsp;</p>
<div id="highlighter_62590">
<div>
<blockquote>
<div><code>JAVA_HOME=</code><code>"/usr/local/jdk1.6.0_12"</code></div>
<div><code>CLASS_PATH=</code><code>"$JAVA_HOME/lib:$JAVA_HOME/jre/lib"</code></div>
<div><code>PATH=</code><code>".:$PATH:$JAVA_HOME/bin "</code></div>
<div><code>&nbsp;</code>&nbsp;</div>
<div><code>CATALINA_HOME=</code><code>"/usr/local/tomcat"</code></div>
<div><code>export JAVA_HOME CATALINA_HOME</code></div>
</blockquote>
</div>
</div>
<p>5、启动tomcat并输入http://localhost:8080，如果看到猫的页面即tomcat和jdk安装成功<br />
6、新建文件目录/home/www为网站存放目录，设置server.xml文件，在Host
name=&#8221;localhost&#8221;处将appBase=的指向路径改为/home/www/web<br />
7、创建index.jsp至/home/www/web/ROOT，内容为：&#8220;My web!&#8221; &nbsp;</p>
<p><strong>二、安装Nginx<br />
</strong>1、上传nginx-0.7.63.tar.gz至/usr/local</p>
<p>2、执行如下命令解压nginx：</p>
<div id="highlighter_472038">
<div>
<blockquote>
<div><code>#cd /usr/local </code></div>
<div><code>#tar zxvf&nbsp; nginx-</code><code>0.7</code><code>.</code><code>63</code><code>.tar.gz</code></div>
</blockquote>
</div>
</div>
<p>3、编译安装nginx</p>
<div id="highlighter_680713">
<div>
<blockquote>
<div><code>#cd nginx-</code><code>0.7</code><code>.</code><code>63</code></div>
<div><code>#./configure --with-http_stub_status_module
--with-http_ssl_module&nbsp; #启动server状态页和https模块</code></div>
</blockquote>
</div>
</div>
<p>执行完后会提示一个错误，说缺少PCRE library 这个是HTTP Rewrite 模块，也即是url静态化的包<br />
可上传pcre-7.9.tar.gz，输入如下命令安装：</p>
<div id="highlighter_721461">
<div>
<blockquote>
<div><code>#tar zxvf pcre-</code><code>7.9</code><code>.tar.gz </code></div>
<div><code>#cd pcre-</code><code>7.9</code></div>
<div><code>#./configure </code></div>
<div><code>#make </code></div>
<div><code>#make install</code></div>
</blockquote>
</div>
</div>
<p>安装pcre成功后，继续安装nginx</p>
<div id="highlighter_623040">
<div>
<blockquote>
<div><code>#cd nginx-</code><code>0.7</code><code>.</code><code>63</code></div>
<div><code>#./configure </code></div>
<div><code>#make </code></div>
<div><code>#make install</code></div>
</blockquote>
</div>
</div>
<p>4、nginx安装成功后的安装目录为/usr/local/nginx<br />
在conf文件夹中新建proxy.conf，用于配置一些代理参数，内容如下：</p>
<div id="highlighter_483711">
<div>
<blockquote>
<div><code>#!nginx (-)&nbsp; </code></div>
<div><code># proxy.conf&nbsp; </code></div>
<div><code>proxy_redirect&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; off; </code></div>
<div><code>proxy_set_header&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Host $host; </code></div>
<div><code>proxy_set_header&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; X-Real-IP $remote_addr;&nbsp; #获取真实ip </code></div>
<div><code>#proxy_set_header&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; X-Forwarded-For&nbsp;&nbsp;
$proxy_add_x_forwarded_for; #获取代理者的真实ip </code></div>
<div><code>client_max_body_size&nbsp;&nbsp;&nbsp; 10m; </code></div>
<div><code>client_body_buffer_size 128k; </code></div>
<div><code>proxy_connect_timeout&nbsp;&nbsp; </code><code>90</code><code>; </code></div>
<div><code>proxy_send_timeout&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </code><code>90</code><code>; </code></div>
<div><code>proxy_read_timeout&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </code><code>90</code><code>; </code></div>
<div><code>proxy_buffer_size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4k; </code></div>
<div><code>proxy_buffers&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </code><code>4</code> <code>32k; </code></div>
<div><code>proxy_busy_buffers_size 64k; </code></div>
<div><code>proxy_temp_file_write_size 64k;</code></div>
<div>&nbsp;</div>
</blockquote>
</div>
</div>
<p>编辑安装目录下conf文件夹中的nginx.conf，输入如下内容<code>&nbsp;</code>&nbsp;</p>
<div id="highlighter_71789">
<div>
<blockquote>
<div><code>#运行nginx所在的用户名和用户组 </code></div>
<div><code>#user&nbsp; www www;&nbsp; </code></div>
<div><code>&nbsp;</code>&nbsp;</div>
<div><code>#启动进程数 </code></div>
<div><code>worker_processes </code><code>8</code><code>; </code></div>
<div><code>#全局错误日志及PID文件 </code></div>
<div><code>error_log&nbsp; /usr/local/nginx/logs/nginx_error.log&nbsp; crit; </code></div>
<div><code>&nbsp;</code>&nbsp;</div>
<div><code>pid&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /usr/local/nginx/nginx.pid; </code></div>
<div><code>&nbsp;</code>&nbsp;</div>
<div><code>#Specifies the value </code><code>for</code> <code>maximum
file descriptors that can be opened by </code><code>this</code> <code>process.
</code></div>
<div><code>&nbsp;</code>&nbsp;</div>
<div><code>worker_rlimit_nofile </code><code>65535</code><code>; </code></div>
<div><code>#工作模式及连接数上限 </code></div>
<div><code>events </code></div>
<div><code>{ </code></div>
<div><code>&nbsp;&nbsp;</code><code>use epoll; </code></div>
<div><code>&nbsp;&nbsp;</code><code>worker_connections </code><code>65535</code><code>;
</code></div>
<div><code>} </code></div>
<div><code>#设定http服务器，利用它的反向代理功能提供负载均衡支持 </code></div>
<div><code>http </code></div>
<div><code>{ </code></div>
<div><code>&nbsp;&nbsp;</code><code>#设定mime类型 </code></div>
<div><code>&nbsp;&nbsp;</code><code>include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mime.types; </code></div>
<div><code>&nbsp;&nbsp;</code><code>default_type&nbsp; application/octet-stream; </code></div>
<div><code>&nbsp;&nbsp;</code><code>include /usr/local/nginx/conf/proxy.conf; </code></div>
<div><code>&nbsp;&nbsp;</code><code>#charset&nbsp; gb2312; </code></div>
<div><code>&nbsp;&nbsp;</code><code>#设定请求缓冲&nbsp;&nbsp;&nbsp;&nbsp; </code></div>
<div><code>&nbsp;&nbsp;</code><code>server_names_hash_bucket_size </code><code>128</code><code>;
</code></div>
<div><code>&nbsp;&nbsp;</code><code>client_header_buffer_size 32k; </code></div>
<div><code>&nbsp;&nbsp;</code><code>large_client_header_buffers </code><code>4</code>
<code>32k; </code></div>
<div><code>&nbsp;&nbsp;</code><code>client_max_body_size 8m; </code></div>
<div><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code>&nbsp;</div>
<div><code>&nbsp;&nbsp;</code><code>sendfile on; </code></div>
<div><code>&nbsp;&nbsp;</code><code>tcp_nopush&nbsp;&nbsp;&nbsp;&nbsp; on; </code></div>
<div><code>&nbsp;</code>&nbsp;</div>
<div><code>&nbsp;&nbsp;</code><code>keepalive_timeout </code><code>60</code><code>;
</code></div>
<div><code>&nbsp;</code>&nbsp;</div>
<div><code>&nbsp;&nbsp;</code><code>tcp_nodelay on; </code></div>
<div><code>&nbsp;</code>&nbsp;</div>
<div><code>#&nbsp; fastcgi_connect_timeout </code><code>300</code><code>; </code></div>
<div><code>#&nbsp; fastcgi_send_timeout </code><code>300</code><code>; </code></div>
<div><code>#&nbsp; fastcgi_read_timeout </code><code>300</code><code>; </code></div>
<div><code>#&nbsp; fastcgi_buffer_size 64k; </code></div>
<div><code>#&nbsp; fastcgi_buffers </code><code>4</code> <code>64k; </code></div>
<div><code>#&nbsp; fastcgi_busy_buffers_size 128k; </code></div>
<div><code>#&nbsp; fastcgi_temp_file_write_size 128k; </code></div>
<div><code>&nbsp;</code>&nbsp;</div>
<div><code>#&nbsp; gzip on; </code></div>
<div><code>#&nbsp; gzip_min_length&nbsp; 1k; </code></div>
<div><code>#&nbsp; gzip_buffers&nbsp;&nbsp;&nbsp;&nbsp; </code><code>4</code> <code>16k; </code></div>
<div><code>#&nbsp; gzip_http_version </code><code>1.0</code><code>; </code></div>
<div><code>#&nbsp; gzip_comp_level </code><code>2</code><code>; </code></div>
<div><code>#&nbsp; gzip_types&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; text/plain application/x-javascript
text/css application/xml; </code></div>
<div><code>#&nbsp; gzip_vary on; </code></div>
<div><code>&nbsp;</code>&nbsp;</div>
<div><code>&nbsp;&nbsp;</code><code>#limit_zone&nbsp; crawler&nbsp; $binary_remote_addr&nbsp;
10m; </code></div>
<div><code>&nbsp;</code><code>###禁止通过ip访问站点 </code></div>
<div><code>&nbsp;&nbsp;</code><code>server{ </code></div>
<div><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code>server_name _; </code></div>
<div><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code>return</code> <code>404</code><code>; </code></div>
<div><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code>} </code></div>
<div><code>&nbsp;</code>&nbsp;</div>
<div><code>&nbsp;</code>&nbsp;</div>
<div><code>&nbsp;&nbsp;</code><code>server </code></div>
<div><code>&nbsp;&nbsp;</code><code>{ </code></div>
<div><code>&nbsp;&nbsp;&nbsp;&nbsp;</code><code>listen&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </code><code>80</code><code>; </code></div>
<div><code>&nbsp;&nbsp;&nbsp;&nbsp;</code><code>server_name&nbsp; localhost; </code></div>
<div><code>&nbsp;&nbsp;&nbsp;&nbsp;</code><code>index index.html index.htm
index.jsp;#设定访问的默认首页地址 </code></div>
<div><code>&nbsp;&nbsp;&nbsp;&nbsp;</code><code>root&nbsp; /home/www/web/ROOT;#设定网站的资源存放路径 </code></div>
<div><code>&nbsp;</code>&nbsp;</div>
<div><code>&nbsp;&nbsp;&nbsp;&nbsp;</code><code>#limit_conn&nbsp;&nbsp; crawler&nbsp; </code><code>20</code><code>;&nbsp;&nbsp;&nbsp;&nbsp;
</code></div>
<div><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code>&nbsp;</div>
<div><code>&nbsp;&nbsp;&nbsp;&nbsp;</code><code>location ~ .*.jsp$ #所有jsp的页面均交由tomcat处理 </code></div>
<div><code>&nbsp;&nbsp;&nbsp;&nbsp;</code><code>{ </code></div>
<div><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code>index index.jsp; </code></div>
<div><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code>proxy_pass http:</code><code>//localhost:8080;#
转向tomcat处理 </code></div>
<div><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code>} </code></div>
<div><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code>&nbsp;</div>
<div><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code>&nbsp;</div>
<div><code>&nbsp;&nbsp;&nbsp;&nbsp;</code><code>location ~ .*".(gif|jpg|jpeg|png|bmp|swf)$
#设定访问静态文件直接读取不经过tomcat </code></div>
<div><code>&nbsp;&nbsp;&nbsp;&nbsp;</code><code>{ </code></div>
<div><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code>expires&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 30d; </code></div>
<div><code>&nbsp;&nbsp;&nbsp;&nbsp;</code><code>} </code></div>
<div><code>&nbsp;</code>&nbsp;</div>
<div><code>&nbsp;&nbsp;&nbsp;&nbsp;</code><code>location ~ .*".(js|css)?$ </code></div>
<div><code>&nbsp;&nbsp;&nbsp;&nbsp;</code><code>{ </code></div>
<div><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code>expires&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1h; </code></div>
<div><code>&nbsp;&nbsp;&nbsp;&nbsp;</code><code>}&nbsp;&nbsp;&nbsp;&nbsp; </code></div>
<div><code>&nbsp;</code>&nbsp;</div>
<div><code>#定义访问日志的写入格式 </code></div>
<div><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code>log_format&nbsp; access&nbsp; </code><code>'$remote_addr
- $remote_user [$time_local] "$request" '</code></div>
<div><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code>'$status $body_bytes_sent
"$http_referer" '</code></div>
<div><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code>'"$http_user_agent"
$http_x_forwarded_for'</code><code>; </code></div>
<div><code>&nbsp;&nbsp;&nbsp;&nbsp;</code><code>access_log&nbsp;
/usr/local/nginx/logs/localhost.log access;#设定访问日志的存放路径 </code></div>
<div><code>&nbsp;</code>&nbsp;</div>
<div><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code>}&nbsp;</code><code>&nbsp;</code>&nbsp;</div>
<div><code>} </code></div>
</blockquote>
</div>
</div>
<p>5、修改/usr/local/nginx/conf/nginx.conf配置文件后，请执行以下命令检查配置文件是否正确：</p>
<div id="highlighter_203603">
<div>
<blockquote>
<div><code>#/usr/local/nginx/sbin/nginx -t</code></div>
</blockquote>
</div>
</div>
<p>如果屏幕显示以下两行信息，说明配置文件正确：<code>&nbsp;</code>&nbsp;</p>
<div id="highlighter_275954">
<div>
<blockquote>
<div><code>the configuration file /usr/local/nginx/conf/nginx.conf
syntax is ok </code></div>
<div><code>　　the configuration file /usr/local/nginx/conf/nginx.conf was
tested successfully</code></div>
</blockquote>
</div>
</div>
<p>如果提示unknown host，则可在服务器上执行：ping www.baidu.com如果也是同样提示unknown
host则有两种可能：<br />
&nbsp;&nbsp;&nbsp; a、服务器没有设置DNS服务器地址，查看/etc/resolv.conf下是否设置，若无则加上<br />
&nbsp;&nbsp;&nbsp; b、防火墙拦截</p>
<p>&nbsp;6、启动nginx的命令</p>
<div id="highlighter_253995">
<div>
<blockquote>
<div><code>#/usr/local/nginx/sbin/nginx</code></div>
</blockquote>
</div>
</div>
<p>这时，输入以下命令查看Nginx主进程号：</p>
<div id="highlighter_423482">
<div>
<blockquote>
<div><code>ps -ef | grep </code><code>"nginx: master process"</code> <code>|
grep -v </code><code>"grep"</code> <code>| awk -F </code><code>' '</code>
<code>'{print $2}'</code></div>
</blockquote>
</div>
</div>
<p>7、停止nginx的命令</p>
<div id="highlighter_539038">
<div>
<blockquote>
<div><code>#/usr/local/nginx/sbin/nginx -s stop</code></div>
</blockquote>
</div>
</div>
<p>8、在不停止Nginx服务的情况下平滑变更Nginx配置<br />
a、修改/usr/local/nginx/conf/nginx.conf配置文件后，请执行以下命令检查配置文件是否正确：</p>
<div id="highlighter_534160">
<div>
<blockquote>
<div><code>/usr/local/nginx/sbin/nginx -t</code></div>
</blockquote>
</div>
</div>
<p>　　如果屏幕显示以下两行信息，说明配置文件正确：</p>
<div id="highlighter_610157">
<div>
<blockquote>
<div><code>　　the configuration file /usr/local/nginx/conf/nginx.conf
syntax is ok </code></div>
<div><code>　　the configuration file /usr/local/nginx/conf/nginx.conf was
tested successfully</code></div>
</blockquote>
</div>
</div>
<p>b、这时，输入以下命令查看Nginx主进程号：</p>
<div id="highlighter_859351">
<div>
<blockquote>
<div><code>ps -ef | grep </code><code>"nginx: master process"</code> <code>|
grep -v </code><code>"grep"</code> <code>| awk -F </code><code>' '</code>
<code>'{print $2}'</code></div>
</blockquote>
</div>
</div>
<p>屏幕显示的即为Nginx主进程号，例如：<br />
6302<br />
这时，执行以下命令即可使修改过的Nginx配置文件生效：</p>
<div id="highlighter_397280">
<div>
<blockquote>
<div><code>kill -HUP </code><code>6302</code></div>
</blockquote>
</div>
</div>
<p>　　<br />
或者无需这么麻烦，找到Nginx的Pid文件：</p>
<div id="highlighter_525329">
<div>
<blockquote>
<div><code>kill -HUP `cat /usr/local/nginx/nginx.pid`</code></div>
</blockquote>
</div>
</div>
<p>9、nginx启动好后启动tomcat，此时输入http://主机ip地址即可看到&#8220;My web!&#8221;&nbsp;</p>
<p>&nbsp;<br />
<strong>三、其他</strong><br />
stub_status<br />
语法: stub_status on</p>
<p>默认值: None</p>
<p>作用域: location</p>
<p>创建一个 location 区域启用 stub_status</p>
<p>&#8220;stub status&#8221; 模块返回的状态信息跟 mathopd&#8217;s 的状态信息很相似. 返回的状态信息如下：</p>
<div id="highlighter_463274">
<div>
<blockquote>
<div><code>Active connections: </code><code>291</code></div>
<div><code>server accepts handled requests </code></div>
<div><code>16630948</code> <code>16630948</code> <code>31070465</code></div>
<div><code>Reading: </code><code>6</code> <code>Writing: </code><code>179</code>
<code>Waiting: </code><code>106</code></div>
</blockquote>
</div>
</div>
<p>active connections — 对后端发起的活动连接数</p>
<p>server accepts handled requests — nginx 总共处理了 16630948 个连接, 成功创建
16630948 次握手 (证明中间没有失败的), 总共处理了 31070465 个请求 (平均每次握手处理了 1.8个数据请求)</p>
<p>reading — nginx 读取到客户端的Header信息数</p>
<p>writing — nginx 返回给客户端的Header信息数</p>
<p>waiting — 开启 keep-alive 的情况下，这个值等于 active &#8211; (reading +
writing)，意思就是Nginx说已经处理完正在等候下一次请求指令的驻留连接</p>
</div>
<img src ="http://www.blogjava.net/franky/aggbug/323429.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/franky/" target="_blank">Franky</a> 2010-06-12 14:58 <a href="http://www.blogjava.net/franky/articles/323429.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转 用Linux防火墙构建DMZ</title><link>http://www.blogjava.net/franky/articles/323425.html</link><dc:creator>Franky</dc:creator><author>Franky</author><pubDate>Sat, 12 Jun 2010 06:41:00 GMT</pubDate><guid>http://www.blogjava.net/franky/articles/323425.html</guid><wfw:comment>http://www.blogjava.net/franky/comments/323425.html</wfw:comment><comments>http://www.blogjava.net/franky/articles/323425.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/franky/comments/commentRss/323425.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/franky/services/trackbacks/323425.html</trackback:ping><description><![CDATA[======================================================================================
--&gt;
<font face="宋体">防守在网络安全中的重要性不必多说。保护网络最常见的方法就是使用防火墙。防火墙作为网络的第一道防线，通
常放置在外网和需要保护的网络之间。最简单的情况是直接将防火墙放置在外网和企业网络之间，所有流入企业网络的数据流量都将通过防火墙，使企业的所有客户
机及服务器都处于防火墙的保护下。这对于一些中小企业来说是简单易行的，而且这种解决方法在某些情况下也表现不错。然而这种结构毕竟比较简单。企业中有许
多服务器、客户机等资源需要保护，不同的资源对安全强度的要求也不同。不能用对待客户机的安全级别来对待服务器，这样服务器将会很危险；同样，也不能用对
待服务器的安全级别来对待客户机，这样用户会感觉很不方便。 </font>
<p><font face="宋体">针对不同资源提供不同安全级别的保
护，可以考虑构建一个叫做&#8220;demilitarized
zone&#8221;（dmz）的区域。dmz可以理解为一个不同于外网或内网的特殊网络区域。dmz内通常放置一些不含机密信息的公用服务器，比如web、
mail、ftp等。这样来自外网的访问者可以访问dmz中的服务，但不可能接触到存放在内网中的公司机密或私人信息等。即使dmz中服务器受到破坏，也
不会对内网中的机密信息造成影响。 </font></p>
<p><font face="宋体">许多防火墙产品都提供了dmz的接口。硬件防火墙由于
使用专门的硬件芯片，所以在性能和流量上有绝对的优势。软件防火墙的性价比非常好，一般企业使用起来效果不错。如果使用linux防火墙，其成本将更低。
因此这里将要介绍的是在linux防火墙上划分dmz区域的方法。 </font></p>
<p><font face="宋体"><strong>构建
dmz的策略</strong> </font></p>
<p><font face="宋体">linux从2.4内核开始,正式使用iptables
来代替以前的ipfwadm和ipchains，实现管理linux的包过滤功能。linux的包过滤通过一个叫netfilter的内核部件来实现。
netfilter内建了三个表，其中默认表filter中又包括3个规则链，分别是负责外界流入网络接口的数据过滤的input链、负责对网络接口输出
的数据进行过滤的output链，以及负责在网络接口之间转发数据过滤的
forward链。要构建一个带dmz的防火墙，需要利用对这些链的设定完成。首先要对从连接外部网络的网卡(eth0)上流入的数据进行判断，这是在
input链上完成。如果数据的目标地址属于dmz网段，就要将数据转发到连接dmz网络的网卡（eth1）上；如果是内部网络的地址，就要将数据转发到
连接内部网络的网卡（eth2）上。表1显示了各个网络之间的访问关系。 </font></p>
<p><font face="宋体">表1
网络间访问关系表 </font></p>
<p><font face="宋体">内网 外网 dmz <br />
<br />
内网 / y y <br />
<br />
外
网 n / y <br />
<br />
dmz n n / </font></p>
<p><br />
<br />
<font face="宋体">根据表1，可以明
确以下六条访问控制策略。 </font></p>
<p><font face="宋体">1.内网可以访问外网<br />
<br />
内网的用户显然需要自由
地访问外网。在这一策略中，防火墙需要进行源地址转换。 </font></p>
<p><font face="宋体">2.内网可以访问dmz<br />
<br />
此
策略是为了方便内网用户使用和管理dmz中的服务器。 </font></p>
<p><font face="宋体">3.外网不能访问内网<br />
<br />
很
显然，内网中存放的是公司内部数据，这些数据不允许外网的用户进行访问。 </font></p>
<p><font face="宋体">4.外网可以访
问dmz<br />
<br />
dmz中的服务器本身就是要给外界提供服务的，所以外网必须可以访问dmz。同时，外网访问dmz需要由防火墙完成对外地址到服
务器实际地址的转换。 </font></p>
<p><font face="宋体">5.dmz不能访问内网<br />
<br />
很明显，如果违背此策略，
则当入侵者攻陷dmz时，就可以进一步进攻到内网的重要数据。 </font></p>
<p><font face="宋体">6.dmz不能访问外网<br />
<br />
此
条策略也有例外，比如dmz中放置邮件服务器时，就需要访问外网，否则将不能正常工作。 </font></p>
<p><font face="宋体"><strong>dmz
的实现 </strong></font></p>
<p><font face="宋体">根据以上访问控制策略可以设定linux防火墙的过滤规则。下
面将在一个虚构的网络环境中，探讨如何根据以上六条访问控制策略建立相应的防火墙过滤规则。这里的讨论和具体应用会有所区别，不过这种讨论将有助于实际应
用。用户在实际应用时可根据具体的情况进行设置。该虚拟环境的网络拓扑如图1。 </font></p>
<p><font face="宋体"><img src="http://www.landiy.com.cn/uploadfiles/200905/20090521133742448.jpg" twffan="done" align="top" border="0"  alt="" /></font></p>
<p><font face="宋体">图1
dmz网络拓扑图</font></p>
<p><br />
<br />
<font face="宋体">如图1所示，<span twffan="done">路由器</span>连接internet和防火墙。作为防火墙的linux服
务器使用三块网卡：网卡eth0与<span twffan="done">路由器</span>相连，网卡
eth1与dmz区的hub相连，网卡eth2与内网hub相连。作为一个抽象的例子，我们用&#8220;[内网地址]&#8221;来代表&#8220;192.168.1.0/24&#8221;之
类的具体数值。同理还有&#8220;[外网地址]&#8221;和&#8220;[dmz地址]&#8221;。 </font></p>
<p><font face="宋体">对于防火墙，原则之一就
是默认禁止所有数据通信，然后再打开必要的通信。所以在防火墙脚本的最初，需要清空系统原有的规则，然后将input、output、forward的默
认规则设置为丢弃所有数据包。 </font></p>
<p><font face="宋体">对应的防火墙脚本片段如下： # flush out
the tables and delete all user-defined chains<br />
<br />
/sbin/iptables -f<br />
<br />
/sbin/iptables
-x<br />
<br />
/sbin/iptables -t nat -f<br />
<br />
/sbin/iptables -t nat -x</font></p>
<font face="宋体"># drop every packet<br />
<br />
/sbin/iptables -p input drop<br />
<br />
/sbin/iptables
-p output drop<br />
<br />
/sbin/iptables -p forward drop</font><br />
======================================================================================
--&gt;
<p><font face="宋体"><strong>六种策略的实现。</strong> </font></p>
<p><font face="宋体">1.内网可以访问外网<br />
<br />
对应的防火墙脚本片段如下：<br />
<br />
/sbin/iptables -t nat
-a postrouting -s [内网地址] -d [外网地址] -o eth0 -j snat --to [nat的真实ip] </font></p>
<p><font face="宋体">当数据从连接外网的eth0流出时，要将来自内网的数据包的源地址改成internet上的真实ip，这样才能和外网的主机进行通
信。&#8220;[nat的真实ip]&#8221;表示分配给nat用户的真实ip，有几个就写几个，以空格分开，但至少要写一个。 </font></p>
<p><font face="宋体">2.内网可以访问dmz<br />
<br />
对应的防火墙脚本片段如下：<br />
<br />
/sbin/iptables -a
forward -s [内网地址] -d [dmz地址] -i eth2 -j accept<br />
<br />
以上命令允许所有来自内网、目的地为
dmz的数据包通过。 </font></p>
<p><font face="宋体">3.外网不能访问内网<br />
<br />
对应的防火墙脚本片段如下：<br />
<br />
/sbin/iptables
-t nat -a prerouting -s [外网地址] -d [内网地址] -i eth0 -j drop<br />
<br />
以上命令将来自
外网、去往内网的数据包全部丢弃。 </font></p>
<p><font face="宋体">4.外网可以访问dmz<br />
<br />
为了保护
dmz中的服务器，外网对dmz的访问也要加以限制。通常的思路是，只允许外网访问dmz中服务器所提供的特定服务，比如http。<br />
<br />
对应
的防火墙脚本片段如下：<br />
<br />
/sbin/iptables -t nat -a prerouting -p tcp --dport 80
-d [分配给http服务器的internet上的真实ip] -s [外网地址] -i eth0 -j dnat --to
[http服务器的实际ip]<br />
<br />
/sbin/iptables -a forward -p tcp -s [外网地址] -d
[http服务器的实际ip] -i eth0 --dport 80 -j accept<br />
<br />
/sbin/iptables -a
forward -p tcp -d [外网地址] -s [http服务器的实际ip] -i eth1 --sport 80 ! --syn -j
accept<br />
<br />
/sbin/iptables -t nat -a prerouting -s [外网地址] -d [dmz地址]
-i eth0 -j drop </font></p>
<p><font face="宋体">该防火墙脚本片段将开放http服务，使得只有访问
dmz中http服务的数据包才能通过防火墙。 </font></p>
<p><font face="宋体">5.dmz不能访问内网<br />
<br />
对
应的防火墙脚本片段如下：<br />
<br />
/sbin/iptables -a forward -s [dmz地址] -d [内网地址] -i
eth1 -j drop<br />
<br />
以上命令将丢弃所有从dmz到内网的数据包。 </font></p>
<p><font face="宋体">6.dmz
不能访问外网<br />
<br />
对应的防火墙脚本片段如下：<br />
<br />
/sbin/iptables -t nat -a postrouting
-p tcp --dport 25 -d [外网地址] -s [邮件服务器的ip] -o eth0 -j snat --to
[分配给smtp服务器的internet上的真实ip]<br />
<br />
/sbin/iptables -a forward -p tcp -s
[邮件服务器的ip] -d [外网地址] -i eth1 --dport 25 -j accept<br />
<br />
/sbin/iptables
-a forward -p tcp -d [邮件服务器的ip] -s [外网地址] -i eth0--sport 25 ! --syn -j
accept </font></p>
<p><font face="宋体">以上命令先允许dmz中邮件服务器连接外网的smtp服务端口(25)，然
后禁止其它从dmz发往外网的数据包。 </font></p>
<p><font face="宋体">针对以上基本策略例举了实现它们的基本规则。在实
际应用中，需要根据具体情况进行设置。只要设置得当，linux也能成为很好的防火墙。需要补充的是，无论何种防火墙都只能提供有限的保护。设置好防火墙
不等于网络就是安全的，关键在于综合运用各种安全手段。</font></p>
<img src ="http://www.blogjava.net/franky/aggbug/323425.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/franky/" target="_blank">Franky</a> 2010-06-12 14:41 <a href="http://www.blogjava.net/franky/articles/323425.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转 RH9下APACHE+TOMCAT4+MYSQL4组建WEB服务器 </title><link>http://www.blogjava.net/franky/articles/323424.html</link><dc:creator>Franky</dc:creator><author>Franky</author><pubDate>Sat, 12 Jun 2010 06:38:00 GMT</pubDate><guid>http://www.blogjava.net/franky/articles/323424.html</guid><wfw:comment>http://www.blogjava.net/franky/comments/323424.html</wfw:comment><comments>http://www.blogjava.net/franky/articles/323424.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/franky/comments/commentRss/323424.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/franky/services/trackbacks/323424.html</trackback:ping><description><![CDATA[<p>RH9下APACHE+TOMCAT4+MYSQL4组建WEB服务器
<br />
下载相应的源代码：apache1,tomcat4,mysql,apr.jdk
<br />
在安装系统的时候一定要装gcc和autoconf.
<br />
<br />
1,安装MYSQL4数据库：
<br />
#tar&nbsp;&#8211;zxvf&nbsp;mysql-4.tar.gz
<br />
#groupadd&nbsp;mysql
<br />
#useradd&nbsp;-g&nbsp;mysql&nbsp;mysql
<br />
#cd&nbsp;mysql-4
<br />
#./configure&nbsp;&#8211;prefix=/usr/local/mysql
<br />
#make;make&nbsp;install
<br />
#scripts/mysql_install_db
<br />
#chown&nbsp;-R&nbsp;root&nbsp;/usr/local/mysql
<br />
#chown&nbsp;-R&nbsp;mysql&nbsp;/usr/local/mysql/var
<br />
#chgrp&nbsp;-R&nbsp;mysql&nbsp;/usr/local/mysql
<br />
#cp&nbsp;/usr/local/mysql/share/mysql/my-medium.cnf&nbsp;/etc/my.cnf
<br />
#/usr/local/mysql/bin/mysqld_safe&nbsp;--user=mysql&nbsp;&amp;
<br />
#/usr/local/mysql/bin/mysql
<br />
--&gt;;show&nbsp;databases;
<br />
--&gt;;exit;
<br />
#/usr/local/mysql/bin/mysqladmin&nbsp;-u&nbsp;root&nbsp;password&nbsp;your_new_password
<br />
MYSQL安装已经完成
<br />
2，安装APACHE1服务器：
<br />
#tar&nbsp;-zxvf&nbsp;apache1.tar.gz
<br />
#cd&nbsp;apache1
<br />
#./configure&nbsp;--prefix=/usr/local/apache&nbsp;--enable-module=so
<br />
#make;make&nbsp;install
<br />
#vi&nbsp;/usr/local/apache/conf/httpd.conf
<br />
<br />
servername:yourip
<br />
保存并退出
<br />
3安装TOMCAT4
<br />
(1)安装JDK
<br />
#cd&nbsp;/usr/local
<br />
#sh&nbsp;&nbsp;jdk-1.2.2-RC4-linux-i386-glibc-2.1.2.sh
<br />
#ln&nbsp;&#8211;s&nbsp;jdk-1.2.2&nbsp;&nbsp;/usr/local/jdk
<br />
#ln&nbsp;&#8211;s&nbsp;jdk-1.2.2&nbsp;&nbsp;/usr/local/jre
<br />
(2)设置TOMCAT运行环境
<br />
#vi&nbsp;/root/.bash_profile
<br />
在此文件后加入下面
<br />
JAVA_HOME=/usr/local/jdk
<br />
export&nbsp;JAVA_HOME
<br />
CLASSPATH=/usr/local/jdk/lib:/usr/local/jre/lib
<br />
export&nbsp;CLASSPATH
<br />
CATALINA_HOME=/usr/local/tomcat&nbsp;
<br />
export&nbsp;CATALINA_HOME
<br />
PATH=$PATH:/usr/local/jdk/bin:/usr/local/jre/bin
<br />
保存并退出
<br />
(3)安装TOMCAT4
<br />
#tar&nbsp;&#8211;zxvf&nbsp;jakarta-tomcat4.tar.gz
<br />
#mv&nbsp;jakarta-tomat&nbsp;tomcat
<br />
a.测试TOMCAT运行情况
<br />
#lynx&nbsp;localhost:8080
<br />
b.生成mod_webapp.so
<br />
#tar&nbsp;-zxvf&nbsp;&nbsp;jakarta-tomcat.connnerts-src.tar.gz
<br />
#tar&nbsp;-zxvf&nbsp;&nbsp;apr_APACHE_2.0.35.tar.gz
<br />
#mv&nbsp;-r&nbsp;apr&nbsp;&nbsp;/usr/local/tomcat.connerts-src/webapp/
<br />
#cd&nbsp;/usr/local/tomcat.connerts-src/webapp/
<br />
#support/buildconf.sh&nbsp;
<br />
#./configure&nbsp;--with-apxs=/usr/local/apache/bin/apxs
<br />
#make
<br />
<br />
编辑/usr/local/tomcat/conf/server.xml,搜索&nbsp;
<br />
8008,找到<service name="tomcat-apache">;那段，把前面的;那行&nbsp;
<br />
和</service name="tomcat-apache">;后面的&lt;--&gt;;那行都删掉，就是这两行把这一整段都注释掉了。
<br />
4.联合APACHE1+TOMCAT4
<br />
#cp&nbsp;apache-1.3/mod_webapp.so&nbsp;/usr/local/apache/libexec/
<br />
#vi&nbsp;/usr/local/apache/conf/httpd.conf
<br />
修改
<br />
DirectoryIndex&nbsp;index.jsp&nbsp;index.html
<br />
Options&nbsp;Indexes&nbsp;MultiViews&nbsp;&nbsp;&nbsp;&nbsp;Options&nbsp;MultiViews
<br />
加入
<br />
LoadModule&nbsp;webapp_module&nbsp;libexec/mod_webapp.so&nbsp;
<br />
WebAppConnection&nbsp;warpConnection&nbsp;warp&nbsp;localhost:8008&nbsp;&nbsp;
<br />
WebAppDeploy&nbsp;examples&nbsp;warpConnection&nbsp;/examples/&nbsp;&nbsp;
<br />
WebAppInfo&nbsp;/webapp-info
<br />
保存并退出
<br />
#/usr/local/apache/bin/apachectl&nbsp;configtest
<br />
Syntax&nbsp;OK
<br />
#/usr/local/apache/bin/apachectl&nbsp;start
<br />
#/usr/local/tomcat/webapps/examples/index.jsp
<br />
#vi&nbsp;/usr/local/tomcat/webapps/examples/index.jsp
<br />
2&nbsp;+&nbsp;2&nbsp;=&nbsp;&lt;%=&nbsp;2&nbsp;+&nbsp;2&nbsp;%&gt;;
<br />
保存并退出
<br />
#chmod&nbsp;755&nbsp;/usr/local/tomcat/webapps/examples/index.jsp
<br />
#nohup&nbsp;/usr/local/tomcat/bin/startup.sh
<br />
5.测试
<br />
打开浏览器键入http://localhost/examples/&nbsp;如出现
<br />
2+2=4
<br />
即联合成功。
<br />
6.创建mysql,apache,tomcat自启动
<br />
＃vi&nbsp;/etc/rc.d/rc.local
<br />
<br />
/usr/local/mysql/bin/mysqld_safe&nbsp;--user=mysql&nbsp;&amp;
<br />
/usr/local/apache/bin/apachectl&nbsp;start
<br />
/usr/local/tcstart.sh
<br />
保存并退出
<br />
#touch&nbsp;/etc/init.d/tomcat
<br />
＃chmod&nbsp;755&nbsp;/etc/init.d/tomcat
<br />
＃useradd&nbsp;-d&nbsp;/usr/local/&nbsp;tomcat
<br />
#vi&nbsp;/etc/init.d/tomcat
<br />
<br />
#!/bin/bash
<br />
#
<br />
#&nbsp;tomcat&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Starts&nbsp;Tomcat&nbsp;Java&nbsp;server.
<br />
#
<br />
#
<br />
#&nbsp;chkconfig:&nbsp;345&nbsp;88&nbsp;12
<br />
#&nbsp;description:&nbsp;Tomcat&nbsp;is&nbsp;the&nbsp;server&nbsp;for&nbsp;Java&nbsp;servlet&nbsp;applications.
<br />
###&nbsp;BEGIN&nbsp;INIT&nbsp;INFO
<br />
#&nbsp;Provides:&nbsp;$tomcat
<br />
###&nbsp;END&nbsp;INIT&nbsp;INFO
<br />
<br />
#&nbsp;Source&nbsp;function&nbsp;library.
<br />
.&nbsp;/etc/init.d/functions
<br />
<br />
[&nbsp;-f&nbsp;/usr/local/tcstart.sh&nbsp;]&nbsp;||&nbsp;exit&nbsp;0
<br />
[&nbsp;-f&nbsp;/usr/local/tcstop.sh&nbsp;]&nbsp;||&nbsp;exit&nbsp;0
<br />
<br />
RETVAL=0
<br />
<br />
umask&nbsp;077
<br />
<br />
start()&nbsp;{
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;-n&nbsp;$"Starting&nbsp;Tomcat&nbsp;Java&nbsp;server:&nbsp;"
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;daemon&nbsp;su&nbsp;-c&nbsp;/usr/local/tcstart.sh&nbsp;tomcat
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$RETVAL
<br />
}
<br />
stop()&nbsp;{
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;-n&nbsp;$"Shutting&nbsp;down&nbsp;Tomcat&nbsp;Java&nbsp;server:&nbsp;"
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;daemon&nbsp;su&nbsp;-c&nbsp;/usr/local/tcstop.sh&nbsp;tomcat
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$RETVAL
<br />
}
<br />
restart()&nbsp;{
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stop
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start
<br />
}
<br />
case&nbsp;"$1"&nbsp;in
<br />
&nbsp;&nbsp;start)
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;
<br />
&nbsp;&nbsp;stop)
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stop
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;
<br />
&nbsp;&nbsp;restart|reload)
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;restart
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;
<br />
&nbsp;&nbsp;*)
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;$"Usage:&nbsp;$0&nbsp;{start|stop|restart}"
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit&nbsp;1
<br />
esac
<br />
<br />
exit&nbsp;$?
<br />
保存并退出
<br />
#touch&nbsp;/usr/local/tcstart.sh
<br />
<br />
#!/bin/bash
<br />
export&nbsp;JDK_HOME=/usr/local/jdk
<br />
export&nbsp;JAVA_HOME=/usr/local/jdk
<br />
#startup&nbsp;tomcat&nbsp;server
<br />
/usr/local/tomcat/bin/startup.sh
<br />
保存并退出
<br />
#chmod&nbsp;755&nbsp;/usr/local/tcstart.sh
<br />
#touch&nbsp;/usr/local/tcstart.sh
<br />
<br />
#!/bin/bash
<br />
export&nbsp;JDK_HOME=/usr/local/jdk
<br />
export&nbsp;JAVA_HOME=/usr/local/jdk
<br />
#stop&nbsp;tomcat&nbsp;server
<br />
/usr/local/tomcat/bin/shutdown.sh
<br />
保存并退出
<br />
#chmod&nbsp;755&nbsp;/usr/local/tcstop.sh
<br />
7.创建安全的科威WEB运行环境
<br />
(1).阻止你的系统响应任何从外部/内部来的ping请求
<br />
#vi&nbsp;/etc/rc.d/rc.local
<br />
echo&nbsp;1&nbsp;&gt;;&nbsp;/proc/sys/net/ipv4/icmp_echo_ignore_all
<br />
(2).减少系统CPU占有量和由于误操作导致系统重启
<br />
#vi&nbsp;/etc/inittab
<br />
<br />
id:3:initdefault:
<br />
#&nbsp;Run&nbsp;gettys&nbsp;in&nbsp;standard&nbsp;runlevels
<br />
1:2345:respawn:/sbin/mingetty&nbsp;tty1
<br />
2:2345:respawn:/sbin/mingetty&nbsp;tty2
<br />
#3:2345:respawn:/sbin/mingetty&nbsp;tty3
<br />
#4:2345:respawn:/sbin/mingetty&nbsp;tty4
<br />
#5:2345:respawn:/sbin/mingetty&nbsp;tty5
<br />
#6:2345:respawn:/sbin/mingetty&nbsp;tty6
<br />
#ca::ctrlaltdel:/sbin/shutdown&nbsp;-t3&nbsp;-r&nbsp;now
<br />
保存并退出
<br />
(3).&nbsp;删除不必要的拥护和组
<br />
#userdel&nbsp;&#8211;r&nbsp;username
<br />
adm,lp,sync,shutdown,halt,mail,procmail,mailx,news,uucp,operator,games,gopher,ftp
<br />
#groupdel&nbsp;groupname
<br />
adm,lp,sync,shutdown,halt,mail,procmail,mailx,news,uucp,operator,games,gopher,ftp
<br />
(4).&nbsp;创建ftp账户
<br />
#groupadd&nbsp;su
<br />
#useradd&nbsp;&#8211;g&nbsp;su&nbsp;&#8211;d&nbsp;/usr/local/apache/htdocs&nbsp;webserver
<br />
(5).&nbsp;用chattr命令给下面的文件加上不可更改属性。&nbsp;
<br />
[root@deep]#&nbsp;chattr&nbsp;+i&nbsp;/etc/passwd&nbsp;
<br />
[root@deep]#&nbsp;chattr&nbsp;+i&nbsp;/etc/shadow&nbsp;
<br />
[root@deep]#&nbsp;chattr&nbsp;+i&nbsp;/etc/group&nbsp;
<br />
[root@deep]#&nbsp;chattr&nbsp;+i&nbsp;/etc/gshadow
<br />
(6).禁止任何人(非法)通过su命令改变为root用户
<br />
#vi&nbsp;/etc/pam.d/su
<br />
<br />
auth&nbsp;sufficient&nbsp;/lib/security/pam_rootok.so&nbsp;debug&nbsp;
<br />
auth&nbsp;required&nbsp;/lib/security/pam_wheel.so&nbsp;group=sul
<br />
保存并退出
<br />
这样之后，只有su组成员可以改变为root用户
<br />
(7).资源限制防止DoS类型攻击
<br />
#vi&nbsp;/etc/security/limits.conf
<br />
在这个文件后加入下面
<br />
*&nbsp;hard&nbsp;core&nbsp;0&nbsp;
<br />
*&nbsp;hard&nbsp;rss&nbsp;5000&nbsp;
<br />
*&nbsp;hard&nbsp;nproc&nbsp;20
<br />
保存并退出
<br />
#vi&nbsp;/etc/pam.d/login
<br />
在这个文件后加入下面
<br />
session&nbsp;required&nbsp;/lib/security/pam_limits.so
<br />
保存并退出
<br />
(8)加上web服务器的防火#!/bin/sh
<br />
#
<br />
#&nbsp;Generated&nbsp;iptables&nbsp;firewall&nbsp;script&nbsp;for&nbsp;the&nbsp;Linux&nbsp;2.4&nbsp;kernel
<br />
#&nbsp;Script&nbsp;generated&nbsp;by&nbsp;Easy&nbsp;Firewall&nbsp;Generator&nbsp;for&nbsp;IPTables
<br />
#&nbsp;copyright&nbsp;2002&nbsp;Timothy&nbsp;Scott&nbsp;Morizot
<br />
#&nbsp;
<br />
#&nbsp;Redhat&nbsp;chkconfig&nbsp;comments&nbsp;-&nbsp;firewall&nbsp;applied&nbsp;early,
<br />
#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;removed&nbsp;late
<br />
#&nbsp;chkconfig:&nbsp;2345&nbsp;08&nbsp;92
<br />
#&nbsp;description:&nbsp;This&nbsp;script&nbsp;applies&nbsp;or&nbsp;removes&nbsp;iptables&nbsp;firewall&nbsp;rules
<br />
#&nbsp;
<br />
#&nbsp;This&nbsp;generator&nbsp;is&nbsp;primarily&nbsp;designed&nbsp;for&nbsp;RedHat&nbsp;installations,
<br />
#&nbsp;although&nbsp;it&nbsp;should&nbsp;be&nbsp;adaptable&nbsp;for&nbsp;others.
<br />
#
<br />
#&nbsp;It&nbsp;can&nbsp;be&nbsp;executed&nbsp;with&nbsp;the&nbsp;typical&nbsp;start&nbsp;and&nbsp;stop&nbsp;arguments.
<br />
#&nbsp;If&nbsp;used&nbsp;with&nbsp;stop,&nbsp;it&nbsp;will&nbsp;stop&nbsp;after&nbsp;flushing&nbsp;the&nbsp;firewall.
<br />
#&nbsp;The&nbsp;save&nbsp;and&nbsp;restore&nbsp;arguments&nbsp;will&nbsp;save&nbsp;or&nbsp;restore&nbsp;the&nbsp;rules
<br />
#&nbsp;from&nbsp;the&nbsp;/etc/sysconfig/iptables&nbsp;file.&nbsp;&nbsp;The&nbsp;save&nbsp;and&nbsp;restore
<br />
#&nbsp;arguments&nbsp;are&nbsp;included&nbsp;to&nbsp;preserve&nbsp;compatibility&nbsp;with
<br />
#&nbsp;Redhat's&nbsp;init.d&nbsp;script&nbsp;(at&nbsp;least&nbsp;in&nbsp;7.x)&nbsp;if&nbsp;you&nbsp;prefer&nbsp;to&nbsp;use&nbsp;it.
<br />
<br />
#&nbsp;Redhat&nbsp;installation&nbsp;instructions
<br />
#
<br />
#&nbsp;1.&nbsp;Ensure&nbsp;that&nbsp;ipchains&nbsp;will&nbsp;not&nbsp;automatically&nbsp;start.
<br />
#&nbsp;&nbsp;&nbsp;&nbsp;chkconfig&nbsp;--level&nbsp;0123456&nbsp;ipchains&nbsp;off
<br />
#&nbsp;&nbsp;&nbsp;&nbsp;This&nbsp;will&nbsp;make&nbsp;sure&nbsp;that&nbsp;the&nbsp;ipchains&nbsp;init.d&nbsp;script
<br />
#&nbsp;&nbsp;&nbsp;&nbsp;is&nbsp;not&nbsp;linked&nbsp;to&nbsp;an&nbsp;S&nbsp;file&nbsp;in&nbsp;any&nbsp;of&nbsp;the&nbsp;rc&nbsp;directories.
<br />
#
<br />
#&nbsp;2.&nbsp;Stop&nbsp;ipchains&nbsp;if&nbsp;it's&nbsp;running.
<br />
#&nbsp;&nbsp;&nbsp;&nbsp;service&nbsp;ipchains&nbsp;stop
<br />
#
<br />
#&nbsp;3.&nbsp;Execute&nbsp;lsmod&nbsp;to&nbsp;see&nbsp;if&nbsp;the&nbsp;ipchains&nbsp;kernel&nbsp;module&nbsp;is&nbsp;still&nbsp;loaded.
<br />
#&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;it&nbsp;is,&nbsp;use&nbsp;rmmod&nbsp;to&nbsp;unload&nbsp;it.&nbsp;--&nbsp;rmmod&nbsp;ipchains
<br />
#
<br />
#&nbsp;4.&nbsp;Have&nbsp;the&nbsp;system&nbsp;link&nbsp;the&nbsp;iptables&nbsp;init.d&nbsp;startup&nbsp;script&nbsp;into&nbsp;run&nbsp;states
<br />
#&nbsp;&nbsp;&nbsp;&nbsp;2,&nbsp;3,&nbsp;and&nbsp;5.
<br />
#&nbsp;&nbsp;&nbsp;&nbsp;chkconfig&nbsp;--level&nbsp;235&nbsp;iptables&nbsp;on
<br />
#
<br />
#&nbsp;5.&nbsp;Save&nbsp;this&nbsp;script&nbsp;and&nbsp;execute&nbsp;it&nbsp;to&nbsp;load&nbsp;the&nbsp;ruleset&nbsp;from&nbsp;this&nbsp;file.
<br />
#&nbsp;&nbsp;&nbsp;&nbsp;You&nbsp;may&nbsp;need&nbsp;to&nbsp;run&nbsp;the&nbsp;dos2unix&nbsp;command&nbsp;on&nbsp;it&nbsp;to&nbsp;remove&nbsp;carraige&nbsp;returns.
<br />
#
<br />
#&nbsp;6.&nbsp;To&nbsp;have&nbsp;it&nbsp;applied&nbsp;at&nbsp;startup,&nbsp;copy&nbsp;this&nbsp;script&nbsp;to
<br />
#&nbsp;&nbsp;&nbsp;&nbsp;/etc/init.d/iptables.&nbsp;&nbsp;It&nbsp;accepts&nbsp;stop,&nbsp;start,&nbsp;save,&nbsp;and&nbsp;restore
<br />
#&nbsp;&nbsp;&nbsp;&nbsp;arguments.&nbsp;&nbsp;(You&nbsp;may&nbsp;wish&nbsp;to&nbsp;save&nbsp;the&nbsp;existing&nbsp;one&nbsp;first.)
<br />
#
<br />
#&nbsp;7.&nbsp;For&nbsp;non-Redhat&nbsp;systems&nbsp;(or&nbsp;Redhat&nbsp;systems&nbsp;if&nbsp;you&nbsp;have&nbsp;a&nbsp;problem),&nbsp;you
<br />
#&nbsp;&nbsp;&nbsp;&nbsp;may&nbsp;want&nbsp;to&nbsp;append&nbsp;the&nbsp;command&nbsp;to&nbsp;execute&nbsp;this&nbsp;script&nbsp;to&nbsp;rc.local.
<br />
#&nbsp;&nbsp;&nbsp;&nbsp;rc.local&nbsp;is&nbsp;typically&nbsp;located&nbsp;in&nbsp;/etc&nbsp;and&nbsp;/etc/rc.d&nbsp;and&nbsp;is&nbsp;usually
<br />
#&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;last&nbsp;thing&nbsp;executed&nbsp;on&nbsp;startup.&nbsp;&nbsp;Simply&nbsp;add&nbsp;/path/to/script/script_name
<br />
#&nbsp;&nbsp;&nbsp;&nbsp;on&nbsp;its&nbsp;own&nbsp;line&nbsp;in&nbsp;the&nbsp;rc.local&nbsp;file.
<br />
<br />
###############################################################################
<br />
#&nbsp;
<br />
#&nbsp;Local&nbsp;Settings
<br />
#
<br />
<br />
#&nbsp;sysctl&nbsp;location.&nbsp;&nbsp;If&nbsp;set,&nbsp;it&nbsp;will&nbsp;use&nbsp;sysctl&nbsp;to&nbsp;adjust&nbsp;the&nbsp;kernel&nbsp;parameters.
<br />
#&nbsp;If&nbsp;this&nbsp;is&nbsp;set&nbsp;to&nbsp;the&nbsp;empty&nbsp;string&nbsp;(or&nbsp;is&nbsp;unset),&nbsp;the&nbsp;use&nbsp;of&nbsp;sysctl
<br />
#&nbsp;is&nbsp;disabled.
<br />
<br />
SYSCTL="/sbin/sysctl&nbsp;-w"&nbsp;
<br />
<br />
#&nbsp;To&nbsp;echo&nbsp;the&nbsp;value&nbsp;directly&nbsp;to&nbsp;the&nbsp;/proc&nbsp;file&nbsp;instead
<br />
#&nbsp;SYSCTL=""
<br />
<br />
#&nbsp;IPTables&nbsp;Location&nbsp;-&nbsp;adjust&nbsp;if&nbsp;needed
<br />
<br />
IPT="/sbin/iptables"
<br />
IPTS="/sbin/iptables-save"
<br />
IPTR="/sbin/iptables-restore"
<br />
<br />
#&nbsp;Internet&nbsp;Interface
<br />
INET_IFACE="eth0"
<br />
INET_ADDRESS="your&nbsp;web&nbsp;ip"
<br />
<br />
#&nbsp;Localhost&nbsp;Interface
<br />
<br />
LO_IFACE="lo"
<br />
LO_IP="127.0.0.1"
<br />
<br />
#&nbsp;Save&nbsp;and&nbsp;Restore&nbsp;arguments&nbsp;handled&nbsp;here
<br />
if&nbsp;[&nbsp;"$1"&nbsp;=&nbsp;"save"&nbsp;]
<br />
then
<br />
echo&nbsp;-n&nbsp;"Saving&nbsp;firewall&nbsp;to&nbsp;/etc/sysconfig/iptables&nbsp;...&nbsp;"
<br />
$IPTS&nbsp;&gt;;&nbsp;/etc/sysconfig/iptables
<br />
echo&nbsp;"done"
<br />
exit&nbsp;0
<br />
elif&nbsp;[&nbsp;"$1"&nbsp;=&nbsp;"restore"&nbsp;]
<br />
then
<br />
echo&nbsp;-n&nbsp;"Restoring&nbsp;firewall&nbsp;from&nbsp;/etc/sysconfig/iptables&nbsp;...&nbsp;"
<br />
$IPTR&nbsp;&lt;&nbsp;/etc/sysconfig/iptables
<br />
echo&nbsp;"done"
<br />
exit&nbsp;0
<br />
fi
<br />
<br />
###############################################################################
<br />
#
<br />
#&nbsp;Load&nbsp;Modules
<br />
#
<br />
<br />
echo&nbsp;"Loading&nbsp;kernel&nbsp;modules&nbsp;..."
<br />
<br />
#&nbsp;You&nbsp;should&nbsp;uncomment&nbsp;the&nbsp;line&nbsp;below&nbsp;and&nbsp;run&nbsp;it&nbsp;the&nbsp;first&nbsp;time&nbsp;just&nbsp;to
<br />
#&nbsp;ensure&nbsp;all&nbsp;kernel&nbsp;module&nbsp;dependencies&nbsp;are&nbsp;OK.&nbsp;&nbsp;There&nbsp;is&nbsp;no&nbsp;need&nbsp;to&nbsp;run
<br />
#&nbsp;every&nbsp;time,&nbsp;however.
<br />
<br />
#&nbsp;/sbin/depmod&nbsp;-a
<br />
<br />
#&nbsp;Unless&nbsp;you&nbsp;have&nbsp;kernel&nbsp;module&nbsp;auto-loading&nbsp;disabled,&nbsp;you&nbsp;should&nbsp;not
<br />
#&nbsp;need&nbsp;to&nbsp;manually&nbsp;load&nbsp;each&nbsp;of&nbsp;these&nbsp;modules.&nbsp;&nbsp;Other&nbsp;than&nbsp;ip_tables,
<br />
#&nbsp;ip_conntrack,&nbsp;and&nbsp;some&nbsp;of&nbsp;the&nbsp;optional&nbsp;modules,&nbsp;I've&nbsp;left&nbsp;these
<br />
#&nbsp;commented&nbsp;by&nbsp;default.&nbsp;&nbsp;Uncomment&nbsp;if&nbsp;you&nbsp;have&nbsp;any&nbsp;problems&nbsp;or&nbsp;if
<br />
#&nbsp;you&nbsp;have&nbsp;disabled&nbsp;module&nbsp;autoload.&nbsp;&nbsp;Note&nbsp;that&nbsp;some&nbsp;modules&nbsp;must
<br />
#&nbsp;be&nbsp;loaded&nbsp;by&nbsp;another&nbsp;kernel&nbsp;module.
<br />
<br />
#&nbsp;core&nbsp;netfilter&nbsp;module
<br />
/sbin/modprobe&nbsp;ip_tables
<br />
<br />
#&nbsp;the&nbsp;stateful&nbsp;connection&nbsp;tracking&nbsp;module
<br />
/sbin/modprobe&nbsp;ip_conntrack
<br />
<br />
#&nbsp;filter&nbsp;table&nbsp;module
<br />
#&nbsp;/sbin/modprobe&nbsp;iptable_filter
<br />
<br />
#&nbsp;mangle&nbsp;table&nbsp;module
<br />
#&nbsp;/sbin/modprobe&nbsp;iptable_mangle
<br />
<br />
#&nbsp;nat&nbsp;table&nbsp;module
<br />
#&nbsp;/sbin/modprobe&nbsp;iptable_nat
<br />
<br />
#&nbsp;LOG&nbsp;target&nbsp;module
<br />
#&nbsp;/sbin/modprobe&nbsp;ipt_LOG
<br />
<br />
#&nbsp;This&nbsp;is&nbsp;used&nbsp;to&nbsp;limit&nbsp;the&nbsp;number&nbsp;of&nbsp;packets&nbsp;per&nbsp;sec/min/hr
<br />
#&nbsp;/sbin/modprobe&nbsp;ipt_limit
<br />
<br />
#&nbsp;masquerade&nbsp;target&nbsp;module
<br />
#&nbsp;/sbin/modprobe&nbsp;ipt_MASQUERADE
<br />
<br />
#&nbsp;filter&nbsp;using&nbsp;owner&nbsp;as&nbsp;part&nbsp;of&nbsp;the&nbsp;match
<br />
#&nbsp;/sbin/modprobe&nbsp;ipt_owner
<br />
<br />
#&nbsp;REJECT&nbsp;target&nbsp;drops&nbsp;the&nbsp;packet&nbsp;and&nbsp;returns&nbsp;an&nbsp;ICMP&nbsp;response.
<br />
#&nbsp;The&nbsp;response&nbsp;is&nbsp;configurable.&nbsp;&nbsp;By&nbsp;default,&nbsp;connection&nbsp;refused.
<br />
#&nbsp;/sbin/modprobe&nbsp;ipt_REJECT
<br />
<br />
#&nbsp;This&nbsp;target&nbsp;allows&nbsp;packets&nbsp;to&nbsp;be&nbsp;marked&nbsp;in&nbsp;the&nbsp;mangle&nbsp;table
<br />
#&nbsp;/sbin/modprobe&nbsp;ipt_mark
<br />
<br />
#&nbsp;This&nbsp;target&nbsp;affects&nbsp;the&nbsp;TCP&nbsp;MSS
<br />
#&nbsp;/sbin/modprobe&nbsp;ipt_tcpmss
<br />
<br />
#&nbsp;This&nbsp;match&nbsp;allows&nbsp;multiple&nbsp;ports&nbsp;instead&nbsp;of&nbsp;a&nbsp;single&nbsp;port&nbsp;or&nbsp;range
<br />
#&nbsp;/sbin/modprobe&nbsp;multiport
<br />
<br />
#&nbsp;This&nbsp;match&nbsp;checks&nbsp;against&nbsp;the&nbsp;TCP&nbsp;flags
<br />
#&nbsp;/sbin/modprobe&nbsp;ipt_state
<br />
<br />
#&nbsp;This&nbsp;match&nbsp;catches&nbsp;packets&nbsp;with&nbsp;invalid&nbsp;flags
<br />
#&nbsp;/sbin/modprobe&nbsp;ipt_unclean
<br />
<br />
#&nbsp;The&nbsp;ftp&nbsp;nat&nbsp;module&nbsp;is&nbsp;required&nbsp;for&nbsp;non-PASV&nbsp;ftp&nbsp;support
<br />
/sbin/modprobe&nbsp;ip_nat_ftp
<br />
<br />
#&nbsp;the&nbsp;module&nbsp;for&nbsp;full&nbsp;ftp&nbsp;connection&nbsp;tracking
<br />
/sbin/modprobe&nbsp;ip_conntrack_ftp
<br />
<br />
#&nbsp;the&nbsp;module&nbsp;for&nbsp;full&nbsp;irc&nbsp;connection&nbsp;tracking
<br />
/sbin/modprobe&nbsp;ip_conntrack_irc
<br />
<br />
<br />
###############################################################################
<br />
#
<br />
#&nbsp;Kernel&nbsp;Parameter&nbsp;Configuration
<br />
#
<br />
#&nbsp;See&nbsp;http://ipsysctl-tutorial.frozentux.net/chunkyhtml/index.html
<br />
#&nbsp;for&nbsp;a&nbsp;detailed&nbsp;tutorial&nbsp;on&nbsp;sysctl&nbsp;and&nbsp;the&nbsp;various&nbsp;settings
<br />
#&nbsp;available.
<br />
<br />
#&nbsp;Required&nbsp;to&nbsp;enable&nbsp;IPv4&nbsp;forwarding.
<br />
#&nbsp;Redhat&nbsp;users&nbsp;can&nbsp;try&nbsp;setting&nbsp;FORWARD_IPV4&nbsp;in&nbsp;/etc/sysconfig/network&nbsp;to&nbsp;true
<br />
#&nbsp;Alternatively,&nbsp;it&nbsp;can&nbsp;be&nbsp;set&nbsp;in&nbsp;/etc/sysctl.conf
<br />
#if&nbsp;[&nbsp;"$SYSCTL"&nbsp;=&nbsp;""&nbsp;]
<br />
#then
<br />
#&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"1"&nbsp;&gt;;&nbsp;/proc/sys/net/ipv4/ip_forward
<br />
#else
<br />
#&nbsp;&nbsp;&nbsp;&nbsp;$SYSCTL&nbsp;net.ipv4.ip_forward="1"
<br />
#fi
<br />
<br />
#&nbsp;This&nbsp;enables&nbsp;dynamic&nbsp;address&nbsp;hacking.
<br />
#&nbsp;This&nbsp;may&nbsp;help&nbsp;if&nbsp;you&nbsp;have&nbsp;a&nbsp;dynamic&nbsp;IP&nbsp;address&nbsp;"(e.g.&nbsp;slip,&nbsp;ppp,&nbsp;dhcp").
<br />
#if&nbsp;[&nbsp;"$SYSCTL"&nbsp;=&nbsp;""&nbsp;]
<br />
#then
<br />
#&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"1"&nbsp;&gt;;&nbsp;/proc/sys/net/ipv4/ip_dynaddr
<br />
#else
<br />
#&nbsp;&nbsp;&nbsp;&nbsp;$SYSCTL&nbsp;net.ipv4.ip_dynaddr="1"
<br />
#fi
<br />
<br />
#&nbsp;This&nbsp;enables&nbsp;SYN&nbsp;flood&nbsp;protection.
<br />
#&nbsp;The&nbsp;SYN&nbsp;cookies&nbsp;activation&nbsp;allows&nbsp;your&nbsp;system&nbsp;to&nbsp;accept&nbsp;an&nbsp;unlimited
<br />
#&nbsp;number&nbsp;of&nbsp;TCP&nbsp;connections&nbsp;while&nbsp;still&nbsp;trying&nbsp;to&nbsp;give&nbsp;reasonable
<br />
#&nbsp;service&nbsp;during&nbsp;a&nbsp;denial&nbsp;of&nbsp;service&nbsp;attack.
<br />
if&nbsp;[&nbsp;"$SYSCTL"&nbsp;=&nbsp;""&nbsp;]
<br />
then
<br />
&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"1"&nbsp;&gt;;&nbsp;/proc/sys/net/ipv4/tcp_syncookies
<br />
else
<br />
&nbsp;&nbsp;&nbsp;&nbsp;$SYSCTL&nbsp;net.ipv4.tcp_syncookies="1"
<br />
fi
<br />
<br />
#&nbsp;This&nbsp;enables&nbsp;source&nbsp;validation&nbsp;by&nbsp;reversed&nbsp;path&nbsp;according&nbsp;to&nbsp;RFC1812.
<br />
#&nbsp;In&nbsp;other&nbsp;words,&nbsp;did&nbsp;the&nbsp;response&nbsp;packet&nbsp;originate&nbsp;from&nbsp;the&nbsp;same&nbsp;interface
<br />
#&nbsp;through&nbsp;which&nbsp;the&nbsp;source&nbsp;packet&nbsp;was&nbsp;sent?&nbsp;&nbsp;It's&nbsp;recommended&nbsp;for&nbsp;single-homed
<br />
#&nbsp;systems&nbsp;and&nbsp;routers&nbsp;on&nbsp;stub&nbsp;networks.&nbsp;&nbsp;Since&nbsp;those&nbsp;are&nbsp;the&nbsp;configurations
<br />
#&nbsp;this&nbsp;firewall&nbsp;is&nbsp;designed&nbsp;to&nbsp;support,&nbsp;I&nbsp;turn&nbsp;it&nbsp;on&nbsp;by&nbsp;default.
<br />
#&nbsp;Turn&nbsp;it&nbsp;off&nbsp;if&nbsp;you&nbsp;use&nbsp;multiple&nbsp;NICs&nbsp;connected&nbsp;to&nbsp;the&nbsp;same&nbsp;network.
<br />
if&nbsp;[&nbsp;"$SYSCTL"&nbsp;=&nbsp;""&nbsp;]
<br />
then
<br />
&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"1"&nbsp;&gt;;&nbsp;/proc/sys/net/ipv4/conf/all/rp_filter
<br />
else
<br />
&nbsp;&nbsp;&nbsp;&nbsp;$SYSCTL&nbsp;net.ipv4.conf.all.rp_filter="1"
<br />
fi
<br />
<br />
#&nbsp;This&nbsp;option&nbsp;allows&nbsp;a&nbsp;subnet&nbsp;to&nbsp;be&nbsp;firewalled&nbsp;with&nbsp;a&nbsp;single&nbsp;IP&nbsp;address.
<br />
#&nbsp;It's&nbsp;used&nbsp;to&nbsp;build&nbsp;a&nbsp;DMZ.&nbsp;&nbsp;Since&nbsp;that's&nbsp;not&nbsp;a&nbsp;focus&nbsp;of&nbsp;this&nbsp;firewall
<br />
#&nbsp;script,&nbsp;it's&nbsp;not&nbsp;enabled&nbsp;by&nbsp;default,&nbsp;but&nbsp;is&nbsp;included&nbsp;for&nbsp;reference.
<br />
#&nbsp;See:&nbsp;http://www.sjdjweis.com/linux/proxyarp/&nbsp;
<br />
#if&nbsp;[&nbsp;"$SYSCTL"&nbsp;=&nbsp;""&nbsp;]
<br />
#then
<br />
#&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"1"&nbsp;&gt;;&nbsp;/proc/sys/net/ipv4/conf/all/proxy_arp
<br />
#else
<br />
#&nbsp;&nbsp;&nbsp;&nbsp;$SYSCTL&nbsp;net.ipv4.conf.all.proxy_arp="1"
<br />
#fi
<br />
<br />
#&nbsp;The&nbsp;following&nbsp;kernel&nbsp;settings&nbsp;were&nbsp;suggested&nbsp;by&nbsp;Alex&nbsp;Weeks.&nbsp;Thanks!
<br />
<br />
#&nbsp;This&nbsp;kernel&nbsp;parameter&nbsp;instructs&nbsp;the&nbsp;kernel&nbsp;to&nbsp;ignore&nbsp;all&nbsp;ICMP
<br />
#&nbsp;echo&nbsp;requests&nbsp;sent&nbsp;to&nbsp;the&nbsp;broadcast&nbsp;address.&nbsp;&nbsp;This&nbsp;prevents
<br />
#&nbsp;a&nbsp;number&nbsp;of&nbsp;smurfs&nbsp;and&nbsp;similar&nbsp;DoS&nbsp;nasty&nbsp;attacks.
<br />
if&nbsp;[&nbsp;"$SYSCTL"&nbsp;=&nbsp;""&nbsp;]
<br />
then
<br />
&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"1"&nbsp;&gt;;&nbsp;/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
<br />
else
<br />
&nbsp;&nbsp;&nbsp;&nbsp;$SYSCTL&nbsp;net.ipv4.icmp_echo_ignore_broadcasts="1"
<br />
fi
<br />
<br />
#&nbsp;This&nbsp;option&nbsp;can&nbsp;be&nbsp;used&nbsp;to&nbsp;accept&nbsp;or&nbsp;refuse&nbsp;source&nbsp;routed
<br />
#&nbsp;packets.&nbsp;&nbsp;It&nbsp;is&nbsp;usually&nbsp;on&nbsp;by&nbsp;default,&nbsp;but&nbsp;is&nbsp;generally
<br />
#&nbsp;considered&nbsp;a&nbsp;security&nbsp;risk.&nbsp;&nbsp;This&nbsp;option&nbsp;turns&nbsp;it&nbsp;off.
<br />
if&nbsp;[&nbsp;"$SYSCTL"&nbsp;=&nbsp;""&nbsp;]
<br />
then
<br />
&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"0"&nbsp;&gt;;&nbsp;/proc/sys/net/ipv4/conf/all/accept_source_route
<br />
else
<br />
&nbsp;&nbsp;&nbsp;&nbsp;$SYSCTL&nbsp;net.ipv4.conf.all.accept_source_route="0"
<br />
fi
<br />
<br />
#&nbsp;This&nbsp;option&nbsp;can&nbsp;disable&nbsp;ICMP&nbsp;redirects.&nbsp;&nbsp;ICMP&nbsp;redirects
<br />
#&nbsp;are&nbsp;generally&nbsp;considered&nbsp;a&nbsp;security&nbsp;risk&nbsp;and&nbsp;shouldn't&nbsp;be
<br />
#&nbsp;needed&nbsp;by&nbsp;most&nbsp;systems&nbsp;using&nbsp;this&nbsp;generator.
<br />
#if&nbsp;[&nbsp;"$SYSCTL"&nbsp;=&nbsp;""&nbsp;]
<br />
#then
<br />
#&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"0"&nbsp;&gt;;&nbsp;/proc/sys/net/ipv4/conf/all/accept_redirects
<br />
#else
<br />
#&nbsp;&nbsp;&nbsp;&nbsp;$SYSCTL&nbsp;net.ipv4.conf.all.accept_redirects="0"
<br />
#fi
<br />
<br />
#&nbsp;However,&nbsp;we'll&nbsp;ensure&nbsp;the&nbsp;secure_redirects&nbsp;option&nbsp;is&nbsp;on&nbsp;instead.
<br />
#&nbsp;This&nbsp;option&nbsp;accepts&nbsp;only&nbsp;from&nbsp;gateways&nbsp;in&nbsp;the&nbsp;default&nbsp;gateways&nbsp;list.
<br />
if&nbsp;[&nbsp;"$SYSCTL"&nbsp;=&nbsp;""&nbsp;]
<br />
then
<br />
&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"1"&nbsp;&gt;;&nbsp;/proc/sys/net/ipv4/conf/all/secure_redirects
<br />
else
<br />
&nbsp;&nbsp;&nbsp;&nbsp;$SYSCTL&nbsp;net.ipv4.conf.all.secure_redirects="1"
<br />
fi
<br />
<br />
#&nbsp;This&nbsp;option&nbsp;logs&nbsp;packets&nbsp;from&nbsp;impossible&nbsp;addresses.
<br />
if&nbsp;[&nbsp;"$SYSCTL"&nbsp;=&nbsp;""&nbsp;]
<br />
then
<br />
&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"1"&nbsp;&gt;;&nbsp;/proc/sys/net/ipv4/conf/all/log_martians
<br />
else
<br />
&nbsp;&nbsp;&nbsp;&nbsp;$SYSCTL&nbsp;net.ipv4.conf.all.log_martians="1"
<br />
fi
<br />
<br />
<br />
###############################################################################
<br />
#
<br />
#&nbsp;Flush&nbsp;Any&nbsp;Existing&nbsp;Rules&nbsp;or&nbsp;Chains
<br />
#
<br />
<br />
echo&nbsp;"Flushing&nbsp;Tables&nbsp;..."
<br />
<br />
#&nbsp;Reset&nbsp;Default&nbsp;Policies
<br />
$IPT&nbsp;-P&nbsp;INPUT&nbsp;ACCEPT
<br />
$IPT&nbsp;-P&nbsp;FORWARD&nbsp;ACCEPT
<br />
$IPT&nbsp;-P&nbsp;OUTPUT&nbsp;ACCEPT
<br />
$IPT&nbsp;-t&nbsp;nat&nbsp;-P&nbsp;PREROUTING&nbsp;ACCEPT
<br />
$IPT&nbsp;-t&nbsp;nat&nbsp;-P&nbsp;POSTROUTING&nbsp;ACCEPT
<br />
$IPT&nbsp;-t&nbsp;nat&nbsp;-P&nbsp;OUTPUT&nbsp;ACCEPT
<br />
$IPT&nbsp;-t&nbsp;mangle&nbsp;-P&nbsp;PREROUTING&nbsp;ACCEPT
<br />
$IPT&nbsp;-t&nbsp;mangle&nbsp;-P&nbsp;OUTPUT&nbsp;ACCEPT
<br />
<br />
#&nbsp;Flush&nbsp;all&nbsp;rules
<br />
$IPT&nbsp;-F
<br />
$IPT&nbsp;-t&nbsp;nat&nbsp;-F
<br />
$IPT&nbsp;-t&nbsp;mangle&nbsp;-F
<br />
<br />
#&nbsp;Erase&nbsp;all&nbsp;non-default&nbsp;chains
<br />
$IPT&nbsp;-X
<br />
$IPT&nbsp;-t&nbsp;nat&nbsp;-X
<br />
$IPT&nbsp;-t&nbsp;mangle&nbsp;-X
<br />
<br />
if&nbsp;[&nbsp;"$1"&nbsp;=&nbsp;"stop"&nbsp;]
<br />
then
<br />
echo&nbsp;"Firewall&nbsp;completely&nbsp;flushed!&nbsp;&nbsp;Now&nbsp;running&nbsp;with&nbsp;no&nbsp;firewall."
<br />
exit&nbsp;0
<br />
fi
<br />
<br />
###############################################################################
<br />
#
<br />
#&nbsp;Rules&nbsp;Configuration
<br />
#
<br />
<br />
###############################################################################
<br />
#
<br />
#&nbsp;Filter&nbsp;Table
<br />
#
<br />
###############################################################################
<br />
<br />
#&nbsp;Set&nbsp;Policies
<br />
<br />
$IPT&nbsp;-P&nbsp;INPUT&nbsp;DROP
<br />
$IPT&nbsp;-P&nbsp;OUTPUT&nbsp;DROP
<br />
$IPT&nbsp;-P&nbsp;FORWARD&nbsp;DROP
<br />
<br />
###############################################################################
<br />
#
<br />
#&nbsp;User-Specified&nbsp;Chains
<br />
#
<br />
#&nbsp;Create&nbsp;user&nbsp;chains&nbsp;to&nbsp;reduce&nbsp;the&nbsp;number&nbsp;of&nbsp;rules&nbsp;each&nbsp;packet
<br />
#&nbsp;must&nbsp;traverse.
<br />
<br />
echo&nbsp;"Create&nbsp;and&nbsp;populate&nbsp;custom&nbsp;rule&nbsp;chains&nbsp;..."
<br />
<br />
#&nbsp;Create&nbsp;a&nbsp;chain&nbsp;to&nbsp;filter&nbsp;INVALID&nbsp;packets
<br />
<br />
$IPT&nbsp;-N&nbsp;bad_packets
<br />
<br />
#&nbsp;Create&nbsp;another&nbsp;chain&nbsp;to&nbsp;filter&nbsp;bad&nbsp;tcp&nbsp;packets
<br />
<br />
$IPT&nbsp;-N&nbsp;bad_tcp_packets
<br />
<br />
#&nbsp;Create&nbsp;separate&nbsp;chains&nbsp;for&nbsp;icmp,&nbsp;tcp&nbsp;(incoming&nbsp;and&nbsp;outgoing),
<br />
#&nbsp;and&nbsp;incoming&nbsp;udp&nbsp;packets.
<br />
<br />
$IPT&nbsp;-N&nbsp;icmp_packets
<br />
<br />
#&nbsp;Used&nbsp;for&nbsp;UDP&nbsp;packets&nbsp;inbound&nbsp;from&nbsp;the&nbsp;Internet
<br />
$IPT&nbsp;-N&nbsp;udp_inbound
<br />
<br />
#&nbsp;Used&nbsp;to&nbsp;block&nbsp;outbound&nbsp;UDP&nbsp;services&nbsp;from&nbsp;internal&nbsp;network
<br />
#&nbsp;Default&nbsp;to&nbsp;allow&nbsp;all
<br />
$IPT&nbsp;-N&nbsp;udp_outbound
<br />
<br />
#&nbsp;Used&nbsp;to&nbsp;allow&nbsp;inbound&nbsp;services&nbsp;if&nbsp;desired
<br />
#&nbsp;Default&nbsp;fail&nbsp;except&nbsp;for&nbsp;established&nbsp;sessions
<br />
$IPT&nbsp;-N&nbsp;tcp_inbound
<br />
<br />
#&nbsp;Used&nbsp;to&nbsp;block&nbsp;outbound&nbsp;services&nbsp;from&nbsp;internal&nbsp;network
<br />
#&nbsp;Default&nbsp;to&nbsp;allow&nbsp;all
<br />
$IPT&nbsp;-N&nbsp;tcp_outbound
<br />
<br />
###############################################################################
<br />
#
<br />
#&nbsp;Populate&nbsp;User&nbsp;Chains
<br />
#
<br />
<br />
#&nbsp;bad_packets&nbsp;chain
<br />
#
<br />
#&nbsp;Drop&nbsp;INVALID&nbsp;packets&nbsp;immediately
<br />
<br />
$IPT&nbsp;-A&nbsp;bad_packets&nbsp;-p&nbsp;ALL&nbsp;-m&nbsp;state&nbsp;--state&nbsp;INVALID&nbsp;-j&nbsp;LOG&nbsp;"
<br />
&nbsp;&nbsp;&nbsp;&nbsp;--log-prefix&nbsp;"Invalid&nbsp;packet:&nbsp;"
<br />
<br />
$IPT&nbsp;-A&nbsp;bad_packets&nbsp;-p&nbsp;ALL&nbsp;-m&nbsp;state&nbsp;--state&nbsp;INVALID&nbsp;-j&nbsp;DROP
<br />
<br />
#&nbsp;Then&nbsp;check&nbsp;the&nbsp;tcp&nbsp;packets&nbsp;for&nbsp;additional&nbsp;problems
<br />
$IPT&nbsp;-A&nbsp;bad_packets&nbsp;-p&nbsp;tcp&nbsp;-j&nbsp;bad_tcp_packets
<br />
<br />
#&nbsp;All&nbsp;good,&nbsp;so&nbsp;return
<br />
$IPT&nbsp;-A&nbsp;bad_packets&nbsp;-p&nbsp;ALL&nbsp;-j&nbsp;RETURN
<br />
<br />
#&nbsp;bad_tcp_packets&nbsp;chain
<br />
#
<br />
#&nbsp;All&nbsp;tcp&nbsp;packets&nbsp;will&nbsp;traverse&nbsp;this&nbsp;chain.
<br />
#&nbsp;Every&nbsp;new&nbsp;connection&nbsp;attempt&nbsp;should&nbsp;begin&nbsp;with
<br />
#&nbsp;a&nbsp;syn&nbsp;packet.&nbsp;&nbsp;If&nbsp;it&nbsp;doesn't,&nbsp;it&nbsp;is&nbsp;likely&nbsp;a
<br />
#&nbsp;port&nbsp;scan.&nbsp;&nbsp;This&nbsp;drops&nbsp;packets&nbsp;in&nbsp;state
<br />
#&nbsp;NEW&nbsp;that&nbsp;are&nbsp;not&nbsp;flagged&nbsp;as&nbsp;syn&nbsp;packets.
<br />
<br />
<br />
$IPT&nbsp;-A&nbsp;bad_tcp_packets&nbsp;-p&nbsp;tcp&nbsp;!&nbsp;--syn&nbsp;-m&nbsp;state&nbsp;--state&nbsp;NEW&nbsp;-j&nbsp;LOG&nbsp;"
<br />
&nbsp;&nbsp;&nbsp;&nbsp;--log-prefix&nbsp;"New&nbsp;not&nbsp;syn:&nbsp;"
<br />
$IPT&nbsp;-A&nbsp;bad_tcp_packets&nbsp;-p&nbsp;tcp&nbsp;!&nbsp;--syn&nbsp;-m&nbsp;state&nbsp;--state&nbsp;NEW&nbsp;-j&nbsp;DROP
<br />
<br />
#&nbsp;All&nbsp;good,&nbsp;so&nbsp;return
<br />
$IPT&nbsp;-A&nbsp;bad_tcp_packets&nbsp;-p&nbsp;tcp&nbsp;-j&nbsp;RETURN
<br />
<br />
#&nbsp;icmp_packets&nbsp;chain
<br />
#
<br />
#&nbsp;This&nbsp;chain&nbsp;is&nbsp;for&nbsp;inbound&nbsp;(from&nbsp;the&nbsp;Internet)&nbsp;icmp&nbsp;packets&nbsp;only.
<br />
#&nbsp;Type&nbsp;8&nbsp;(Echo&nbsp;Request)&nbsp;is&nbsp;not&nbsp;accepted&nbsp;by&nbsp;default
<br />
#&nbsp;Enable&nbsp;it&nbsp;if&nbsp;you&nbsp;want&nbsp;remote&nbsp;hosts&nbsp;to&nbsp;be&nbsp;able&nbsp;to&nbsp;reach&nbsp;you.
<br />
#&nbsp;11&nbsp;(Time&nbsp;Exceeded)&nbsp;is&nbsp;the&nbsp;only&nbsp;one&nbsp;accepted
<br />
#&nbsp;that&nbsp;would&nbsp;not&nbsp;already&nbsp;be&nbsp;covered&nbsp;by&nbsp;the&nbsp;established
<br />
#&nbsp;connection&nbsp;rule.&nbsp;&nbsp;Applied&nbsp;to&nbsp;INPUT&nbsp;on&nbsp;the&nbsp;external&nbsp;interface.
<br />
#&nbsp;
<br />
#&nbsp;See:&nbsp;http://www.ee.siue.edu/~rwalden/networking/icmp.html
<br />
#&nbsp;for&nbsp;more&nbsp;info&nbsp;on&nbsp;ICMP&nbsp;types.
<br />
#
<br />
#&nbsp;Note&nbsp;that&nbsp;the&nbsp;stateful&nbsp;settings&nbsp;allow&nbsp;replies&nbsp;to&nbsp;ICMP&nbsp;packets.
<br />
#&nbsp;These&nbsp;rules&nbsp;allow&nbsp;new&nbsp;packets&nbsp;of&nbsp;the&nbsp;specified&nbsp;types.
<br />
<br />
#&nbsp;ICMP&nbsp;packets&nbsp;should&nbsp;fit&nbsp;in&nbsp;a&nbsp;Layer&nbsp;2&nbsp;frame,&nbsp;thus&nbsp;they&nbsp;should
<br />
#&nbsp;never&nbsp;be&nbsp;fragmented.&nbsp;&nbsp;Fragmented&nbsp;ICMP&nbsp;packets&nbsp;are&nbsp;a&nbsp;typical&nbsp;sign
<br />
#&nbsp;of&nbsp;a&nbsp;denial&nbsp;of&nbsp;service&nbsp;attack.
<br />
$IPT&nbsp;-A&nbsp;icmp_packets&nbsp;--fragment&nbsp;-p&nbsp;ICMP&nbsp;-j&nbsp;LOG&nbsp;"
<br />
&nbsp;&nbsp;&nbsp;&nbsp;--log-prefix&nbsp;"ICMP&nbsp;Fragment:&nbsp;"
<br />
$IPT&nbsp;-A&nbsp;icmp_packets&nbsp;--fragment&nbsp;-p&nbsp;ICMP&nbsp;-j&nbsp;DROP
<br />
<br />
#&nbsp;Echo&nbsp;-&nbsp;uncomment&nbsp;to&nbsp;allow&nbsp;your&nbsp;system&nbsp;to&nbsp;be&nbsp;pinged.
<br />
#&nbsp;Uncomment&nbsp;the&nbsp;LOG&nbsp;command&nbsp;if&nbsp;you&nbsp;also&nbsp;want&nbsp;to&nbsp;log&nbsp;PING&nbsp;attempts
<br />
#&nbsp;
<br />
#&nbsp;$IPT&nbsp;-A&nbsp;icmp_packets&nbsp;-p&nbsp;ICMP&nbsp;-s&nbsp;0/0&nbsp;--icmp-type&nbsp;8&nbsp;-j&nbsp;LOG&nbsp;"
<br />
#&nbsp;&nbsp;&nbsp;&nbsp;--log-prefix&nbsp;"Ping&nbsp;detected:&nbsp;"
<br />
#&nbsp;$IPT&nbsp;-A&nbsp;icmp_packets&nbsp;-p&nbsp;ICMP&nbsp;-s&nbsp;0/0&nbsp;--icmp-type&nbsp;8&nbsp;-j&nbsp;ACCEPT
<br />
<br />
#&nbsp;Time&nbsp;Exceeded
<br />
$IPT&nbsp;-A&nbsp;icmp_packets&nbsp;-p&nbsp;ICMP&nbsp;-s&nbsp;0/0&nbsp;--icmp-type&nbsp;11&nbsp;-j&nbsp;ACCEPT
<br />
<br />
#&nbsp;Not&nbsp;matched,&nbsp;so&nbsp;return&nbsp;so&nbsp;it&nbsp;will&nbsp;be&nbsp;logged
<br />
$IPT&nbsp;-A&nbsp;icmp_packets&nbsp;-p&nbsp;ICMP&nbsp;-j&nbsp;RETURN
<br />
<br />
#&nbsp;TCP&nbsp;&amp;&nbsp;UDP
<br />
#&nbsp;Identify&nbsp;ports&nbsp;at:
<br />
#&nbsp;&nbsp;&nbsp;&nbsp;http://www.chebucto.ns.ca/~rakerman/port-table.html
<br />
#&nbsp;&nbsp;&nbsp;&nbsp;http://www.iana.org/assignments/port-numbers
<br />
<br />
#&nbsp;udp_inbound&nbsp;chain
<br />
#
<br />
#&nbsp;This&nbsp;chain&nbsp;describes&nbsp;the&nbsp;inbound&nbsp;UDP&nbsp;packets&nbsp;it&nbsp;will&nbsp;accept.
<br />
#&nbsp;It's&nbsp;applied&nbsp;to&nbsp;INPUT&nbsp;on&nbsp;the&nbsp;external&nbsp;or&nbsp;Internet&nbsp;interface.
<br />
#&nbsp;Note&nbsp;that&nbsp;the&nbsp;stateful&nbsp;settings&nbsp;allow&nbsp;replies.
<br />
#&nbsp;These&nbsp;rules&nbsp;are&nbsp;for&nbsp;new&nbsp;requests.
<br />
#&nbsp;It&nbsp;drops&nbsp;netbios&nbsp;packets&nbsp;(windows)&nbsp;immediately&nbsp;without&nbsp;logging.
<br />
<br />
#&nbsp;Drop&nbsp;netbios&nbsp;calls
<br />
#&nbsp;Please&nbsp;note&nbsp;that&nbsp;these&nbsp;rules&nbsp;do&nbsp;not&nbsp;really&nbsp;change&nbsp;the&nbsp;way&nbsp;the&nbsp;firewall
<br />
#&nbsp;treats&nbsp;netbios&nbsp;connections.&nbsp;&nbsp;Connections&nbsp;from&nbsp;the&nbsp;localhost&nbsp;and
<br />
#&nbsp;internal&nbsp;interface&nbsp;(if&nbsp;one&nbsp;exists)&nbsp;are&nbsp;accepted&nbsp;by&nbsp;default.
<br />
#&nbsp;Responses&nbsp;from&nbsp;the&nbsp;Internet&nbsp;to&nbsp;requests&nbsp;initiated&nbsp;by&nbsp;or&nbsp;through
<br />
#&nbsp;the&nbsp;firewall&nbsp;are&nbsp;also&nbsp;accepted&nbsp;by&nbsp;default.&nbsp;&nbsp;To&nbsp;get&nbsp;here,&nbsp;the
<br />
#&nbsp;packets&nbsp;would&nbsp;have&nbsp;to&nbsp;be&nbsp;part&nbsp;of&nbsp;a&nbsp;new&nbsp;request&nbsp;received&nbsp;by&nbsp;the
<br />
#&nbsp;Internet&nbsp;interface.&nbsp;&nbsp;You&nbsp;would&nbsp;have&nbsp;to&nbsp;manually&nbsp;add&nbsp;rules&nbsp;to
<br />
#&nbsp;accept&nbsp;these.&nbsp;&nbsp;I&nbsp;added&nbsp;these&nbsp;rules&nbsp;because&nbsp;some&nbsp;network&nbsp;connections,
<br />
#&nbsp;such&nbsp;as&nbsp;those&nbsp;via&nbsp;cable&nbsp;modems,&nbsp;tend&nbsp;to&nbsp;be&nbsp;filled&nbsp;with&nbsp;noise&nbsp;from
<br />
#&nbsp;unprotected&nbsp;Windows&nbsp;machines.&nbsp;&nbsp;These&nbsp;rules&nbsp;drop&nbsp;those&nbsp;packets
<br />
#&nbsp;quickly&nbsp;and&nbsp;without&nbsp;logging&nbsp;them.&nbsp;&nbsp;This&nbsp;prevents&nbsp;them&nbsp;from&nbsp;traversing
<br />
#&nbsp;the&nbsp;whole&nbsp;chain&nbsp;and&nbsp;keeps&nbsp;the&nbsp;log&nbsp;from&nbsp;getting&nbsp;cluttered&nbsp;with
<br />
#&nbsp;chatter&nbsp;from&nbsp;Windows&nbsp;systems.
<br />
$IPT&nbsp;-A&nbsp;udp_inbound&nbsp;-p&nbsp;UDP&nbsp;-s&nbsp;0/0&nbsp;--destination-port&nbsp;137&nbsp;-j&nbsp;DROP
<br />
$IPT&nbsp;-A&nbsp;udp_inbound&nbsp;-p&nbsp;UDP&nbsp;-s&nbsp;0/0&nbsp;--destination-port&nbsp;138&nbsp;-j&nbsp;DROP
<br />
<br />
<br />
#&nbsp;Not&nbsp;matched,&nbsp;so&nbsp;return&nbsp;for&nbsp;logging
<br />
$IPT&nbsp;-A&nbsp;udp_inbound&nbsp;-p&nbsp;UDP&nbsp;-j&nbsp;RETURN
<br />
<br />
#&nbsp;udp_outbound&nbsp;chain
<br />
#
<br />
#&nbsp;This&nbsp;chain&nbsp;is&nbsp;used&nbsp;with&nbsp;a&nbsp;private&nbsp;network&nbsp;to&nbsp;prevent&nbsp;forwarding&nbsp;for
<br />
#&nbsp;UDP&nbsp;requests&nbsp;on&nbsp;specific&nbsp;protocols.&nbsp;&nbsp;Applied&nbsp;to&nbsp;the&nbsp;FORWARD&nbsp;rule&nbsp;from
<br />
#&nbsp;the&nbsp;internal&nbsp;network.&nbsp;&nbsp;Ends&nbsp;with&nbsp;an&nbsp;ACCEPT
<br />
<br />
<br />
#&nbsp;No&nbsp;match,&nbsp;so&nbsp;ACCEPT
<br />
$IPT&nbsp;-A&nbsp;udp_outbound&nbsp;-p&nbsp;UDP&nbsp;-s&nbsp;0/0&nbsp;-j&nbsp;ACCEPT
<br />
<br />
#&nbsp;tcp_inbound&nbsp;chain
<br />
#
<br />
#&nbsp;This&nbsp;chain&nbsp;is&nbsp;used&nbsp;to&nbsp;allow&nbsp;inbound&nbsp;connections&nbsp;to&nbsp;the
<br />
#&nbsp;system/gateway.&nbsp;&nbsp;Use&nbsp;with&nbsp;care.&nbsp;&nbsp;It&nbsp;defaults&nbsp;to&nbsp;none.
<br />
#&nbsp;It's&nbsp;applied&nbsp;on&nbsp;INPUT&nbsp;from&nbsp;the&nbsp;external&nbsp;or&nbsp;Internet&nbsp;interface.
<br />
<br />
#&nbsp;Web&nbsp;Server
<br />
<br />
#&nbsp;HTTP
<br />
$IPT&nbsp;-A&nbsp;tcp_inbound&nbsp;-p&nbsp;TCP&nbsp;-s&nbsp;0/0&nbsp;--destination-port&nbsp;80&nbsp;-j&nbsp;ACCEPT
<br />
<br />
#&nbsp;HTTPS&nbsp;(Secure&nbsp;Web&nbsp;Server)
<br />
$IPT&nbsp;-A&nbsp;tcp_inbound&nbsp;-p&nbsp;TCP&nbsp;-s&nbsp;0/0&nbsp;--destination-port&nbsp;443&nbsp;-j&nbsp;ACCEPT
<br />
<br />
#&nbsp;sshd
<br />
$IPT&nbsp;-A&nbsp;tcp_inbound&nbsp;-p&nbsp;TCP&nbsp;-s&nbsp;0/0&nbsp;--destination-port&nbsp;22&nbsp;-j&nbsp;ACCEPT
<br />
<br />
<br />
#&nbsp;Not&nbsp;matched,&nbsp;so&nbsp;return&nbsp;so&nbsp;it&nbsp;will&nbsp;be&nbsp;logged
<br />
$IPT&nbsp;-A&nbsp;tcp_inbound&nbsp;-p&nbsp;TCP&nbsp;-j&nbsp;RETURN
<br />
<br />
#&nbsp;tcp_outbound&nbsp;chain
<br />
#
<br />
#&nbsp;This&nbsp;chain&nbsp;is&nbsp;used&nbsp;with&nbsp;a&nbsp;private&nbsp;network&nbsp;to&nbsp;prevent&nbsp;forwarding&nbsp;for
<br />
#&nbsp;requests&nbsp;on&nbsp;specific&nbsp;protocols.&nbsp;&nbsp;Applied&nbsp;to&nbsp;the&nbsp;FORWARD&nbsp;rule&nbsp;from
<br />
#&nbsp;the&nbsp;internal&nbsp;network.&nbsp;&nbsp;Ends&nbsp;with&nbsp;an&nbsp;ACCEPT
<br />
<br />
<br />
#&nbsp;No&nbsp;match,&nbsp;so&nbsp;ACCEPT
<br />
$IPT&nbsp;-A&nbsp;tcp_outbound&nbsp;-p&nbsp;TCP&nbsp;-s&nbsp;0/0&nbsp;-j&nbsp;ACCEPT
<br />
<br />
###############################################################################
<br />
#
<br />
#&nbsp;INPUT&nbsp;Chain
<br />
#
<br />
<br />
echo&nbsp;"Process&nbsp;INPUT&nbsp;chain&nbsp;..."
<br />
<br />
#&nbsp;Allow&nbsp;all&nbsp;on&nbsp;localhost&nbsp;interface
<br />
$IPT&nbsp;-A&nbsp;INPUT&nbsp;-p&nbsp;ALL&nbsp;-i&nbsp;$LO_IFACE&nbsp;-j&nbsp;ACCEPT
<br />
<br />
#&nbsp;Drop&nbsp;bad&nbsp;packets
<br />
$IPT&nbsp;-A&nbsp;INPUT&nbsp;-p&nbsp;ALL&nbsp;-j&nbsp;bad_packets
<br />
<br />
#&nbsp;DOCSIS&nbsp;compliant&nbsp;cable&nbsp;modems
<br />
#&nbsp;Some&nbsp;DOCSIS&nbsp;compliant&nbsp;cable&nbsp;modems&nbsp;send&nbsp;IGMP&nbsp;multicasts&nbsp;to&nbsp;find
<br />
#&nbsp;connected&nbsp;PCs.&nbsp;&nbsp;The&nbsp;multicast&nbsp;packets&nbsp;have&nbsp;the&nbsp;destination&nbsp;address
<br />
#&nbsp;224.0.0.1.&nbsp;&nbsp;You&nbsp;can&nbsp;accept&nbsp;them.&nbsp;&nbsp;If&nbsp;you&nbsp;choose&nbsp;to&nbsp;do&nbsp;so,
<br />
#&nbsp;Uncomment&nbsp;the&nbsp;rule&nbsp;to&nbsp;ACCEPT&nbsp;them&nbsp;and&nbsp;comment&nbsp;the&nbsp;rule&nbsp;to&nbsp;DROP
<br />
#&nbsp;them&nbsp;&nbsp;The&nbsp;firewall&nbsp;will&nbsp;drop&nbsp;them&nbsp;here&nbsp;by&nbsp;default&nbsp;to&nbsp;avoid
<br />
#&nbsp;cluttering&nbsp;the&nbsp;log.&nbsp;&nbsp;The&nbsp;firewall&nbsp;will&nbsp;drop&nbsp;all&nbsp;multicasts
<br />
#&nbsp;to&nbsp;the&nbsp;entire&nbsp;subnet&nbsp;(224.0.0.1)&nbsp;by&nbsp;default.&nbsp;&nbsp;To&nbsp;only&nbsp;affect
<br />
#&nbsp;IGMP&nbsp;multicasts,&nbsp;change&nbsp;'-p&nbsp;ALL'&nbsp;to&nbsp;'-p&nbsp;2'.&nbsp;&nbsp;Of&nbsp;course,
<br />
#&nbsp;if&nbsp;they&nbsp;aren't&nbsp;accepted&nbsp;elsewhere,&nbsp;it&nbsp;will&nbsp;only&nbsp;ensure&nbsp;that
<br />
#&nbsp;multicasts&nbsp;on&nbsp;other&nbsp;protocols&nbsp;are&nbsp;logged.
<br />
#&nbsp;Drop&nbsp;them&nbsp;without&nbsp;logging.
<br />
$IPT&nbsp;-A&nbsp;INPUT&nbsp;-p&nbsp;ALL&nbsp;-d&nbsp;224.0.0.1&nbsp;-j&nbsp;DROP
<br />
#&nbsp;The&nbsp;rule&nbsp;to&nbsp;accept&nbsp;the&nbsp;packets.
<br />
#&nbsp;$IPT&nbsp;-A&nbsp;INPUT&nbsp;-p&nbsp;ALL&nbsp;-d&nbsp;224.0.0.1&nbsp;-j&nbsp;ACCEPT
<br />
<br />
<br />
#&nbsp;Inbound&nbsp;Internet&nbsp;Packet&nbsp;Rules
<br />
<br />
#&nbsp;Accept&nbsp;Established&nbsp;Connections
<br />
$IPT&nbsp;-A&nbsp;INPUT&nbsp;-p&nbsp;ALL&nbsp;-i&nbsp;$INET_IFACE&nbsp;-m&nbsp;state&nbsp;--state&nbsp;ESTABLISHED,RELATED&nbsp;"
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-j&nbsp;ACCEPT
<br />
<br />
#&nbsp;Route&nbsp;the&nbsp;rest&nbsp;to&nbsp;the&nbsp;appropriate&nbsp;user&nbsp;chain
<br />
$IPT&nbsp;-A&nbsp;INPUT&nbsp;-p&nbsp;TCP&nbsp;-i&nbsp;$INET_IFACE&nbsp;-j&nbsp;tcp_inbound
<br />
$IPT&nbsp;-A&nbsp;INPUT&nbsp;-p&nbsp;UDP&nbsp;-i&nbsp;$INET_IFACE&nbsp;-j&nbsp;udp_inbound
<br />
$IPT&nbsp;-A&nbsp;INPUT&nbsp;-p&nbsp;ICMP&nbsp;-i&nbsp;$INET_IFACE&nbsp;-j&nbsp;icmp_packets
<br />
<br />
#&nbsp;Drop&nbsp;without&nbsp;logging&nbsp;broadcasts&nbsp;that&nbsp;get&nbsp;this&nbsp;far.
<br />
#&nbsp;Cuts&nbsp;down&nbsp;on&nbsp;log&nbsp;clutter.
<br />
#&nbsp;Comment&nbsp;this&nbsp;line&nbsp;if&nbsp;testing&nbsp;new&nbsp;rules&nbsp;that&nbsp;impact
<br />
#&nbsp;broadcast&nbsp;protocols.
<br />
$IPT&nbsp;-A&nbsp;INPUT&nbsp;-p&nbsp;ALL&nbsp;-d&nbsp;255.255.255.255&nbsp;-j&nbsp;DROP
<br />
<br />
#&nbsp;Log&nbsp;packets&nbsp;that&nbsp;still&nbsp;don't&nbsp;match
<br />
$IPT&nbsp;-A&nbsp;INPUT&nbsp;-m&nbsp;limit&nbsp;--limit&nbsp;3/minute&nbsp;--limit-burst&nbsp;3&nbsp;-j&nbsp;LOG&nbsp;"
<br />
&nbsp;&nbsp;&nbsp;&nbsp;--log-prefix&nbsp;"INPUT&nbsp;packet&nbsp;died:&nbsp;"
<br />
<br />
###############################################################################
<br />
#
<br />
#&nbsp;FORWARD&nbsp;Chain
<br />
#
<br />
<br />
echo&nbsp;"Process&nbsp;FORWARD&nbsp;chain&nbsp;..."
<br />
<br />
#&nbsp;Used&nbsp;if&nbsp;forwarding&nbsp;for&nbsp;a&nbsp;private&nbsp;network
<br />
<br />
<br />
###############################################################################
<br />
#
<br />
#&nbsp;OUTPUT&nbsp;Chain
<br />
#
<br />
<br />
echo&nbsp;"Process&nbsp;OUTPUT&nbsp;chain&nbsp;..."
<br />
<br />
#&nbsp;Generally&nbsp;trust&nbsp;the&nbsp;firewall&nbsp;on&nbsp;output
<br />
<br />
#&nbsp;However,&nbsp;invalid&nbsp;icmp&nbsp;packets&nbsp;need&nbsp;to&nbsp;be&nbsp;dropped
<br />
#&nbsp;to&nbsp;prevent&nbsp;a&nbsp;possible&nbsp;exploit.
<br />
$IPT&nbsp;-A&nbsp;OUTPUT&nbsp;-m&nbsp;state&nbsp;-p&nbsp;icmp&nbsp;--state&nbsp;INVALID&nbsp;-j&nbsp;DROP
<br />
<br />
#&nbsp;Localhost
<br />
$IPT&nbsp;-A&nbsp;OUTPUT&nbsp;-p&nbsp;ALL&nbsp;-s&nbsp;$LO_IP&nbsp;-j&nbsp;ACCEPT
<br />
$IPT&nbsp;-A&nbsp;OUTPUT&nbsp;-p&nbsp;ALL&nbsp;-o&nbsp;$LO_IFACE&nbsp;-j&nbsp;ACCEPT
<br />
<br />
#&nbsp;To&nbsp;internet
<br />
$IPT&nbsp;-A&nbsp;OUTPUT&nbsp;-p&nbsp;ALL&nbsp;-o&nbsp;$INET_IFACE&nbsp;-j&nbsp;ACCEPT
<br />
<br />
#&nbsp;Log&nbsp;packets&nbsp;that&nbsp;still&nbsp;don't&nbsp;match
<br />
$IPT&nbsp;-A&nbsp;OUTPUT&nbsp;-m&nbsp;limit&nbsp;--limit&nbsp;3/minute&nbsp;--limit-burst&nbsp;3&nbsp;-j&nbsp;LOG&nbsp;"
<br />
&nbsp;&nbsp;&nbsp;&nbsp;--log-prefix&nbsp;"OUTPUT&nbsp;packet&nbsp;died:&nbsp;"
<br />
<br />
###############################################################################
<br />
#
<br />
#&nbsp;nat&nbsp;table
<br />
#
<br />
###############################################################################
<br />
<br />
#&nbsp;The&nbsp;nat&nbsp;table&nbsp;is&nbsp;where&nbsp;network&nbsp;address&nbsp;translation&nbsp;occurs&nbsp;if&nbsp;there
<br />
#&nbsp;is&nbsp;a&nbsp;private&nbsp;network.&nbsp;&nbsp;If&nbsp;the&nbsp;gateway&nbsp;is&nbsp;connected&nbsp;to&nbsp;the&nbsp;Internet
<br />
#&nbsp;with&nbsp;a&nbsp;static&nbsp;IP,&nbsp;snat&nbsp;is&nbsp;used.&nbsp;&nbsp;If&nbsp;the&nbsp;gateway&nbsp;has&nbsp;a&nbsp;dynamic&nbsp;address,
<br />
#&nbsp;masquerade&nbsp;must&nbsp;be&nbsp;used&nbsp;instead.&nbsp;&nbsp;There&nbsp;is&nbsp;more&nbsp;overhead&nbsp;associated
<br />
#&nbsp;with&nbsp;masquerade,&nbsp;so&nbsp;snat&nbsp;is&nbsp;better&nbsp;when&nbsp;it&nbsp;can&nbsp;be&nbsp;used.
<br />
#&nbsp;The&nbsp;nat&nbsp;table&nbsp;has&nbsp;a&nbsp;builtin&nbsp;chain,&nbsp;PREROUTING,&nbsp;for&nbsp;dnat&nbsp;and&nbsp;redirects.
<br />
#&nbsp;Another,&nbsp;POSTROUTING,&nbsp;handles&nbsp;snat&nbsp;and&nbsp;masquerade.
<br />
<br />
echo&nbsp;"Load&nbsp;rules&nbsp;for&nbsp;nat&nbsp;table&nbsp;..."
<br />
<br />
###############################################################################
<br />
#
<br />
#&nbsp;PREROUTING&nbsp;chain
<br />
#
<br />
<br />
<br />
###############################################################################
<br />
#
<br />
#&nbsp;POSTROUTING&nbsp;chain
<br />
#
<br />
<br />
<br />
###############################################################################
<br />
#
<br />
#&nbsp;mangle&nbsp;table
<br />
#
<br />
###############################################################################
<br />
<br />
#&nbsp;The&nbsp;mangle&nbsp;table&nbsp;is&nbsp;used&nbsp;to&nbsp;alter&nbsp;packets.&nbsp;&nbsp;It&nbsp;can&nbsp;alter&nbsp;or&nbsp;mangle&nbsp;them&nbsp;in
<br />
#&nbsp;several&nbsp;ways.&nbsp;&nbsp;For&nbsp;the&nbsp;purposes&nbsp;of&nbsp;this&nbsp;generator,&nbsp;we&nbsp;only&nbsp;use&nbsp;its&nbsp;ability
<br />
#&nbsp;to&nbsp;alter&nbsp;the&nbsp;TTL&nbsp;in&nbsp;packets.&nbsp;&nbsp;However,&nbsp;it&nbsp;can&nbsp;be&nbsp;used&nbsp;to&nbsp;set&nbsp;netfilter
<br />
#&nbsp;mark&nbsp;values&nbsp;on&nbsp;specific&nbsp;packets.&nbsp;&nbsp;Those&nbsp;marks&nbsp;could&nbsp;then&nbsp;be&nbsp;used&nbsp;in&nbsp;another
<br />
#&nbsp;table&nbsp;like&nbsp;filter,&nbsp;to&nbsp;limit&nbsp;activities&nbsp;associated&nbsp;with&nbsp;a&nbsp;specific&nbsp;host,&nbsp;for
<br />
#&nbsp;instance.&nbsp;&nbsp;The&nbsp;TOS&nbsp;target&nbsp;can&nbsp;be&nbsp;used&nbsp;to&nbsp;set&nbsp;the&nbsp;Type&nbsp;of&nbsp;Service&nbsp;field&nbsp;in
<br />
#&nbsp;the&nbsp;IP&nbsp;header.&nbsp;&nbsp;Note&nbsp;that&nbsp;the&nbsp;TTL&nbsp;target&nbsp;might&nbsp;not&nbsp;be&nbsp;included&nbsp;in&nbsp;the
<br />
#&nbsp;distribution&nbsp;on&nbsp;your&nbsp;system.&nbsp;&nbsp;If&nbsp;it&nbsp;is&nbsp;not&nbsp;and&nbsp;you&nbsp;require&nbsp;it,&nbsp;you&nbsp;will
<br />
#&nbsp;have&nbsp;to&nbsp;add&nbsp;it.&nbsp;&nbsp;That&nbsp;may&nbsp;require&nbsp;that&nbsp;you&nbsp;build&nbsp;from&nbsp;source.
<br />
<br />
echo&nbsp;"Load&nbsp;rules&nbsp;for&nbsp;mangle&nbsp;table&nbsp;..."
<br />
<br />
<br />
<br />
至此，此web服务器已组建成功.<br />
</p>
<p><br />
</p>
<img src ="http://www.blogjava.net/franky/aggbug/323424.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/franky/" target="_blank">Franky</a> 2010-06-12 14:38 <a href="http://www.blogjava.net/franky/articles/323424.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>系统架构中影响性能的关键点</title><link>http://www.blogjava.net/franky/articles/323419.html</link><dc:creator>Franky</dc:creator><author>Franky</author><pubDate>Sat, 12 Jun 2010 04:34:00 GMT</pubDate><guid>http://www.blogjava.net/franky/articles/323419.html</guid><wfw:comment>http://www.blogjava.net/franky/comments/323419.html</wfw:comment><comments>http://www.blogjava.net/franky/articles/323419.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/franky/comments/commentRss/323419.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/franky/services/trackbacks/323419.html</trackback:ping><description><![CDATA[ <img src ="http://www.blogjava.net/franky/aggbug/323419.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/franky/" target="_blank">Franky</a> 2010-06-12 12:34 <a href="http://www.blogjava.net/franky/articles/323419.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转 DMZ</title><link>http://www.blogjava.net/franky/articles/323412.html</link><dc:creator>Franky</dc:creator><author>Franky</author><pubDate>Sat, 12 Jun 2010 03:06:00 GMT</pubDate><guid>http://www.blogjava.net/franky/articles/323412.html</guid><wfw:comment>http://www.blogjava.net/franky/comments/323412.html</wfw:comment><comments>http://www.blogjava.net/franky/articles/323412.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/franky/comments/commentRss/323412.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/franky/services/trackbacks/323412.html</trackback:ping><description><![CDATA[<h3><a href="http://suihr.javaeye.com/blog/428569">DMZ主机</a></h3>
<div class="blog_content">
<p><strong><span style="color: #ff0000; line-height: 1.8em;">DMZ
主机</span></strong> 　　针对不同资源提供不同安全级别的保护，可以考虑构建一个叫做&#8220;Demilitarized
Zone&#8221;（DMZ）的区域。DMZ可以理解为一个不同于外网或内网的特殊网络区域。DMZ内通常放置一些不含机密信息的公用服务器，比如Web、
Mail、FTP等。这样来自外网的访问者可以访问DMZ中的服务，但不可能接触到存放在内网中的公司机密或私人信息等。即使DMZ中服务器受到破坏，也
不会对内网中的机密信息造成影响。 </p>
<p>当规划一个拥有DMZ的网络时候,我们可以明确各个网络之间的访问关系,可以确定以下六条访问控制策略。 </p>
<p>1.内网可以访问外网 </p>
<p>内网的用户显然需要自由地访问外网。在这一策略中，防火墙需要进行源地址转换。 </p>
<p>2.内网可以访问DMZ </p>
<p>此策略是为了方便内网用户使用和管理DMZ中的服务器。</p>
<p>3.外网不能访问内网 很显然，内网中存放的是公司内部数据，这些数据不允许外网的用户进行访问。</p>
<p>4.外网可以访问DMZ </p>
<p>DMZ中的服务器本身就是要给外界提供服务的，所以外网必须可以访问DMZ。同时，外网访问DMZ需要由防火墙完成对外地址到服务器实际地址的转
换。</p>
<p>5.DMZ不能访问内网 很明显，如果违背此策略，则当入侵者攻陷DMZ时，就可以进一步进攻到内网的重要数据。</p>
<p>6.DMZ不能访问外网 &#173;</p>
<p>此条策略也有例外，比如DMZ中放置邮件服务器时，就需要访问外网，否则将不能正常工作。
============================== </p>
<p>什么是&#8220;DMZ&#8221;？</p>
<p>即将路由其设置成内网和外网均不能直接访问的区域，多用于连接WWW服务器等公用服务器 </p>
<p>就是为外部用户访问内部网络设置的一个特殊的网络</p>
<p>==============================</p>
<p>DMZ主机就是把设置成DMZ主机的内网的机器端口全部映射到外网了. </p>
<p>人家访问外网就可以访问设置成了DMZ主机的内网的机器，</p>
<p>-----------------------------分割线----------------------------------------<br />
</p>
<h3><a href="http://suihr.javaeye.com/blog/428554">DMZ</a></h3>
<div class="blog_content">
<p>DMZ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DMZ是英文&#8220;demilitarized
zone&#8221;的缩写，中文名称为&#8220;隔离区&#8221;，也称&#8220;非军事化区&#8221;。它是为了解决安装<a href="http://product.it168.com/files/0418search.shtml" target="_blank">防
火墙</a>后外部网络不能访问内部网络服务器的问题，而设立的一个非安全系统与安全系统之间的缓冲区，这个缓冲区位于企业内部网络和外部网络之间的小网
络区域内，在这个小网络区域内可以放置一些必须公开的服务器设施，如企业Web服务器、FTP服务器和论坛等。另一方面，通过这样一个DMZ区域，更加有
效地保护了内部网络，因为这种网络部署，比起一般的防火墙方案，对攻击者来说又多了一道关卡。网络结构如下图所示。&#173;</p>
<p><span style="color: #ff0000; line-height: 1.8em;">
<p align="center">&#173;<img src="http://publish.it168.com/cWord/images/137918.jpg" alt="图片" border="0" /></p>
</span></p>
<p><span style="background-color: #cce8cf;">&#173; </span></p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;网络设备开发商，利用这一技术，开发出了相应的防火墙解决方案。称&#8220;非军事区结构模式&#8221;。DMZ通常是一个过滤的子网，DMZ在内部网络和
外部网络之间构造了一个安全地带。网络结构如下图所示。&#173;</p>
<p><span style="color: #ff0000; line-height: 1.8em;">
<p align="center">&#173;<img src="http://publish.it168.com/cWord/images/137920.jpg" alt="图片" border="0" /></p>
</span></p>
<p><span style="background-color: #cce8cf;">&#173; </span></p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;DMZ防火墙方案为要保护的内部网络增加了一道安全防线，通常认为是非常安全的。同时它提供了一个区域放置公共服务器，从而又能有效地避免
一些互联应用需要公开，而与内部安全策略相矛盾的情况发生。在DMZ区域中通常包括堡垒主机、Modem池，以及所有的公共服务器，但要注意的是电子商务
服务器只能用作用户连接，真正的电子商务后台数据需要放在内部网络中。&#173;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;在这个防火墙方案中，包括两个防火墙，外部防火墙抵挡外部网络的攻击，并管理所有内部网络对DMZ的访问。内部防火墙管理DMZ对于内部网
络的访问。内部防火墙是内部网络的第三道安全防线(前面有了外部防火墙和堡垒主机)，当外部防火墙失效的时候，它还可以起到保护内部网络的功能。而局域网
内部，对于Internet的访问由内部防火墙和位于DMZ的堡垒主机控制。在这样的结构里，一个黑客必须通过三个独立的区域(外部防火墙、内部防火墙和
堡垒主机)才能够到达局域网。攻击难度大大加强，相应内部网络的安全性也就大大加强，但投资成本也是最高的。&#173;</p>
</div>
</div>
<img src ="http://www.blogjava.net/franky/aggbug/323412.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/franky/" target="_blank">Franky</a> 2010-06-12 11:06 <a href="http://www.blogjava.net/franky/articles/323412.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MSN9.0版（14.0.8064.0206）去除广告条(转）</title><link>http://www.blogjava.net/franky/articles/298194.html</link><dc:creator>Franky</dc:creator><author>Franky</author><pubDate>Wed, 14 Oct 2009 05:30:00 GMT</pubDate><guid>http://www.blogjava.net/franky/articles/298194.html</guid><wfw:comment>http://www.blogjava.net/franky/comments/298194.html</wfw:comment><comments>http://www.blogjava.net/franky/articles/298194.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/franky/comments/commentRss/298194.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/franky/services/trackbacks/298194.html</trackback:ping><description><![CDATA[<font  color="#333333" face="Verdana, Simsun" size="3"><span  style="font-size: 13px; line-height: 22px;">
<h4 class="beTitle" id="subjcns!180A8A7FBBD7272E!1138" style="line-height: 21px; font-weight: normal; margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 0px; color: #333333; font-size: 14px; "><a href="http://liuxinyang.spaces.live.com/blog/cns!180A8A7FBBD7272E!1138.entry" style="line-height: 23px; font-weight: inherit; text-decoration: none; color: #4563b9; cursor: pointer; ">MSN9.0版（14.0.8064.0206）去除广告条</a></h4>
<div id="msgcns!180A8A7FBBD7272E!1138" class="bvMsg" style="line-height: 22px; width: 820px; overflow-x: hidden; overflow-y: hidden; text-overflow: ellipsis; ">
<p style="line-height: 22px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.35em; margin-left: 0px; ">微软通知：为了保证安全，MSN(Windows Live Messenger）将在两个月内强制升级到9.0版，明细版本号14.0.8064.0206，请大家及时下载更新。两个月后，使用老版本的用户将无法登录。下载地址：<a title="http://download.live.com/" href="http://download.live.com/" style="line-height: 22px; font-weight: inherit; text-decoration: none; color: #4563b9; cursor: pointer; ">http://download.live.com/</a></p>
<p style="line-height: 22px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.35em; margin-left: 0px; ">该安装包包含了Messenger、Mail、Write、照片库等，都不错，建议安装。</p>
<p style="line-height: 22px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.35em; margin-left: 0px; ">MSN上的广告有很多，除了主窗口下面的广告，文字对话框下面还有文字广告，而且比较低俗，近期打击网络低俗行动咋没把微软给和谐掉呢。</p>
<p style="line-height: 22px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.35em; margin-left: 0px; ">每次装上新的MSN版本，我的首要任务就是研究怎么把那个讨厌的广告条去掉。自从发现了A-Patch，就再也不用发愁了：</p>
<p style="line-height: 22px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.35em; margin-left: 0px; ">1、去A-Patch的官方网站下载相应版本的破解程序：<a title="http://apatch.org/" href="http://apatch.org/" style="line-height: 22px; font-weight: inherit; text-decoration: none; color: #4563b9; cursor: pointer; ">http://apatch.org/</a><br style="line-height: 22px; " />
2、将本机的语言区域修改成美国：控制面板-区域和语言选项-高级-&#8220;英语（美国）&#8221;</p>
<p style="line-height: 22px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.35em; margin-left: 0px; "><a href="https://v7ehsa.bay.livefilestore.com/y1mJ9QVK87Xa4R-jI7PdZQsX-piXHpdHpNbl_NbB8cxbdZeM1OnwRo_BvMg_fh76xAZ0JRpBFLljJnXDb80osdhOORxycThSTi_ht6swMr4qaD9lJmiBjajYfYiECDMmVqPxP5NS2kVLrQ/snapshot-1[2].jpg" rel="WLPP" style="line-height: 22px; font-weight: inherit; text-decoration: none; color: #4563b9; cursor: pointer; "><img title="snapshot-1" border="0" alt="snapshot-1" src="https://v7ehsa.bay.livefilestore.com/y1m3hpmjgHhj4RROZccizWR6b93LI61z2_P_yGVLvUIY1CjugZuHXP0XF8alPR7g7OXVNJx_iRfTIeTka-nVL6FI2rdOL-gThK4EnmNApUS2GCZ2-iVCzbUAg7GobfpA7R5kyJgTAsCuQ0/snapshot-1_thumb.jpg" width="221" height="244" style="line-height: 22px; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; border-bottom-style: initial; border-bottom-color: initial; border-left-style: initial; border-left-color: initial; display: inline; border-top-style: initial; border-top-color: initial; border-right-style: initial; border-right-color: initial; " /></a></p>
<p style="line-height: 22px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.35em; margin-left: 0px; ">3、重启机器<br style="line-height: 22px; " />
4、运行刚才下载的A-Patch程序，使用默认设置就可以，注意MSN的安装目录是否正确<br style="line-height: 22px; " />
5、重复步骤2，把语言改回成&#8220;中文（中国）&#8221;<br style="line-height: 22px; " />
6、重启机器<br style="line-height: 22px; " />
7、结束</p>
<p style="line-height: 22px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.35em; margin-left: 0px; ">现在，广告没有了，清净了！而且，破解后的MSN支持多个账户登陆，你可以同时启动多个MSN，用不同的账户同时上网。</p>
<p style="line-height: 22px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.35em; margin-left: 0px; ">注意：该破解程序只能针对干净的MSN，如果已经破解过MSN，需要把当时备份的原文件恢复，再破解。</p>
</div>
</span></font>
<img src ="http://www.blogjava.net/franky/aggbug/298194.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/franky/" target="_blank">Franky</a> 2009-10-14 13:30 <a href="http://www.blogjava.net/franky/articles/298194.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SEP11客户端病毒定义更新失败问题的解决办法</title><link>http://www.blogjava.net/franky/articles/296597.html</link><dc:creator>Franky</dc:creator><author>Franky</author><pubDate>Sun, 27 Sep 2009 02:08:00 GMT</pubDate><guid>http://www.blogjava.net/franky/articles/296597.html</guid><wfw:comment>http://www.blogjava.net/franky/comments/296597.html</wfw:comment><comments>http://www.blogjava.net/franky/articles/296597.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/franky/comments/commentRss/296597.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/franky/services/trackbacks/296597.html</trackback:ping><description><![CDATA[<span  style="font-family: Arial; font-size: 14px; line-height: 22px; ">
<pre style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-weight: normal; zoom: 1; white-space: pre-wrap; word-wrap: break-word; font-size: 14px; line-height: 22px; font-family: Arial; ">SEP11客户端病毒定义更新失败问题的解决办法
在最新的SEP11版本上目前仍然保留了SAV时代产品的Liveupdate模块的功能，并进一步完善了internal liveupdate server 的使用功能，使得内容及产品的更新更易于管理。
很多用户会经常碰到SEP客户端，下载病毒定义失败的问题，本文将详解，SEP产品在通过Liveupdate模块来更新病毒定义及威胁检测特征库中所碰到的一些失败情况的分析及解决办法。
SEP客户端病毒定义通过LIVEUPDATE进行更新碰到一些失败经常是由于本地病毒定义文件损坏造成的，要重新PUSH进新的病毒定义就需要删除掉一些旧的损坏的病毒定义内容，这就必须知道病毒定义是如何从外界导入本地环境的具体路径。
病毒定义损坏界面：
对于客户端从INTERNET获取病毒定义，经过两步过程
1 liveupdate 模块下载病毒定义到本地的C:\Documents and Settings\All Users\Application Data\Symantec\LiveUpdate\Downloads路径下。下载的初始过程都是由一些零散的小的TMP块文件组成，然后会有自动的机制将这些文件重新整合成一些压缩文件，然后这些临时文件会在LIVEUPDATE过程结束后，全部消失，如图中所示下载过程及文件消失过程：
下载完成临时文件消失：
2 当Download文件夹下所有的TMP块文件消失后，这些文件将在另外一个目录下C:\Program Files\Common Files\Symantec Shared\VirusDefs。进行解压以供客户端来使用。解压的过程中也会伴随产生一些TMP文件夹和LOCK文件，但这些文件将在顺利解压完成后会马上消失。
临时文件消失：
明白了这个路径，下面就需要确定如何删除哪些损坏的定义文件了，其具体步骤为：
1 在服务管理器中停止当前所有的SEP的服务进程
2 删除C:\Documents and Settings\All Users\Application Data\Symantec\LiveUpdate\Downloads
目录下的所有内容。
3 删除C:\Program Files\Common Files\Symantec Shared\VirusDefs目录下的如下文件
usage.dat/definfo.dat    /    及texthub,binhub,incoming 子文件夹下的所有内容（注意这里不是删除
文件夹而是删除文件夹下的内容，最后要保留个空文件夹）
其中definfo.dat中有病毒定义更新的日期记录，binhub中包含当前病毒定义文件副本，用来做恢复当前病
毒定义的作用，所以这些文件一定都要删除干净。另外在Virusdefs目录下可能还会存有一些带有日期的文
件夹这些就是每个历史时期保留下来的病毒定义文件，建议不要删除所有的带有日期的文件夹，保留一个
definfo.dat文件中 "lastdefs=日期A" 日期A对应的文件夹，其余的日期文件夹都删除掉。
definfo.dat 文件样本如下，删除20080203.006，保留20080202.003 文件夹
[DefDates]
CurDefs=20080203.006
LastDefs=20080202.003
剩下的工作就是重新启动SEP的各项服务，并点击LIVEUPDATE进行升级，就OK 了 </pre>
</span>
<img src ="http://www.blogjava.net/franky/aggbug/296597.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/franky/" target="_blank">Franky</a> 2009-09-27 10:08 <a href="http://www.blogjava.net/franky/articles/296597.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>打造干干净净的QQ聊天环境</title><link>http://www.blogjava.net/franky/articles/286080.html</link><dc:creator>Franky</dc:creator><author>Franky</author><pubDate>Thu, 09 Jul 2009 06:06:00 GMT</pubDate><guid>http://www.blogjava.net/franky/articles/286080.html</guid><wfw:comment>http://www.blogjava.net/franky/comments/286080.html</wfw:comment><comments>http://www.blogjava.net/franky/articles/286080.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/franky/comments/commentRss/286080.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/franky/services/trackbacks/286080.html</trackback:ping><description><![CDATA[<span  style="font-family: arial; font-size: 14px; line-height: 24px; ">
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: none; list-style-position: initial; list-style-image: initial; ">在QQ2009 Beta版的时候，可以通过删除一些文件让非会员也能实现去广告的目的，可惜QQ2009正式版起增加了文件完整性检查，删除文件会导致QQ无法启动，并要求重新安装，那么对于非会员来说，QQ2009正式版（包括之后的SP1、SP2等）就不能手动去广告了吗？</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: none; list-style-position: initial; list-style-image: initial; ">其实还是有办法的，而且做起来也不难，你说是用第三方工具？不需要，只要你对操作系统稍有了解就可以轻松搞定。下面就把小编找到的方法共享给大家。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: none; list-style-position: initial; list-style-image: initial; "><strong>　　1、去除腾讯迷你首页：</strong></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: none; list-style-position: initial; list-style-image: initial; ">　　对于每次启动QQ后，都弹出的&#8220;腾讯迷你首页&#8221;，很多人一定感到不爽，就让我们先拿它开刀吧。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: none; list-style-position: initial; list-style-image: initial; ">　　首先进入QQ的安装文件夹，接着进入 Plugin＼Com.Tencent.Advertisement＼bin 文件夹，这里你会看到一个Advertisement.dll文件，它就是迷你首页的关键所在，只需将这个文件改成只读属性，以后启动QQ就不会再看到迷你首页了。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: none; list-style-position: initial; list-style-image: initial; "><strong>　　2、去除聊天窗口右上角广告：</strong></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: none; list-style-position: initial; list-style-image: initial; ">　　这个操作针对XP和Vista/Win7略有不同，主要是文件夹路径上的。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: none; list-style-position: initial; list-style-image: initial; ">　　XP：</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: none; list-style-position: initial; list-style-image: initial; ">　　进入 X（系统所在盘）:＼Documents and Settings＼用户名＼Application Data＼Tencent＼QQ＼Misc＼com.tencent.advertisement，首先删除这个文件夹里面的所有文件，<strong>注意文件夹本身不能删除</strong>，然后把当前用户的写入权限给拒绝掉（需要当前分区为NTFS格式）。方法：文件夹上右键，属性 - 安全标签，选中当前登录用户，接着在下方&#8220;写入&#8221;权限里，拒绝上打勾。</p>
<p align="center" style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: none; list-style-position: initial; list-style-image: initial; "><img alt="" src="http://news.skycn.com/newsimg/090624/154019149030.jpg" style="margin-top: 0px; margin-right: 0px; margin-bottom: 5px; margin-left: 10px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; " /></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: none; list-style-position: initial; list-style-image: initial; ">　　Vista/Windows 7</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: none; list-style-position: initial; list-style-image: initial; ">　　进入X:＼users＼用户名＼appdata＼Roaming＼Tencent＼QQ＼Misc＼com.tencent.advertisement，之后操作同XP。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: none; list-style-position: initial; list-style-image: initial; "><strong>　　3、去除聊天窗口左下角广告</strong></p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: none; list-style-position: initial; list-style-image: initial; ">　　如今的聊天窗口，除了右上角的图片广告外，左下角还多了一条文字广告，既然要去广告，那么这块自然也不能遗忘。同样操作针对XP和Vista有所不同。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: none; list-style-position: initial; list-style-image: initial; ">　　XP：</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: none; list-style-position: initial; list-style-image: initial; ">　　首先要关闭QQ，然后进入X:＼Documents and Settings＼用户名＼Application Data＼Tencent＼Users＼你的QQ号＼QQ＼，删除其中的Misc.db，接着<strong>新建一个文件夹并命名为Misc.db</strong>。（是不是和防止U盘自动运行病毒的方法很像）</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: none; list-style-position: initial; list-style-image: initial; ">　　Vista/Windows 7</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: none; list-style-position: initial; list-style-image: initial; ">　　关闭QQ后，进入X:＼users＼用户名＼appdata＼Roaming＼Tencent＼Users＼你的QQ号码＼QQ＼，然后操作同上。</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: none; list-style-position: initial; list-style-image: initial; ">　　怎么样，这样一处理以后，3个地方的广告是不是消失了？另外，你有没有觉得登录速度似乎也有所加快？</p>
</span>
<img src ="http://www.blogjava.net/franky/aggbug/286080.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/franky/" target="_blank">Franky</a> 2009-07-09 14:06 <a href="http://www.blogjava.net/franky/articles/286080.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>去除msn随outlook开启而自动启动</title><link>http://www.blogjava.net/franky/articles/260688.html</link><dc:creator>Franky</dc:creator><author>Franky</author><pubDate>Thu, 19 Mar 2009 02:49:00 GMT</pubDate><guid>http://www.blogjava.net/franky/articles/260688.html</guid><wfw:comment>http://www.blogjava.net/franky/comments/260688.html</wfw:comment><comments>http://www.blogjava.net/franky/articles/260688.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/franky/comments/commentRss/260688.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/franky/services/trackbacks/260688.html</trackback:ping><description><![CDATA[搜索了网上的很多方法，大多数都是针对msn随OE启动，试验后都不行。后来想到一个最笨的方法，在注册表中搜索"C:\Program Files\Windows Live\Messenger\msnmsgr.exe"，结果在HKEY_CLASSES_ROOT\CLSID\{5C4C8078-24CF-4c71-B05E-8B1D935DB5AC}下找到，清空后即可。
<div>当然，还有更笨的方法就是将C:\Program Files\Windows Live\Messenger\msnmsgr.exe的文件改名，但这样要运行msn的话，需要简历一个快捷方式。</div>
<img src ="http://www.blogjava.net/franky/aggbug/260688.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/franky/" target="_blank">Franky</a> 2009-03-19 10:49 <a href="http://www.blogjava.net/franky/articles/260688.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开始菜单—运行里的经典命令</title><link>http://www.blogjava.net/franky/articles/127565.html</link><dc:creator>Franky</dc:creator><author>Franky</author><pubDate>Mon, 02 Jul 2007 07:42:00 GMT</pubDate><guid>http://www.blogjava.net/franky/articles/127565.html</guid><wfw:comment>http://www.blogjava.net/franky/comments/127565.html</wfw:comment><comments>http://www.blogjava.net/franky/articles/127565.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/franky/comments/commentRss/127565.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/franky/services/trackbacks/127565.html</trackback:ping><description><![CDATA[近日收集了一些XP的命令，有些很有用，列出来共享~<br>我找了些，不知道有没有用处~~<br>winver---------检查Windows版本&nbsp;<br>wmimgmt.msc----打开windows管理体系结构(WMI)&nbsp;<br>wupdmgr--------windows更新程序&nbsp;<br>wscript--------windows脚本宿主设置&nbsp;<br>write----------写字板&nbsp;<br>winmsd---------系统信息&nbsp;<br>wiaacmgr-------扫描仪和照相机向导&nbsp;<br>winchat--------XP自带局域网聊天&nbsp;<br>mem.exe--------显示内存使用情况&nbsp;<br>Msconfig.exe---系统配置实用程序&nbsp;<br>mplayer2-------简易widnows&nbsp;media&nbsp;player&nbsp;<br>mspaint--------画图板&nbsp;<br>mstsc----------远程桌面连接&nbsp;<br>mplayer2-------媒体播放机&nbsp;<br>magnify--------放大镜实用程序&nbsp;<br>mmc------------打开控制台&nbsp;<br>mobsync--------同步命令&nbsp;<br>dxdiag---------检查DirectX信息&nbsp;<br>drwtsn32------&nbsp;系统医生&nbsp;<br>devmgmt.msc---&nbsp;设备管理器&nbsp;<br>dfrg.msc-------磁盘碎片整理程序&nbsp;<br>diskmgmt.msc---磁盘管理实用程序&nbsp;<br>dcomcnfg-------打开系统组件服务&nbsp;<br>ddeshare-------打开DDE共享设置&nbsp;<br>dvdplay--------DVD播放器&nbsp;<br>net&nbsp;stop&nbsp;messenger-----停止信使服务&nbsp;<br>net&nbsp;start&nbsp;messenger----开始信使服务&nbsp;<br>notepad--------打开记事本&nbsp;<br>nslookup-------网络管理的工具向导&nbsp;<br>ntbackup-------系统备份和还原&nbsp;<br>narrator-------屏幕&#8220;讲述人&#8221;&nbsp;<br>ntmsmgr.msc----移动存储管理器&nbsp;<br>ntmsoprq.msc---移动存储管理员操作请求&nbsp;<br>netstat&nbsp;-an----(TC)命令检查接口&nbsp;<br>syncapp--------创建一个公文包&nbsp;<br>sysedit--------系统配置编辑器&nbsp;<br>sigverif-------文件签名验证程序&nbsp;<br>sndrec32-------录音机&nbsp;<br>shrpubw--------创建共享文件夹&nbsp;<br>secpol.msc-----本地安全策略&nbsp;<br>syskey---------系统加密，一旦加密就不能解开，保护windows&nbsp;xp系统的双重密码&nbsp;<br>services.msc---本地服务设置&nbsp;<br>Sndvol32-------音量控制程序&nbsp;<br>sfc.exe--------系统文件检查器&nbsp;<br>sfc&nbsp;/scannow---windows文件保护&nbsp;<br>tsshutdn-------60秒倒计时关机命令&nbsp;<br>tourstart------xp简介（安装完成后出现的漫游xp程序）&nbsp;<br>taskmgr--------任务管理器&nbsp;<br>eventvwr-------事件查看器&nbsp;<br>eudcedit-------造字程序&nbsp;<br>explorer-------打开资源管理器&nbsp;<br>packager-------对象包装程序&nbsp;<br>perfmon.msc----计算机性能监测程序&nbsp;<br>progman--------程序管理器&nbsp;<br>regedit.exe----注册表&nbsp;<br>rsop.msc-------组策略结果集&nbsp;<br>regedt32-------注册表编辑器&nbsp;<br>rononce&nbsp;-p&nbsp;----15秒关机&nbsp;<br>regsvr32&nbsp;/u&nbsp;*.dll----停止dll文件运行&nbsp;<br>regsvr32&nbsp;/u&nbsp;zipfldr.dll------取消ZIP支持&nbsp;<br>cmd.exe--------CMD命令提示符&nbsp;<br>chkdsk.exe-----Chkdsk磁盘检查&nbsp;<br>certmgr.msc----证书管理实用程序&nbsp;<br>calc-----------启动计算器&nbsp;<br>charmap--------启动字符映射表&nbsp;<br>cliconfg-------SQL&nbsp;SERVER&nbsp;客户端网络实用程序&nbsp;<br>Clipbrd--------剪贴板查看器&nbsp;<br>conf-----------启动netmeeting&nbsp;<br>compmgmt.msc---计算机管理&nbsp;<br>cleanmgr-------垃圾整理&nbsp;<br>ciadv.msc------索引服务程序&nbsp;<br>osk------------打开屏幕键盘&nbsp;<br>odbcad32-------ODBC数据源管理器&nbsp;<br>oobe/msoobe&nbsp;/a----检查XP是否激活&nbsp;<br>lusrmgr.msc----本机用户和组&nbsp;<br>logoff---------注销命令&nbsp;<br>iexpress-------木马捆绑工具，系统自带&nbsp;<br>Nslookup-------IP地址侦测器&nbsp;<br>fsmgmt.msc-----共享文件夹管理器&nbsp;<br>utilman--------辅助工具管理器&nbsp;<br>gpedit.msc-----组策略
<img src ="http://www.blogjava.net/franky/aggbug/127565.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/franky/" target="_blank">Franky</a> 2007-07-02 15:42 <a href="http://www.blogjava.net/franky/articles/127565.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>how to disable/enable windows xp  remember my password?</title><link>http://www.blogjava.net/franky/articles/126982.html</link><dc:creator>Franky</dc:creator><author>Franky</author><pubDate>Fri, 29 Jun 2007 01:39:00 GMT</pubDate><guid>http://www.blogjava.net/franky/articles/126982.html</guid><wfw:comment>http://www.blogjava.net/franky/comments/126982.html</wfw:comment><comments>http://www.blogjava.net/franky/articles/126982.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/franky/comments/commentRss/126982.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/franky/services/trackbacks/126982.html</trackback:ping><description><![CDATA[Many times, we need disable remembering my password setting in WIN XP and vice versa. How can we deal with this issue? Follow is a solution:<img style="WIDTH: 769px; HEIGHT: 768px" height=768 alt="" src="http://www.blogjava.net/images/blogjava_net/franky/remembermypasswordsetting.JPG" width=769 border=0><br>More, some website use ssl protocol and&nbsp;browser(IE/FF) will not store the password. This time we should add the website to our security site.(IE-TOOL-INTERNET&nbsp;OPTION-SECURITY-LOCAL INTRANET-...)<br>We can&nbsp;import the certificate file to solve the inputting password again and again.<br><br>&nbsp; 
<img src ="http://www.blogjava.net/franky/aggbug/126982.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/franky/" target="_blank">Franky</a> 2007-06-29 09:39 <a href="http://www.blogjava.net/franky/articles/126982.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Background Intelligent Transfer Service start failure</title><link>http://www.blogjava.net/franky/articles/109864.html</link><dc:creator>Franky</dc:creator><author>Franky</author><pubDate>Wed, 11 Apr 2007 04:07:00 GMT</pubDate><guid>http://www.blogjava.net/franky/articles/109864.html</guid><wfw:comment>http://www.blogjava.net/franky/comments/109864.html</wfw:comment><comments>http://www.blogjava.net/franky/articles/109864.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/franky/comments/commentRss/109864.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/franky/services/trackbacks/109864.html</trackback:ping><description><![CDATA[<p>Reset the security settings on the BITS service and see if it helps: <br>
<p><a href="http://groups.google.com/groups?selm=O4yhAYjdEHA.996%40TK2MSFTNGP12.phx.gbl" target=_blank rel=nofollow><u><font color=#0000cc>http://groups.google.com/groups?selm=O4yhAYjdEHA.996%40TK2MSFTNGP12.p...</font></u></a> <br>
<p>(the "sc sdset bits ..." part in the link above) <br>
<p>Then, after the above, do the following: <br>
<p>Click Start &gt;&gt; Run &gt;&gt; <br>Type the follow command in the Open box. <br>"regsvr32.exe qmgr.dll" &nbsp; &nbsp; (w/o quotes) <br>Press Ok <br>
<p>Repeat the same for the following command: <br>
<p>regsvr32.exe qmgrprxy.dll <br>
<p>If that didn't help, try this: <br>
<p>Run this command line (from a command prompt of from Start/Run, it <br>reinstalls the BITS service (line will wrap in the newsreader!): <br>
<p>%SystemRoot%\System32\rundll32.exe setupapi,InstallHinfSection DefaultInstall <br>&nbsp; 132 %SystemRoot%\inf\qmgr.inf <br>
<p>(it must be a space between DefaultInstall and 132) <br>
<p>When it asks for your OS CD-ROM to get some files, just point it to the <br>folder %windir%\System32 (%windir% is typically C:\Windows). <br>
<p>Then run the following commands: <br>
<p>regsvr32.exe qmgr.dll <br>regsvr32.exe qmgrprxy.dll <br>
<p>Do a reboot after this. <br></p>
<img src ="http://www.blogjava.net/franky/aggbug/109864.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/franky/" target="_blank">Franky</a> 2007-04-11 12:07 <a href="http://www.blogjava.net/franky/articles/109864.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：JAVA 程序中使用ORACLE 绑定变量( bind variable )</title><link>http://www.blogjava.net/franky/articles/109637.html</link><dc:creator>Franky</dc:creator><author>Franky</author><pubDate>Tue, 10 Apr 2007 06:53:00 GMT</pubDate><guid>http://www.blogjava.net/franky/articles/109637.html</guid><wfw:comment>http://www.blogjava.net/franky/comments/109637.html</wfw:comment><comments>http://www.blogjava.net/franky/articles/109637.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/franky/comments/commentRss/109637.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/franky/services/trackbacks/109637.html</trackback:ping><description><![CDATA[<p><font color=#000000><font size=2><span lang=EN-US></span><span style="FONT-FAMILY: 宋体">1、</span><span lang=EN-US><font face="Times New Roman">为什么要使用绑定变量</font></span></font></font> </p>
<p><font color=#000000><font size=2><span lang=EN-US></span></font></font><font color=#000000><font size=2><span lang=EN-US><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span style="FONT-FAMILY: 宋体">（</span><span lang=EN-US><font face="Times New Roman">1</font></span><span style="FONT-FAMILY: 宋体">）</span><span lang=EN-US><font face="Times New Roman">SQL</font></span><span style="FONT-FAMILY: 宋体">语句硬分析</span><span lang=EN-US><font face="Times New Roman">(Hard Parse)</font></span><span style="FONT-FAMILY: 宋体">太多，严重消耗</span><span lang=EN-US><font face="Times New Roman">CPU</font></span><span style="FONT-FAMILY: 宋体">资源，延长了</span><span lang=EN-US><font face="Times New Roman">SQL</font></span><span style="FONT-FAMILY: 宋体">语句总的执行时间</span></font></font> </p>
<p><font color=#000000><font size=2><span lang=EN-US><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>SQL</font></span><span style="FONT-FAMILY: 宋体">语句的执行过程分几个步骤：语法检查、分析、执行、返回结果。其中分析分为硬分析</span><span lang=EN-US><font face="Times New Roman">(Hard Parse)</font></span><span style="FONT-FAMILY: 宋体">和软分析</span><span lang=EN-US><font face="Times New Roman">(Soft Parse)</font></span><span style="FONT-FAMILY: 宋体">。一条</span><span lang=EN-US><font face="Times New Roman">SQL</font></span><span style="FONT-FAMILY: 宋体">语句通过语法检查后，</span><span lang=EN-US><font face="Times New Roman">Oracle </font></span><span style="FONT-FAMILY: 宋体">会先去</span><span lang=EN-US><font face="Times New Roman">shared pool </font></span><span style="FONT-FAMILY: 宋体">中找是否有相同的</span><span lang=EN-US><font face="Times New Roman">sql</font></span><span style="FONT-FAMILY: 宋体">，如果找着了，就叫软分析，然后执行</span><span lang=EN-US><font face="Times New Roman">SQL</font></span><span style="FONT-FAMILY: 宋体">语句。硬分析主要是检查该</span><span lang=EN-US><font face="Times New Roman">sql</font></span><span style="FONT-FAMILY: 宋体">所涉及到的所有对象是否有效以及权限等关系，然后根据</span><span lang=EN-US><font face="Times New Roman">RBO</font></span><span style="FONT-FAMILY: 宋体">或</span><span lang=EN-US><font face="Times New Roman">CBO</font></span><span style="FONT-FAMILY: 宋体">模式生成执行计划，然后才执行</span><span lang=EN-US><font face="Times New Roman">SQL</font></span><span style="FONT-FAMILY: 宋体">语句。</span></font></font> </p>
<p><font color=#000000><font size=2><span style="FONT-FAMILY: 宋体">&nbsp;&nbsp; </span></font></font><font color=#000000><font size=2><span style="FONT-FAMILY: 宋体">可以看出，硬分析比软分析多了很多动作，而这里面的关键是&#8220;在</span><span lang=EN-US><font face="Times New Roman">shared pool </font></span><span style="FONT-FAMILY: 宋体">中是否有相同的</span><span lang=EN-US><font face="Times New Roman">sql</font></span><span style="FONT-FAMILY: 宋体">&#8221;，而这就取决于是否使用绑定变量。</span></font></font> </p>
<p><font color=#000000><font size=2><span lang=EN-US><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span style="FONT-FAMILY: 宋体">另：</span><span lang=EN-US><font face="Times New Roman">oracle9i</font></span><span style="FONT-FAMILY: 宋体">引入了</span><span lang=EN-US><font face="Times New Roman">soft soft parse</font></span><span style="FONT-FAMILY: 宋体">，先到</span><span lang=EN-US><font face="Times New Roman">pga</font></span><span style="FONT-FAMILY: 宋体">中的</span><span lang=EN-US><font face="Times New Roman">session cursor cache list</font></span><span style="FONT-FAMILY: 宋体">列表中去查找（</span><span lang=EN-US><font face="Times New Roman">session cursor cache list</font></span><span style="FONT-FAMILY: 宋体">的长度是由</span><span lang=EN-US><font face="Times New Roman">session_cache_cursor</font></span><span style="FONT-FAMILY: 宋体">参数决定的），如果没有找到这条</span><span lang=EN-US><font face="Times New Roman">sql</font></span><span style="FONT-FAMILY: 宋体">，这时候才去检查</span><span lang=EN-US><font face="Times New Roman">shard_pool.<span>&nbsp;&nbsp; </span></font></span><span style="FONT-FAMILY: 宋体">对于</span><span lang=EN-US><font face="Times New Roman">Oltp</font></span><span style="FONT-FAMILY: 宋体">系统，很多时候硬分析的代价比执行还要高，这个我们可以通过</span><span lang=EN-US><font face="Times New Roman">10046</font></span><span style="FONT-FAMILY: 宋体">事件跟踪得知。</span></font></font> </p>
<p><span lang=EN-US><font face="Times new roman" color=#000000 size=2>&nbsp;</font></span> </p>
<p><font color=#000000><font size=2><span lang=EN-US><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp; </font></span></span><span style="FONT-FAMILY: 宋体">（</span><span lang=EN-US><font face="Times New Roman">2</font></span><span style="FONT-FAMILY: 宋体">）共享池中</span><span lang=EN-US><font face="Times New Roman">SQL</font></span><span style="FONT-FAMILY: 宋体">语句数量太多，重用性极低，加速了</span><span lang=EN-US><font face="Times New Roman">SQL</font></span><span style="FONT-FAMILY: 宋体">语句的老化，导致共享池碎片过多。</span></font></font> </p>
<p><font color=#000000><font size=2><span lang=EN-US><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</font></span></span><span style="FONT-FAMILY: 宋体">共享池中不同的</span><span lang=EN-US><font face="Times New Roman">SQL</font></span><span style="FONT-FAMILY: 宋体">语句数量巨大，根据</span><span lang=EN-US><font face="Times New Roman">LRU</font></span><span style="FONT-FAMILY: 宋体">原则，一些语句逐渐老化，最终被清理出共享池；这样就导致</span><span lang=EN-US><font face="Times New Roman">shared_pool_size </font></span><span style="FONT-FAMILY: 宋体">里面命中率下降，共享池碎片增多，可用内存空间不足。而为了维护共享池内部结构，需要使用</span><span lang=EN-US><font face="Times New Roman">latch</font></span><span style="FONT-FAMILY: 宋体">，一种内部生命周期很短的</span><span lang=EN-US><font face="Times New Roman">lock</font></span><span style="FONT-FAMILY: 宋体">，这将使用大量的</span><span lang=EN-US><font face="Times New Roman">cpu </font></span><span style="FONT-FAMILY: 宋体">资源，使得性能急剧下降。</span></font></font> </p>
<p><font color=#000000><font size=2><span lang=EN-US><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></span><span style="FONT-FAMILY: 宋体">不使用绑定变量违背了</span><span lang=EN-US><font face="Times New Roman">oracle </font></span><span style="FONT-FAMILY: 宋体">的</span><span lang=EN-US><font face="Times New Roman">shared pool </font></span><span style="FONT-FAMILY: 宋体">的设计的原则，违背了这个设计用来共享的思想。</span></font></font> </p>
<p><span lang=EN-US><font face="Times new roman" color=#000000 size=2>&nbsp;</font></span> </p>
<p><font color=#000000><font size=2><span lang=EN-US><font face="Times New Roman">2</font></span><span style="FONT-FAMILY: 宋体">、怎么查看没有使用绑定变量</span></font></font> </p>
<p><font color=#000000><font size=2><span lang=EN-US><font face="Times New Roman">select * from v$sql or v$sqlarea </font></span><span style="FONT-FAMILY: 宋体">查看是否有很多类似的语句，除了变量不一样，其他的都一样</span></font></font> </p>
<p><span lang=EN-US><font face="Times new roman" color=#000000 size=2>&nbsp;</font></span> </p>
<p><font color=#000000><font size=2><span lang=EN-US><font face="Times New Roman">3</font></span><span style="FONT-FAMILY: 宋体">、如何使用绑定变量？</span></font></font> </p>
<p><font color=#000000><font size=2><span style="FONT-FAMILY: 宋体">编写</span><span lang=EN-US><font face="Times New Roman">java </font></span><span style="FONT-FAMILY: 宋体">程序时，我们习惯都是定义</span><span lang=EN-US><font face="Times New Roman">JAVA </font></span><span style="FONT-FAMILY: 宋体">的程序变量，放入</span><span lang=EN-US><font face="Times New Roman">SQL </font></span><span style="FONT-FAMILY: 宋体">语句中，如</span></font></font> </p>
<p><span lang=EN-US><font face="Times new roman" color=#000000 size=2>String v_id = 'xxxxx';</font></span> </p>
<p><span lang=EN-US><font face="Times new roman" color=#000000 size=2>String v_sql = 'select name from table_a where id = ' + v_id ; </font></span></p>
<p><span lang=EN-US><font face="Times new roman" color=#000000 size=2>&nbsp;</font></span> </p>
<p><font color=#000000><font size=2><span style="FONT-FAMILY: 宋体">以上代码，看起来是使用了变量</span><span lang=EN-US><font face="Times New Roman">v_id </font></span><span style="FONT-FAMILY: 宋体">，但这却是</span><span lang=EN-US><font face="Times New Roman">java </font></span><span style="FONT-FAMILY: 宋体">的程序变量，而不是</span><span lang=EN-US><font face="Times New Roman">oracle </font></span><span style="FONT-FAMILY: 宋体">的绑定变量，语句传递到数据库后，此</span><span lang=EN-US><font face="Times New Roman">java </font></span><span style="FONT-FAMILY: 宋体">的程序变量</span></font></font> </p>
<p><span style="FONT-FAMILY: 宋体"><font color=#000000 size=2>已经被替换成具体的常量值，变成：</font></span> </p>
<p><span lang=EN-US><font face="Times new roman" color=#000000 size=2>select * from table_a where name = 'xxxxx' ;</font></span> </p>
<p><span lang=EN-US><font face="Times new roman" color=#000000 size=2>&nbsp;</font></span> </p>
<p><font color=#000000><font size=2><span style="FONT-FAMILY: 宋体">假定这个语句第一次执行，会进行硬分析。后来，同一段</span><span lang=EN-US><font face="Times New Roman">java </font></span><span style="FONT-FAMILY: 宋体">代码中</span><span lang=EN-US><font face="Times New Roman">v_id </font></span><span style="FONT-FAMILY: 宋体">值发现变化（</span><span lang=EN-US><font face="Times New Roman">v_id = 'yyyyyy'</font></span><span style="FONT-FAMILY: 宋体">），数据库又接收到这样的语句：</span></font></font> </p>
<p><span lang=EN-US><font face="Times new roman" color=#000000 size=2>select * from table_a where name = 'yyyyyy' ;</font></span> </p>
<p><span lang=EN-US><font face="Times new roman" color=#000000 size=2>&nbsp;</font></span> </p>
<p><font color=#000000><font size=2><span lang=EN-US><font face="Times New Roman">ORACLE </font></span><span style="FONT-FAMILY: 宋体">并不认为以上两条语句是相同的语句，因此对第二条语句会又做一次硬分析。这两条语句的执行计划可是一样的！</span></font></font> </p>
<p><font color=#000000><font size=2><span style="FONT-FAMILY: 宋体">其实，只需将以上</span><span lang=EN-US><font face="Times New Roman">java </font></span><span style="FONT-FAMILY: 宋体">代码改成以下这样，就使用了</span><span lang=EN-US><font face="Times New Roman">oracle </font></span><span style="FONT-FAMILY: 宋体">的绑定变量：</span></font></font> </p>
<p><span lang=EN-US><font face="Times new roman" color=#000000 size=2>String v_id = 'xxxxx';</font></span> </p>
<p><font color=#000000><font size=2><span lang=EN-US><font face="Times New Roman">String v_sql = 'select name from table_a where id = ? '; //</font></span><span style="FONT-FAMILY: 宋体">嵌入绑定变量</span></font></font> </p>
<p><span lang=EN-US><font face="Times new roman" color=#000000 size=2>stmt = con.prepareStatement( v_sql );</font></span> </p>
<p><font color=#000000><font size=2><span lang=EN-US><font face="Times New Roman">stmt.setString(1, v_id ); //</font></span><span style="FONT-FAMILY: 宋体">为绑定变量赋值</span></font></font> </p>
<p><span lang=EN-US><font face="Times new roman" color=#000000 size=2>stmt.executeQuery();</font></span> </p>
<p><span lang=EN-US><font face="Times new roman" color=#000000 size=2>&nbsp;</font></span> </p>
<p><font color=#000000><font size=2><span style="FONT-FAMILY: 宋体">在</span><span lang=EN-US><font face="Times New Roman">Java</font></span><span style="FONT-FAMILY: 宋体">中，结合使用</span><span lang=EN-US><font face="Times New Roman">setXXX </font></span><span style="FONT-FAMILY: 宋体">系列方法，可以为不同数据类型的绑定变量进行赋值，从而大大优化了</span><span lang=EN-US><font face="Times New Roman">SQL </font></span><span style="FONT-FAMILY: 宋体">语句的性能。</span></font></font> </p>
<p><span lang=EN-US><font face="Times new roman" color=#000000 size=2>&nbsp;</font></span> </p>
<p><font color=#000000><font size=2><span lang=EN-US><font face="Times New Roman">4</font></span><span style="FONT-FAMILY: 宋体">、</span><span lang=EN-US><font face="Times New Roman">java</font></span><span style="FONT-FAMILY: 宋体">中应用绑定变量的例子</span></font></font> </p>
<p><span lang=EN-US><font face="Times new roman" color=#000000 size=2>PreparedStatement stmt = conn.prepareStatement('select a from b where c = ? ');</font></span> </p>
<p><span lang=EN-US><font face="Times new roman" color=#000000 size=2>stmt.setLong(1,123);</font></span> </p>
<p><span lang=EN-US><font face="Times new roman" color=#000000 size=2>stmt.executeQuery()</font></span> </p>
<p><span style="FONT-FAMILY: 宋体"><font color=#000000 size=2>&#8230;&#8230;</font></span> </p>
<p><span lang=EN-US><font face="Times new roman" color=#000000 size=2>&nbsp;</font></span> </p>
<p><span lang=EN-US><font face="Times new roman" color=#000000 size=2>&nbsp;</font></span> </p>
<p><span style="FONT-FAMILY: 宋体"><font color=#000000 size=2>结论：</font></span> </p>
<p><span lang=EN-US><font face="Times new roman" color=#000000 size=2>&nbsp;</font></span> </p>
<p><font color=#000000><font size=2><span lang=EN-US><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp; </font></span></span><span style="FONT-FAMILY: 宋体">绑定变量主要适用在</span><span lang=EN-US><font face="Times New Roman">Oltp</font></span><span style="FONT-FAMILY: 宋体">，运行时间很短的系统。如客服系统，时时地进行</span><span lang=EN-US><font face="Times New Roman">insert</font></span><span style="FONT-FAMILY: 宋体">方面的系统。</span><font face="Times New Roman"> </font><span style="FONT-FAMILY: 宋体">数据仓库系统不适用，和数据库仓库系统的一条</span><span lang=EN-US><font face="Times New Roman">sql</font></span><span style="FONT-FAMILY: 宋体">运行时间相比，硬分析的代价显然是微不足道的，通过硬分析去选择正确的执行计划才是关键。</span></font></font> </p>
<p><font color=#000000><font size=2><span style="FONT-FAMILY: 宋体">&nbsp;&nbsp;简单一句话，在Oltp系统中应用绑定变量，性能会有质的提高。</span></font></font> </p>
<p><span lang=EN-US><font face="Times new roman" color=#000000 size=2>&nbsp;</font></span> </p>
<p><font color=#000000><font size=2><span lang=EN-US><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span>---</font></span><span style="FONT-FAMILY: 宋体">引（</span><span lang=EN-US><font face="Times New Roman">http://www.apub.org/doc/2006/03/11/10/52/26/21883.html</font></span><span style="FONT-FAMILY: 宋体">）</span></font></font></p>
<img src ="http://www.blogjava.net/franky/aggbug/109637.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/franky/" target="_blank">Franky</a> 2007-04-10 14:53 <a href="http://www.blogjava.net/franky/articles/109637.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用oci方式连接oracle数据库需要注意的问题</title><link>http://www.blogjava.net/franky/articles/107476.html</link><dc:creator>Franky</dc:creator><author>Franky</author><pubDate>Fri, 30 Mar 2007 06:39:00 GMT</pubDate><guid>http://www.blogjava.net/franky/articles/107476.html</guid><wfw:comment>http://www.blogjava.net/franky/comments/107476.html</wfw:comment><comments>http://www.blogjava.net/franky/articles/107476.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/franky/comments/commentRss/107476.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/franky/services/trackbacks/107476.html</trackback:ping><description><![CDATA[由于oci方式的性能较thin方式高，在生产环境经常采用该方式连接oracle数据库。但在使用该模式过程中，需要注意以下问题：<br />1、在app server端需要安装oracle client，是否只需要ocijdbc*.dll即可没有做实验。<br />2、在oracle client的bin 目录下同时存在oci.dll与ocijdbc9.dll，需要在path中保证ocijdbc9.dll被第一个找到<br />3、classes12.jar 与nls_charset12.jar在classpath中<br /><img src ="http://www.blogjava.net/franky/aggbug/107476.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/franky/" target="_blank">Franky</a> 2007-03-30 14:39 <a href="http://www.blogjava.net/franky/articles/107476.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：IOC&amp;AOP学习和探索（一）——AOP基本理论及实现</title><link>http://www.blogjava.net/franky/articles/104829.html</link><dc:creator>Franky</dc:creator><author>Franky</author><pubDate>Mon, 19 Mar 2007 13:57:00 GMT</pubDate><guid>http://www.blogjava.net/franky/articles/104829.html</guid><wfw:comment>http://www.blogjava.net/franky/comments/104829.html</wfw:comment><comments>http://www.blogjava.net/franky/articles/104829.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/franky/comments/commentRss/104829.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/franky/services/trackbacks/104829.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: IOC&amp;AOP学习和探索（一）——AOP基本理论及实现														前言																																																						       								近一段时间，对				AOP				思想进行了学习与研究，主要是看网上的一些资料，下面就这段...&nbsp;&nbsp;<a href='http://www.blogjava.net/franky/articles/104829.html'>阅读全文</a><img src ="http://www.blogjava.net/franky/aggbug/104829.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/franky/" target="_blank">Franky</a> 2007-03-19 21:57 <a href="http://www.blogjava.net/franky/articles/104829.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：设计模式学习笔记（十八）——Strategy策略模式</title><link>http://www.blogjava.net/franky/articles/104817.html</link><dc:creator>Franky</dc:creator><author>Franky</author><pubDate>Mon, 19 Mar 2007 13:06:00 GMT</pubDate><guid>http://www.blogjava.net/franky/articles/104817.html</guid><wfw:comment>http://www.blogjava.net/franky/comments/104817.html</wfw:comment><comments>http://www.blogjava.net/franky/articles/104817.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/franky/comments/commentRss/104817.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/franky/services/trackbacks/104817.html</trackback:ping><description><![CDATA[
		<span style="font-family: 宋体;">这段时间在项目中接触到了</span>
		<span lang="EN-US">Strategy</span>
		<span style="font-family: 宋体;">策略模式，所以就学习了一下，做一个总结。</span>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>Strategy</span>
				<span style="font-family: 宋体;">策略模式是一种对象行为模式。主要是应对：在软件构建过程中，某些对象使用的算法可能多种多样，经常发生变化。如果在对象内部实现这些算法，将会使对象变得异常复杂，甚至会造成性能上的负担。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>GoF</span>
				<span style="font-family: 宋体;">《设计模式》中说道：定义一系列算法，把它们一个个封装起来，并且使它们可以相互替换。该模式使得算法可独立于它们的客户变化。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>Strategy</span>
				<span style="font-family: 宋体;">模式的结构图如下：<br /></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<o:p>
								<br />
						</o:p>
						<div src_cetemp="/images/cnblogs_com/kid-li/Strategy.JPG" align="center">
								<img alt="" src="http://www.cnblogs.com/images/cnblogs_com/kid-li/Strategy.JPG" border="0" height="308" width="672" />
						</div>
 <br /></span>
		</p>
		<p> </p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center">
				<span lang="EN-US">
						<v:shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600">
								<v:stroke joinstyle="miter">
								</v:stroke>
								<v:formulas>
										<v:f eqn="if lineDrawn pixelLineWidth 0">
										</v:f>
										<v:f eqn="sum @0 1 0">
										</v:f>
										<v:f eqn="sum 0 0 @1">
										</v:f>
										<v:f eqn="prod @2 1 2">
										</v:f>
										<v:f eqn="prod @3 21600 pixelWidth">
										</v:f>
										<v:f eqn="prod @3 21600 pixelHeight">
										</v:f>
										<v:f eqn="sum @0 0 1">
										</v:f>
										<v:f eqn="prod @6 1 2">
										</v:f>
										<v:f eqn="prod @7 21600 pixelWidth">
										</v:f>
										<v:f eqn="sum @8 21600 0">
										</v:f>
										<v:f eqn="prod @7 21600 pixelHeight">
										</v:f>
										<v:f eqn="sum @10 21600 0">
										</v:f>
								</v:formulas>
								<v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f">
								</v:path>
								<o:lock aspectratio="t" v:ext="edit">
								</o:lock>
						</v:shapetype>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">
								<br />       </span>
				</span>
				<span style="font-family: 宋体;">从图中我们不难看出：</span>
				<span lang="EN-US">Strategy</span>
				<span style="font-family: 宋体;">模式实际上就是将算法一一封装起来，如图上的</span>
				<span lang="EN-US">ConcreteStrategyA</span>
				<span style="font-family: 宋体;">、</span>
				<span lang="EN-US">ConcreteStrategyB</span>
				<span style="font-family: 宋体;">、</span>
				<span lang="EN-US">ConcreteStrategyC</span>
				<span style="font-family: 宋体;">，但是它们都继承于一个接口，这样在</span>
				<span lang="EN-US">Context</span>
				<span style="font-family: 宋体;">调用时就可以以多态的方式来实现对于不用算法的调用。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>Strategy</span>
				<span style="font-family: 宋体;">模式的实现如下：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
				</span>
				<span style="font-family: 宋体;">我们现在来看一个场景：我在下班在回家的路上，可以有这几种选择，走路、骑车、坐车。首先，我们需要把算法抽象出来：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span lang="EN-US">
						<span style="">       </span>
				</span>
				<span style="font-size: 10pt; color: blue; font-family: 新宋体;" lang="EN-US">public</span>
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="color: blue;">interface</span>
						<span style="color: teal;">IStrategy<o:p></o:p></span>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">void</span> OnTheWay();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 20.25pt;">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 20.25pt;">
				<span style="font-size: 10pt; font-family: 新宋体;">接下来，我们需要实现走路、骑车和坐车几种方式。<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left;" align="left">
				<span style="font-size: 10pt; color: blue; font-family: 新宋体;" lang="EN-US">public</span>
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="color: blue;">class</span>
						<span style="color: teal;">WalkStrategy</span> : <span style="color: teal;">IStrategy<o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">void</span> OnTheWay()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: teal;">Console</span>.WriteLine(<span style="color: maroon;">"Walk on the road"</span>);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">class</span>
						<span style="color: teal;">RideBickStragtegy</span> : <span style="color: teal;">IStrategy<o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">void</span> OnTheWay()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: teal;">Console</span>.WriteLine(<span style="color: maroon;">"Ride the bicycle on the road"</span>);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">class</span>
						<span style="color: teal;">CarStragtegy</span> : <span style="color: teal;">IStrategy<o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">void</span> OnTheWay()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: teal;">Console</span>.WriteLine(<span style="color: maroon;">"Drive the car on the road"</span>);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 20.25pt;">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 20.25pt;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 20.25pt;">
				<span style="font-family: 宋体;">最后再用客户端代码调用封装的算法接口，实现一个走路回家的场景：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 20.25pt; text-align: left;" align="left">
				<span style="font-size: 10pt; color: blue; font-family: 新宋体;" lang="EN-US">class</span>
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="color: teal;">Program<o:p></o:p></span>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">static</span>
						<span style="color: blue;">void</span>
						<st1:place w:st="on">Main</st1:place>(<span style="color: blue;">string</span>[] args)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: teal;">Console</span>.WriteLine(<span style="color: maroon;">"Arrive to home"</span>);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: teal;">IStrategy</span> strategy = <span style="color: blue;">new</span><span style="color: teal;">WalkStrategy</span>();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>strategy.OnTheWay();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: teal;">Console</span>.Read();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 20.25pt;">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 20.25pt;">
				<span style="font-size: 10pt; font-family: 新宋体;">运行结果如下；<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 20.25pt;">
				<span lang="EN-US">Arrive to home</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 20.25pt;">
				<span lang="EN-US">Walk on the road</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 20.25pt;">
				<span style="font-family: 宋体;">如果我们需要实现其他的方法，只需要在</span>
				<span lang="EN-US">Context</span>
				<span style="font-family: 宋体;">改变一下</span>
				<span lang="EN-US">IStrategy</span>
				<span style="font-family: 宋体;">所示例化的对象就可以。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>Strategy</span>
				<span style="font-family: 宋体;">模式的要点：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">1</span>
				<span style="font-family: 宋体;">、</span>
				<span lang="EN-US">Strategy</span>
				<span style="font-family: 宋体;">及其子类为组件提供了一系列可重用的算法，从而可以使得类型在运行时方便地根据需要在各个算法之间进行切换。所谓封装算法，支持算法的变化。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">2</span>
				<span style="font-family: 宋体;">、</span>
				<span lang="EN-US">Strategy</span>
				<span style="font-family: 宋体;">模式提供了用条件判断语句以外的另一中选择，消除条件判断语句，就是在解耦合。含有许多条件判断语句的代码通常都需要</span>
				<span lang="EN-US">Strategy</span>
				<span style="font-family: 宋体;">模式。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">3</span>
				<span style="font-family: 宋体;">、</span>
				<span lang="EN-US">Strategy</span>
				<span style="font-family: 宋体;">模式已算法为中心，可以和</span>
				<span lang="EN-US">Factory Method</span>
				<span style="font-family: 宋体;">联合使用，在工厂中使用配制文件对变化的点进行动态的配置。这样就使变化放到了运行时。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">4</span>
				<span style="font-family: 宋体;">、与</span>
				<span lang="EN-US">Template Method</span>
				<span style="font-family: 宋体;">相比，</span>
				<span lang="EN-US">Strategy</span>
				<span style="font-family: 宋体;">模式的中心跟集中在方法的封装上</span>
		</p>
<img src ="http://www.blogjava.net/franky/aggbug/104817.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/franky/" target="_blank">Franky</a> 2007-03-19 21:06 <a href="http://www.blogjava.net/franky/articles/104817.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：设计模式学习笔记（十七）——Command命令模式</title><link>http://www.blogjava.net/franky/articles/104816.html</link><dc:creator>Franky</dc:creator><author>Franky</author><pubDate>Mon, 19 Mar 2007 13:06:00 GMT</pubDate><guid>http://www.blogjava.net/franky/articles/104816.html</guid><wfw:comment>http://www.blogjava.net/franky/comments/104816.html</wfw:comment><comments>http://www.blogjava.net/franky/articles/104816.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/franky/comments/commentRss/104816.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/franky/services/trackbacks/104816.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Command														命令模式介绍：																																								Command				命令模式是一种对象行为型模式，它主要解决的问题是：在软件构建过程中，“行为请求者”与“行为实现者”通常呈现一种“紧耦合”的问题。如下图：																			...&nbsp;&nbsp;<a href='http://www.blogjava.net/franky/articles/104816.html'>阅读全文</a><img src ="http://www.blogjava.net/franky/aggbug/104816.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/franky/" target="_blank">Franky</a> 2007-03-19 21:06 <a href="http://www.blogjava.net/franky/articles/104816.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：设计模式学习笔记（十六）——Template Method模板方法模式</title><link>http://www.blogjava.net/franky/articles/104815.html</link><dc:creator>Franky</dc:creator><author>Franky</author><pubDate>Mon, 19 Mar 2007 13:04:00 GMT</pubDate><guid>http://www.blogjava.net/franky/articles/104815.html</guid><wfw:comment>http://www.blogjava.net/franky/comments/104815.html</wfw:comment><comments>http://www.blogjava.net/franky/articles/104815.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/franky/comments/commentRss/104815.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/franky/services/trackbacks/104815.html</trackback:ping><description><![CDATA[
		<span style="" lang="EN-US">
				<span style="">
				</span>
		</span>
		<span style="font-family: 宋体;">今天开始学习设计模式中的第三个类型——行为型模式。</span>
		<span style="" lang="EN-US">
				<o:p>
				</o:p>
		</span>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<strong style="">
						<span style="font-family: 宋体;">行为模式：</span>
				</strong>
				<strong style="">
						<span style="" lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</strong>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="font-family: 宋体;">行为型模式涉及到算法和对象间职责的分配。将注意力从控制流转移到对象间的联系方式上来。</span>
				<span style="" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN-US">
						<span style="">       </span>
				</span>
				<span style="font-family: 宋体;">行为模式分为：行为类模式和行为对象模式。行为类模式使用继承机制在类间分派行为；行为对象模式使用对象复合而不是继承。</span>
				<span style="" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<strong style="">
						<span style="" lang="EN-US">Template Method</span>
				</strong>
				<strong style="">
						<span style="font-family: 宋体;">模板方法模式</span>
				</strong>
				<strong style="">
						<span style="" lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</strong>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<strong style="">
						<span style="" lang="EN-US">
								<span style="">       </span>Template Method</span>
				</strong>
				<strong style="">
						<span style="font-family: 宋体;">模板方法模式介绍：</span>
				</strong>
				<strong style="">
						<span style="" lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</strong>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN-US">
						<span style="">       </span>Template Method</span>
				<span style="font-family: 宋体;">模板方法模式是一种行为型模式，具体点说是行为类型模式。主要解决在软件构建过程中，对于某一项任务，常常有稳定的整体操作结构，但各个子步骤却有很多改变的需求，或者由于固有的原因而无法和任务的整体结构同时实现。</span>
				<span style="" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN-US">
						<span style="">       </span>GoF</span>
				<span style="font-family: 宋体;">《设计模式》中说道：定义一个操作中的算法的骨架，而将一些步骤延迟到子类中。</span>
				<span style="" lang="EN-US">Template Method</span>
				<span style="font-family: 宋体;">使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤</span>
				<span style="" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;" align="left">
				<span style="" lang="EN-US">
						<span style="">       </span>
						<strong style="">Template Method</strong>
				</span>
				<strong style="">
						<span style="font-family: 宋体;">模式的结构<br /></span>
				</strong>
		</p>
		<strong style="">
				<span style="font-family: 宋体;">
						<p class="MsoNormal" style="margin: 0cm 0cm 0pt;" align="center">
								<img alt="" src="http://www.cnblogs.com/images/cnblogs_com/kid-li/TemplateMethod_1.jpg" border="0" height="298" width="217" />
								<br />
						</p>
				</span>
		</strong>
		<strong style="">
				<span style="" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</strong>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center">
				<span style="" lang="EN-US">
						<v:shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600">
								<v:stroke joinstyle="miter">
								</v:stroke>
								<v:formulas>
										<v:f eqn="if lineDrawn pixelLineWidth 0">
										</v:f>
										<v:f eqn="sum @0 1 0">
										</v:f>
										<v:f eqn="sum 0 0 @1">
										</v:f>
										<v:f eqn="prod @2 1 2">
										</v:f>
										<v:f eqn="prod @3 21600 pixelWidth">
										</v:f>
										<v:f eqn="prod @3 21600 pixelHeight">
										</v:f>
										<v:f eqn="sum @0 0 1">
										</v:f>
										<v:f eqn="prod @6 1 2">
										</v:f>
										<v:f eqn="prod @7 21600 pixelWidth">
										</v:f>
										<v:f eqn="sum @8 21600 0">
										</v:f>
										<v:f eqn="prod @7 21600 pixelHeight">
										</v:f>
										<v:f eqn="sum @10 21600 0">
										</v:f>
								</v:formulas>
								<v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f">
								</v:path>
								<o:lock aspectratio="t" v:ext="edit">
								</o:lock>
						</v:shapetype>
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN-US">
						<span style="">       </span>
				</span>
				<strong style="">
						<span style="font-family: 宋体;">定义场景</span>
				</strong>
				<strong style="">
						<span style="" lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</strong>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN-US">
						<span style="">       </span>
				</span>
				<span style="font-family: 宋体;">单看结构不好理解，我们来结合程序进行分析。现在定义一个场景：我想大家都玩过极品飞车（我相当喜欢）。游戏中有很多的汽车，但是从操作角度看大同小异。无非是起步（</span>
				<span style="" lang="EN-US">StartUp</span>
				<span style="font-family: 宋体;">）、行驶（</span>
				<span style="" lang="EN-US">Run</span>
				<span style="font-family: 宋体;">）、停车（</span>
				<span style="" lang="EN-US">Stop</span>
				<span style="font-family: 宋体;">）等等行为。汽车行驶的动作之间可能存在着差异，例如：手动档和自动档，但是接口是一样的，换句话说，基本都是这几个动作。结合</span>
				<span style="" lang="EN-US">Template Method</span>
				<span style="font-family: 宋体;">模式讲就是在这个程序中，结构（对汽车的操作）是稳定的，但是变化在于各个子步骤（操作行为的具体实现）。</span>
				<span style="" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<strong style="">
						<span style="" lang="EN-US">
								<span style="">       </span>
						</span>
				</strong>
				<strong style="">
						<span style="font-family: 宋体;">程序实现与结构分析</span>
				</strong>
				<strong style="">
						<span style="" lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</strong>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN-US">
						<span style="">       </span>
				</span>
				<span style="font-family: 宋体;">首先我们需要一个汽车的抽象类（结构图中的</span>
				<span style="" lang="EN-US">AbstractClass</span>
				<span style="font-family: 宋体;">）</span>
				<span style="" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="" lang="EN-US">
						<span style="">       </span>
				</span>
				<span style="color: blue; font-family: 新宋体;" lang="EN-US">public</span>
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="color: blue;">abstract</span>
						<span style="color: blue;">class</span>
						<span style="color: teal;">AbstractCar<o:p></o:p></span>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">protected</span>
						<span style="color: blue;">abstract</span>
						<span style="color: blue;">string</span> StartUp();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">protected</span>
						<span style="color: blue;">abstract</span>
						<span style="color: blue;">string</span> Run();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">protected</span>
						<span style="color: blue;">abstract</span>
						<span style="color: blue;">string</span> Stop();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">void</span> DriveOnTheRoad()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: teal;">Console</span>.WriteLine(StartUp());<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: teal;">Console</span>.WriteLine(Run());<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: teal;">Console</span>.WriteLine(Stop());<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;">在这段代码中，抽象方法<span lang="EN-US">StartUp</span>、<span lang="EN-US">Run</span>、<span lang="EN-US">Stop</span>叫做<span lang="EN-US">primitive operation</span>（原语操作），它们是在子类中的扩展点，例如我们要编写一辆<span lang="EN-US">BORA</span>的实现，在他继承<span lang="EN-US">AbstractCar</span>后，可以在这几个<span lang="EN-US">primitive operation</span>上进行自己个步骤的实现。<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">AbstractCar</span>
				<span style="font-family: 新宋体;">中的<span lang="EN-US">DriveOnTheRoad</span>方法叫做<span lang="EN-US">template method</span>（模板方法），<span lang="EN-US">template method</span>用<span lang="EN-US">primitive operation</span>定义一个算法，是相对稳定的部分。（子类中重新定义<span lang="EN-US">primitive operation</span>）。<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>
				</span>
				<span style="font-family: 新宋体;">然后我们要实现一辆<span lang="EN-US">BORA</span>汽车（结构图中的<span lang="EN-US">ConcreteClass</span>）<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">class</span>
						<span style="color: teal;">BORA</span> : <span style="color: teal;">AbstractCar<o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">protected</span>
						<span style="color: blue;">override</span>
						<span style="color: blue;">string</span> StartUp()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: blue;">return</span>
						<span style="color: maroon;">"BORA is StartUp"</span>;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">protected</span>
						<span style="color: blue;">override</span>
						<span style="color: blue;">string</span> Run()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">      </span>
						<span style="">  </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: blue;">return</span>
						<span style="color: maroon;">"BORA is Running"</span>;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">protected</span>
						<span style="color: blue;">override</span>
						<span style="color: blue;">string</span> Stop()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: blue;">return</span>
						<span style="color: maroon;">"BORA is Stoped"</span>;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;">接下来我们进行客户程序的实现<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt; text-align: left;" align="left">
				<span style="color: blue; font-family: 新宋体;" lang="EN-US">class</span>
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="color: teal;">Program<o:p></o:p></span>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">static</span>
						<span style="color: blue;">void</span>
						<st1:place w:st="on">Main</st1:place>(<span style="color: blue;">string</span>[] args)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: teal;">ClientApp</span>.Drive(<span style="color: blue;">new</span><span style="color: teal;">BORA</span>());<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: teal;">Console</span>.Read();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt; text-align: left;" align="left">
				<span style="color: blue; font-family: 新宋体;" lang="EN-US">public</span>
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="color: blue;">class</span>
						<span style="color: teal;">ClientApp<o:p></o:p></span>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">static</span>
						<span style="color: blue;">void</span> Drive(<span style="color: teal;">AbstractCar</span> car)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>car.DriveOnTheRoad();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;">运行结果如下：<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">BORA is StartUp<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">BORA is Running<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">BORA is Stoped<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>
				</span>
				<span style="" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<span style="font-size: 10.5pt; font-family: 'Times New Roman';" lang="EN-US">
				<br style="page-break-before: auto;" clear="all" />
		</span>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<strong style="">
						<span style="" lang="EN-US">Template Method</span>
				</strong>
				<strong style="">
						<span style="font-family: 宋体;">要点</span>
				</strong>
				<strong style="">
						<span style="" lang="EN-US">
								<o:p>
								</o:p>
						</span>
				</strong>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt;">
				<span style="" lang="EN-US">
						<span style="">1、<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">  </span></span>
				</span>
				<span style="" lang="EN-US">Template Method</span>
				<span style="font-family: 宋体;">模式是一种非常基础性的设计模式，在面向对象系统中有着大量的应用。它用最简洁的机制（虚函数的多态性）为了很多应用程序框架提供了灵活的扩展点，是代码复用方面的基本实现结构。</span>
				<span style="" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt;">
				<span style="" lang="EN-US">
						<span style="">2、<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">  </span></span>
				</span>
				<span style="font-family: 宋体;">除了可以灵活应对子步骤的变化外，“</span>
				<span style="" lang="EN-US">Don't call me.Let me Call you</span>
				<span style="font-family: 宋体;">”的反向控制结构是</span>
				<span style="" lang="EN-US">Template Method</span>
				<span style="font-family: 宋体;">的典型应用。“</span>
				<span style="" lang="EN-US">Don’t call me.Let me Call you</span>
				<span style="font-family: 宋体;">”是指一个父类调用一个子类的操作，而不是相反。</span>
				<span style="" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt;">
				<span style="" lang="EN-US">
						<span style="">3、<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">  </span></span>
				</span>
				<span style="font-family: 宋体;">在具体实现方面，被</span>
				<span style="" lang="EN-US">Template Method</span>
				<span style="font-family: 宋体;">调用的虚方法可以具有实现，也可以没有任何实现（抽象方法、纯虚方法），但一般推荐将它们设置为</span>
				<span style="" lang="EN-US">protected</span>
				<span style="font-family: 宋体;">方法。可以没有具体实现的方法应该称为</span>
				<span style="" lang="EN-US">hook operation</span>
				<span style="font-family: 宋体;">（钩子操作），提供了缺省的行为，子类可以在必要时进行扩展。</span>
				<span style="" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt;">
				<span style="" lang="EN-US">
						<span style="">4、<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">  </span></span>
				</span>
				<span style="font-family: 宋体;">尽量减少</span>
				<span style="" lang="EN-US">primitive operation</span>
				<span style="font-family: 宋体;">，因为需要重新定义的操作越多，客户程序就越长</span>
		</p>
<img src ="http://www.blogjava.net/franky/aggbug/104815.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/franky/" target="_blank">Franky</a> 2007-03-19 21:04 <a href="http://www.blogjava.net/franky/articles/104815.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：设计模式学习笔记（十五）——结构型模式总结</title><link>http://www.blogjava.net/franky/articles/104814.html</link><dc:creator>Franky</dc:creator><author>Franky</author><pubDate>Mon, 19 Mar 2007 13:03:00 GMT</pubDate><guid>http://www.blogjava.net/franky/articles/104814.html</guid><wfw:comment>http://www.blogjava.net/franky/comments/104814.html</wfw:comment><comments>http://www.blogjava.net/franky/articles/104814.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/franky/comments/commentRss/104814.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/franky/services/trackbacks/104814.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left;" align="left">
				<span style="font-family: 宋体;">结构型设计模式是从程序的结构上解决模块之间的耦合问题（好像是句废话），</span>
				<span lang="EN-US">GoF23</span>
				<span style="font-family: 宋体;">种设计模式中结构型设计模式有</span>
				<span lang="EN-US">7</span>
				<span style="font-family: 宋体;">种，分别是：</span>
				<span lang="EN-US">Adapter</span>
				<span style="font-family: 宋体;">适配器模式、</span>
				<span lang="EN-US">Bridge</span>
				<span style="font-family: 宋体;">桥接模式、</span>
				<span lang="EN-US">Composite</span>
				<span style="font-family: 宋体;">组合模式、</span>
				<span lang="EN-US">Decorator</span>
				<span style="font-family: 宋体;">装饰模式、</span>
				<span lang="EN-US">Facade</span>
				<span style="font-family: 宋体;">外观模式、</span>
				<span lang="EN-US">Flyweight</span>
				<span style="font-family: 宋体;">享元模式和</span>
				<span lang="EN-US">Proxy</span>
				<span style="font-family: 宋体;">代理模式。下面分别总结一下这几种模式：<br /></span>
		</p>
		<table class="MsoTableGrid" style="border: medium none ; border-collapse: collapse;" border="1" cellpadding="0" cellspacing="0">
				<tbody>
						<tr style="">
								<td style="border: 1pt solid windowtext; padding: 0cm 5.4pt; width: 142pt; background-color: transparent;" valign="top" width="189">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center">
												<span style="font-family: 宋体;">设计模式</span>
										</p>
								</td>
								<td style="border-style: solid solid solid none; border-color: windowtext windowtext windowtext rgb(255, 255, 255); border-width: 1pt 1pt 1pt medium; padding: 0cm 5.4pt; width: 142.05pt; background-color: transparent;" valign="top" width="189">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center">
												<span style="color: black;" lang="EN-US">GoF</span>
												<span style="color: black; font-family: 宋体;">的描述</span>
												<span style="color: black;" lang="EN-US">
														<o:p>
														</o:p>
												</span>
										</p>
								</td>
								<td style="border-style: solid solid solid none; border-color: windowtext windowtext windowtext rgb(255, 255, 255); border-width: 1pt 1pt 1pt medium; padding: 0cm 5.4pt; width: 142.05pt; background-color: transparent;" valign="top" width="189">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center">
												<span style="color: black; font-family: 宋体;">我的理解</span>
												<span style="color: black;" lang="EN-US">
														<o:p>
														</o:p>
												</span>
										</p>
								</td>
						</tr>
						<tr style="">
								<td style="border-style: none solid solid; border-color: rgb(255, 255, 255) windowtext windowtext; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 142pt; background-color: transparent;" valign="top" width="189">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center">
												<span lang="EN-US">Adapter</span>
												<span style="font-family: 宋体;">适配器模式</span>
										</p>
								</td>
								<td style="border-style: none solid solid none; border-color: rgb(255, 255, 255) windowtext windowtext rgb(255, 255, 255); border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 142.05pt; background-color: transparent;" valign="top" width="189">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center">
												<span style="color: black; font-family: 宋体;">将一个类的接口转换成客户希望的另一个接口。</span>
												<span style="color: black;" lang="EN-US">Adapter</span>
												<span style="color: black; font-family: 宋体;">模式使得原本由于接口不兼容而不能一起工作的类可以一起工作</span>
												<span style="color: black;" lang="EN-US">
														<o:p>
														</o:p>
												</span>
										</p>
								</td>
								<td style="border-style: none solid solid none; border-color: rgb(255, 255, 255) windowtext windowtext rgb(255, 255, 255); border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 142.05pt; background-color: transparent;" valign="top" width="189">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span style="color: black; font-family: 宋体;">转换接口，由于应用环境的变化，常常需要将“一些现存的对象”放在新的环境中应用，但是，新环境要求的接口是现存对象所不满足的，此时我们可以通过添加一层</span>
												<span style="color: black;" lang="EN-US">Adapter</span>
												<span style="color: black; font-family: 宋体;">对现有的对象加入一些接口，使其适应新的应用环境。</span>
												<span style="color: black;" lang="EN-US">
														<o:p>
														</o:p>
												</span>
										</p>
								</td>
						</tr>
						<tr style="">
								<td style="border-style: none solid solid; border-color: rgb(255, 255, 255) windowtext windowtext; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 142pt; background-color: transparent;" valign="top" width="189">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center">
												<span lang="EN-US">Bridge</span>
												<span style="font-family: 宋体;">桥接模式</span>
										</p>
								</td>
								<td style="border-style: none solid solid none; border-color: rgb(255, 255, 255) windowtext windowtext rgb(255, 255, 255); border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 142.05pt; background-color: transparent;" valign="top" width="189">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center">
												<span style="color: black; font-family: 宋体;">将抽象部分与实现部分分离，使他们可以独立的变化</span>
												<span style="color: black;" lang="EN-US">
														<o:p>
														</o:p>
												</span>
										</p>
								</td>
								<td style="border-style: none solid solid none; border-color: rgb(255, 255, 255) windowtext windowtext rgb(255, 255, 255); border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 142.05pt; background-color: transparent;" valign="top" width="189">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span style="color: black; font-family: 宋体;">分离接口（抽象）与其实现，当某个类型具有两个或两个以上的纬度变化（或者说是变化点），通过以继承接口的方式隔离变化，以减少因变化带来的代码的修改量。</span>
												<span style="color: black;" lang="EN-US">
														<o:p>
														</o:p>
												</span>
										</p>
								</td>
						</tr>
						<tr style="">
								<td style="border-style: none solid solid; border-color: rgb(255, 255, 255) windowtext windowtext; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 142pt; background-color: transparent;" valign="top" width="189">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center">
												<span lang="EN-US">Composite</span>
												<span style="font-family: 宋体;">组合模式</span>
										</p>
								</td>
								<td style="border-style: none solid solid none; border-color: rgb(255, 255, 255) windowtext windowtext rgb(255, 255, 255); border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 142.05pt; background-color: transparent;" valign="top" width="189">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center">
												<span style="color: black; font-family: 宋体;">将对象组合成树形结构以表示“部分</span>
												<span style="color: black;" lang="EN-US">-</span>
												<span style="color: black; font-family: 宋体;">整体”的层次结构。</span>
												<span style="color: black;" lang="EN-US">Composite</span>
												<span style="color: black; font-family: 宋体;">模式使得客户对单个对象和组合对象的使用具有一致性</span>
												<span style="color: black;" lang="EN-US">
														<o:p>
														</o:p>
												</span>
										</p>
								</td>
								<td style="border-style: none solid solid none; border-color: rgb(255, 255, 255) windowtext windowtext rgb(255, 255, 255); border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 142.05pt; background-color: transparent;" valign="top" width="189">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span style="color: black; font-family: 宋体;">解决客户程序与复杂对象容器的解耦，一类具有“容器特征”的对象——即他们在充当对象的同时，又是其他对象的容器的情况，通过继承统一的接口，我们可以将容器对象及其子对象看成同一类对象使用，以减少对象使用中的复杂度。</span>
												<span style="color: black;" lang="EN-US">
														<o:p>
														</o:p>
												</span>
										</p>
								</td>
						</tr>
						<tr style="">
								<td style="border-style: none solid solid; border-color: rgb(255, 255, 255) windowtext windowtext; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 142pt; background-color: transparent;" valign="top" width="189">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center">
												<span lang="EN-US">Decorator</span>
												<span style="font-family: 宋体;">装饰模式</span>
										</p>
								</td>
								<td style="border-style: none solid solid none; border-color: rgb(255, 255, 255) windowtext windowtext rgb(255, 255, 255); border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 142.05pt; background-color: transparent;" valign="top" width="189">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center">
												<span style="color: black; font-family: 宋体;">动态的给一个对象添加一些额外的职责。就增加功能而言，</span>
												<span style="color: black;" lang="EN-US">Decorator</span>
												<span style="color: black; font-family: 宋体;">模式比生成子类更为灵活</span>
												<span style="color: black;" lang="EN-US">
														<o:p>
														</o:p>
												</span>
										</p>
								</td>
								<td style="border-style: none solid solid none; border-color: rgb(255, 255, 255) windowtext windowtext rgb(255, 255, 255); border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 142.05pt; background-color: transparent;" valign="top" width="189">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span style="color: black; font-family: 宋体;">在稳定接口的前提下为对象扩展功能，主要是解决用继承的方式为对象扩展大量功能而造成的子对象数量膨胀的问题</span>
												<span style="color: black;" lang="EN-US">
														<o:p>
														</o:p>
												</span>
										</p>
								</td>
						</tr>
						<tr style="">
								<td style="border-style: none solid solid; border-color: rgb(255, 255, 255) windowtext windowtext; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 142pt; background-color: transparent;" valign="top" width="189">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center">
												<span lang="EN-US">Facade</span>
												<span style="font-family: 宋体;">外观模式</span>
										</p>
								</td>
								<td style="border-style: none solid solid none; border-color: rgb(255, 255, 255) windowtext windowtext rgb(255, 255, 255); border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 142.05pt; background-color: transparent;" valign="top" width="189">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center">
												<span style="color: black; font-family: 宋体;">为子系统中的一组接口提供一个一致的界面，</span>
												<span style="color: black;" lang="EN-US">Facade</span>
												<span style="color: black; font-family: 宋体;">模式定义了一个高层接口，这个接口使得这一子系统更加容易使用</span>
												<span style="color: black;" lang="EN-US">
														<o:p>
														</o:p>
												</span>
										</p>
								</td>
								<td style="border-style: none solid solid none; border-color: rgb(255, 255, 255) windowtext windowtext rgb(255, 255, 255); border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 142.05pt; background-color: transparent;" valign="top" width="189">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span style="color: black; font-family: 宋体;">简化接口，对于复杂子系统或子对象调用的封装。从客户程序角度看，只能看见</span>
												<span style="color: black;" lang="EN-US">Facade</span>
												<span style="color: black; font-family: 宋体;">提供的接口。换句话说是对子对象调用的封装，将客户程序对子对象的调用与子对象的变化分离。</span>
												<span style="color: black;" lang="EN-US">
														<o:p>
														</o:p>
												</span>
										</p>
								</td>
						</tr>
						<tr style="">
								<td style="border-style: none solid solid; border-color: rgb(255, 255, 255) windowtext windowtext; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 142pt; background-color: transparent;" valign="top" width="189">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center">
												<span lang="EN-US">Flyweight</span>
												<span style="font-family: 宋体;">享元模式</span>
										</p>
								</td>
								<td style="border-style: none solid solid none; border-color: rgb(255, 255, 255) windowtext windowtext rgb(255, 255, 255); border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 142.05pt; background-color: transparent;" valign="top" width="189">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center">
												<span style="color: black; font-family: 宋体;">运用共享技术有效的支持大量细粒度的对象</span>
												<span style="color: black;" lang="EN-US">
														<o:p>
														</o:p>
												</span>
										</p>
								</td>
								<td style="border-style: none solid solid none; border-color: rgb(255, 255, 255) windowtext windowtext rgb(255, 255, 255); border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 142.05pt; background-color: transparent;" valign="top" width="189">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span style="color: black; font-family: 宋体;">主要是解决由于相同对象数量过大而造成系统内存开销过大的问题。实际上是相同的对象引用指向同一个对象空间。在使用</span>
												<span style="color: black;" lang="EN-US">Flyweight</span>
												<span style="color: black; font-family: 宋体;">模式前要做一个评估，如果使用不当会适得其反</span>
												<span style="color: black;" lang="EN-US">
														<o:p>
														</o:p>
												</span>
										</p>
								</td>
						</tr>
						<tr style="">
								<td style="border-style: none solid solid; border-color: rgb(255, 255, 255) windowtext windowtext; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 142pt; background-color: transparent;" valign="top" width="189">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center">
												<span lang="EN-US">Proxy</span>
												<span style="font-family: 宋体;">代理模式</span>
										</p>
								</td>
								<td style="border-style: none solid solid none; border-color: rgb(255, 255, 255) windowtext windowtext rgb(255, 255, 255); border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 142.05pt; background-color: transparent;" valign="top" width="189">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center">
												<span style="color: black; font-family: 宋体;">为其他对象提供一种代理以控制这个对象的访问</span>
												<span style="color: black;" lang="EN-US">
														<o:p>
														</o:p>
												</span>
										</p>
								</td>
								<td style="border-style: none solid solid none; border-color: rgb(255, 255, 255) windowtext windowtext rgb(255, 255, 255); border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 142.05pt; background-color: transparent;" valign="top" width="189">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
												<span style="color: black; font-family: 宋体;">解决直接访问某些对象是出现的问题，如：访问远程的对象</span>
												<span style="color: black;" lang="EN-US">
														<o:p>
														</o:p>
												</span>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p align="left">
				<span style="font-family: 宋体;">   在学习的过程中感觉，从代码的角度看</span>
				<span lang="EN-US">Adapter</span>
				<span style="font-family: 宋体;">适配器模式和</span>
				<span lang="EN-US">Proxy</span>
				<span style="font-family: 宋体;">代理模式有些类似，</span>
				<span lang="EN-US">Adapter</span>
				<span style="font-family: 宋体;">适配器模式是解决现有对象在新的环境中的不足，而</span>
				<span lang="EN-US">Proxy</span>
				<span style="font-family: 宋体;">代理模式是解决直接访问对象时出现的问题，这两种模式从使用角度看都是解决直接访问对象时出现的问题，只是含义不十分相同。</span>
		</p>
<img src ="http://www.blogjava.net/franky/aggbug/104814.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/franky/" target="_blank">Franky</a> 2007-03-19 21:03 <a href="http://www.blogjava.net/franky/articles/104814.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：设计模式学习笔记（十四）——创建型模式总结</title><link>http://www.blogjava.net/franky/articles/104813.html</link><dc:creator>Franky</dc:creator><author>Franky</author><pubDate>Mon, 19 Mar 2007 13:03:00 GMT</pubDate><guid>http://www.blogjava.net/franky/articles/104813.html</guid><wfw:comment>http://www.blogjava.net/franky/comments/104813.html</wfw:comment><comments>http://www.blogjava.net/franky/articles/104813.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/franky/comments/commentRss/104813.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/franky/services/trackbacks/104813.html</trackback:ping><description><![CDATA[
		<span lang="EN-US">GoF23</span>
		<span style="font-family: 宋体;">种设计模式中创建型模式有</span>
		<span lang="EN-US">5</span>
		<span style="font-family: 宋体;">种，分别是：</span>
		<span lang="EN-US">Singleton</span>
		<span style="font-family: 宋体;">单件模式、</span>
		<span lang="EN-US">Abstract Factory</span>
		<span style="font-family: 宋体;">抽象工厂模式、</span>
		<span lang="EN-US">Builder</span>
		<span style="font-family: 宋体;">生成器模式、</span>
		<span lang="EN-US">Factory Method</span>
		<span style="font-family: 宋体;">工厂方法模式、</span>
		<span lang="EN-US">Prototype</span>
		<span style="font-family: 宋体;">原形模式。下面分别总结这几种设计模式。</span>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<table class="MsoTableGrid" style="border: medium none ; border-collapse: collapse;" border="1" cellpadding="0" cellspacing="0">
				<tbody>
						<tr style="">
								<td style="border: 1pt solid windowtext; padding: 0cm 5.4pt; width: 142pt; background-color: transparent;" valign="top" width="189">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center">
												<span style="font-family: 宋体;">设计模式</span>
										</p>
								</td>
								<td style="border-style: solid solid solid none; border-color: windowtext windowtext windowtext rgb(255, 255, 255); border-width: 1pt 1pt 1pt medium; padding: 0cm 5.4pt; width: 142.05pt; background-color: transparent;" valign="top" width="189">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center">
												<span lang="EN-US">GoF</span>
												<span style="font-family: 宋体;">的描述</span>
										</p>
								</td>
								<td style="border-style: solid solid solid none; border-color: windowtext windowtext windowtext rgb(255, 255, 255); border-width: 1pt 1pt 1pt medium; padding: 0cm 5.4pt; width: 142.05pt; background-color: transparent;" valign="top" width="189">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center">
												<span style="font-family: 宋体;">我的理解</span>
										</p>
								</td>
						</tr>
						<tr style="">
								<td style="border-style: none solid solid; border-color: rgb(255, 255, 255) windowtext windowtext; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 142pt; background-color: transparent;" valign="top" width="189">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center">
												<span lang="EN-US">Singleton</span>
												<span style="font-family: 宋体;">单件模式</span>
										</p>
								</td>
								<td style="border-style: none solid solid none; border-color: rgb(255, 255, 255) windowtext windowtext rgb(255, 255, 255); border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 142.05pt; background-color: transparent;" valign="top" width="189">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center">
												<span style="color: black; font-family: 新宋体;">保证一个类仅有一个实例，并提供一个该实例全局的访问点</span>
												<span style="color: black;" lang="EN-US">
														<o:p>
														</o:p>
												</span>
										</p>
								</td>
								<td style="border-style: none solid solid none; border-color: rgb(255, 255, 255) windowtext windowtext rgb(255, 255, 255); border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 142.05pt; background-color: transparent;" valign="top" width="189">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center">
												<span style="font-family: 宋体;">控制实体对象的数量</span>
										</p>
								</td>
						</tr>
						<tr style="">
								<td style="border-style: none solid solid; border-color: rgb(255, 255, 255) windowtext windowtext; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 142pt; background-color: transparent;" valign="top" width="189">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center">
												<span lang="EN-US">Abstract Factory</span>
												<span style="font-family: 宋体;">抽象工厂模式</span>
										</p>
								</td>
								<td style="border-style: none solid solid none; border-color: rgb(255, 255, 255) windowtext windowtext rgb(255, 255, 255); border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 142.05pt; background-color: transparent;" valign="top" width="189">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center">
												<span style="color: black; font-family: 宋体;">提供一个接口，让该接口负责创建一系列</span>
												<span style="color: black; font-family: Verdana;" lang="EN-US">“</span>
												<span style="color: black; font-family: 宋体;">相关或者相互依赖的对象</span>
												<span style="color: black; font-family: Verdana;" lang="EN-US">”</span>
												<span style="color: black; font-family: 宋体;">，无需指定他们的具体类</span>
												<span style="color: black;" lang="EN-US">
														<o:p>
														</o:p>
												</span>
										</p>
								</td>
								<td style="border-style: none solid solid none; border-color: rgb(255, 255, 255) windowtext windowtext rgb(255, 255, 255); border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 142.05pt; background-color: transparent;" valign="top" width="189">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center">
												<span style="color: black; font-family: 宋体;">解决一个系列的对象变化的问题</span>
										</p>
								</td>
						</tr>
						<tr style="">
								<td style="border-style: none solid solid; border-color: rgb(255, 255, 255) windowtext windowtext; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 142pt; background-color: transparent;" valign="top" width="189">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center">
												<span lang="EN-US">Builder</span>
												<span style="font-family: 宋体;">生成器模式</span>
										</p>
								</td>
								<td style="border-style: none solid solid none; border-color: rgb(255, 255, 255) windowtext windowtext rgb(255, 255, 255); border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 142.05pt; background-color: transparent;" valign="top" width="189">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center">
												<span style="color: black; font-family: 宋体;">将一个复杂对象的构建与其表示向分离，使得同样的构建过程可以创建不同的表示</span>
												<span style="color: black;" lang="EN-US">
														<o:p>
														</o:p>
												</span>
										</p>
								</td>
								<td style="border-style: none solid solid none; border-color: rgb(255, 255, 255) windowtext windowtext rgb(255, 255, 255); border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 142.05pt; background-color: transparent;" valign="top" width="189">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center">
												<span style="color: black; font-family: 宋体;">应对项目中一些复杂对象的创建工作。所谓</span>
												<span style="color: black; font-family: Verdana;" lang="EN-US">“</span>
												<span style="color: black; font-family: 宋体;">复杂对象</span>
												<span style="color: black; font-family: Verdana;" lang="EN-US">”</span>
												<span style="color: black; font-family: 宋体;">，是指：此对象中还含有其它的子对象</span>
										</p>
								</td>
						</tr>
						<tr style="">
								<td style="border-style: none solid solid; border-color: rgb(255, 255, 255) windowtext windowtext; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 142pt; background-color: transparent;" valign="top" width="189">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center">
												<span lang="EN-US">Factory Method</span>
												<span style="font-family: 宋体;">工厂方法模式</span>
										</p>
								</td>
								<td style="border-style: none solid solid none; border-color: rgb(255, 255, 255) windowtext windowtext rgb(255, 255, 255); border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 142.05pt; background-color: transparent;" valign="top" width="189">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center">
												<span style="color: black; font-family: 宋体;">定义一个用于创建对象的接口，让子类决定实例化那个类。</span>
												<span style="color: black;" lang="EN-US">FactoryMethod</span>
												<span style="color: black; font-family: 宋体;">使得一个类的实例化延迟到子类</span>
												<span style="color: black;" lang="EN-US">
														<o:p>
														</o:p>
												</span>
										</p>
								</td>
								<td style="border-style: none solid solid none; border-color: rgb(255, 255, 255) windowtext windowtext rgb(255, 255, 255); border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 142.05pt; background-color: transparent;" valign="top" width="189">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center">
												<span style="color: black; font-family: 宋体;">解决的是“某个对象”的创建工作，由于需求的变化，这个对象常常面临着剧烈的变化，但是这个对象拥有的接口相对稳定。也就是说：枝节常常发生变化，但是枝节与主干的接口相对稳定</span>
										</p>
								</td>
						</tr>
						<tr style="">
								<td style="border-style: none solid solid; border-color: rgb(255, 255, 255) windowtext windowtext; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 142pt; background-color: transparent;" valign="top" width="189">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center">
												<span lang="EN-US">Prototype</span>
												<span style="font-family: 宋体;">原形模式</span>
										</p>
								</td>
								<td style="border-style: none solid solid none; border-color: rgb(255, 255, 255) windowtext windowtext rgb(255, 255, 255); border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 142.05pt; background-color: transparent;" valign="top" width="189">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center">
												<span style="color: black; font-family: 宋体;">使用原型实例指定创建对象的种类，然后通过拷贝这些原型来创建新的对象</span>
										</p>
								</td>
								<td style="border-style: none solid solid none; border-color: rgb(255, 255, 255) windowtext windowtext rgb(255, 255, 255); border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 142.05pt; background-color: transparent;" valign="top" width="189">
										<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center">
												<span style="color: black; font-family: 宋体;">某些结构复杂的对象的创建工作；由于需求的变化，这些对象经常面临着剧烈的变化，但是他们却拥有比较稳定一致的接口</span>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="font-family: 宋体;">在学习的过程中，觉得从功能上看</span>
				<span lang="EN-US">Abstract Factory</span>
				<span style="font-family: 宋体;">模式和</span>
				<span lang="EN-US">Builder</span>
				<span style="font-family: 宋体;">模式容易混淆，</span>
				<span lang="EN-US">Factory Method</span>
				<span style="font-family: 宋体;">模式和</span>
				<span lang="EN-US">Prototype</span>
				<span style="font-family: 宋体;">模式不好区分。</span>
				<span lang="EN-US">Singleton</span>
				<span style="font-family: 宋体;">模式没什么太大的困难。下面就来分析一下前四种模式。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="font-family: 宋体;">一、</span>
				<span lang="EN-US">Abstract Factory</span>
				<span style="font-family: 宋体;">模式和</span>
				<span lang="EN-US">Builder</span>
				<span style="font-family: 宋体;">模式：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span lang="EN-US">Abstract Factory</span>
				<span style="font-family: 宋体;">是应对一系列对象的创建的问题，正如前面文章中举的例子，对于创建一个汽车对象来说，</span>
				<span lang="EN-US">Abstract Factory</span>
				<span style="font-family: 宋体;">模式更关注一系列的对象的创建，或者说是汽车类型中的各个部分，如：</span>
				<span lang="EN-US">Wheel</span>
				<span style="font-family: 宋体;">、</span>
				<span lang="EN-US">Engine</span>
				<span style="font-family: 宋体;">、</span>
				<span lang="EN-US">Body</span>
				<span style="font-family: 宋体;">等等类型的创建。换句话说关注点在这一系列对象上。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span lang="EN-US">Builder</span>
				<span style="font-family: 宋体;">是应对一个复杂对象创建的问题，或者说是针对这个复杂对象中的子对象的创建的问题。以汽车的例子来说，我觉得比起</span>
				<span lang="EN-US">Abstract Factory</span>
				<span style="font-family: 宋体;">模式，</span>
				<span lang="EN-US">Builder</span>
				<span style="font-family: 宋体;">模式相对注重汽车类型（上面所说的“复杂对象”）本身以及其各个部分（</span>
				<span lang="EN-US">Wheel</span>
				<span style="font-family: 宋体;">、</span>
				<span lang="EN-US">Engine</span>
				<span style="font-family: 宋体;">、</span>
				<span lang="EN-US">Body</span>
				<span style="font-family: 宋体;">等等）类型的创建。</span>
				<span lang="EN-US">Builder</span>
				<span style="font-family: 宋体;">模式要求这个复杂的类型（汽车）中的各个子类型的结合部分相对稳定，用例子说明就是对于汽车来说，无论用什么配件组装，个个配件的组装方式都一样，有相对稳定的接口。对于这辆车你用什么牌子的</span>
				<span lang="EN-US">Wheel</span>
				<span style="font-family: 宋体;">、什么牌子的</span>
				<span lang="EN-US">Engine</span>
				<span style="font-family: 宋体;">可能变化会很大很频繁。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="font-family: 宋体;">二、</span>
				<span lang="EN-US">Factory Method</span>
				<span style="font-family: 宋体;">模式和</span>
				<span lang="EN-US">Prototype</span>
				<span style="font-family: 宋体;">模式：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="font-family: 宋体;">开始我觉得这两种模式从功能上讲是一样的（个人观点），都是封装了对对象的创建，只不过</span>
				<span lang="EN-US">Prototype</span>
				<span style="font-family: 宋体;">模式是用</span>
				<span style="color: black; font-family: 新宋体;">原型克隆</span>
				<span style="font-family: 宋体;">进行拷贝来完成对象的创建，在这之中还应注意浅拷贝和深拷贝的区别。在向同事请教后有点明白。这两种模式在应用场景上还是一定的区别的。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span lang="EN-US">Factory Method</span>
				<span style="font-family: 宋体;">模式是重新创建一个对象</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span lang="EN-US">Prototype</span>
				<span style="font-family: 宋体;">模式是利用现有的对象进行克隆，当两个对象或多个对象雷同的时候，可以考虑用一个已创建的对象去克隆出其余的对象。<br />   以上是对创建型模式的总结，如有不对的观点欢迎指正。</span>
		</p>
<img src ="http://www.blogjava.net/franky/aggbug/104813.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/franky/" target="_blank">Franky</a> 2007-03-19 21:03 <a href="http://www.blogjava.net/franky/articles/104813.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：设计模式学习笔记（十三）——Proxy代理模式</title><link>http://www.blogjava.net/franky/articles/104812.html</link><dc:creator>Franky</dc:creator><author>Franky</author><pubDate>Mon, 19 Mar 2007 13:01:00 GMT</pubDate><guid>http://www.blogjava.net/franky/articles/104812.html</guid><wfw:comment>http://www.blogjava.net/franky/comments/104812.html</wfw:comment><comments>http://www.blogjava.net/franky/articles/104812.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/franky/comments/commentRss/104812.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/franky/services/trackbacks/104812.html</trackback:ping><description><![CDATA[
		<span style="" lang="EN-US">
				<span style="">  </span>Proxy</span>
		<span style="font-family: 宋体;">代
理模式是一种结构型设计模式，主要解决的问题是：在直接访问对象时带来的问题，比如说：要访问的对象在远程的机器上。在面向对象系统中，有些对象由于某些
原因（比如对象创建开销很大，或者某些操作需要安全控制，或者需要进程外的访问），直接访问会给使用者或者系统结构带来很多麻烦，我们可以在访问此对象时
加上一个对此对象的访问层。如下图：<br />   <img alt="" src="http://www.cnblogs.com/images/cnblogs_com/kid-li/Proxy1.jpg" border="0" height="188" width="362" /><br /></span>
		<span style="" lang="EN-US">
				<o:p>
				</o:p>
		</span>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center">
				<span style="" lang="EN-US">
						<v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f">
								<v:stroke joinstyle="miter">
								</v:stroke>
								<v:formulas>
										<v:f eqn="if lineDrawn pixelLineWidth 0">
										</v:f>
										<v:f eqn="sum @0 1 0">
										</v:f>
										<v:f eqn="sum 0 0 @1">
										</v:f>
										<v:f eqn="prod @2 1 2">
										</v:f>
										<v:f eqn="prod @3 21600 pixelWidth">
										</v:f>
										<v:f eqn="prod @3 21600 pixelHeight">
										</v:f>
										<v:f eqn="sum @0 0 1">
										</v:f>
										<v:f eqn="prod @6 1 2">
										</v:f>
										<v:f eqn="prod @7 21600 pixelWidth">
										</v:f>
										<v:f eqn="sum @8 21600 0">
										</v:f>
										<v:f eqn="prod @7 21600 pixelHeight">
										</v:f>
										<v:f eqn="sum @10 21600 0">
										</v:f>
								</v:formulas>
								<v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect">
								</v:path>
								<o:lock v:ext="edit" aspectratio="t">
								</o:lock>
						</v:shapetype>
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN-US">
						<span style="">       </span>
				</span>
				<span style="font-family: 宋体;">比如说</span>
				<span style="" lang="EN-US">C</span>
				<span style="font-family: 宋体;">和</span>
				<span style="" lang="EN-US">A</span>
				<span style="font-family: 宋体;">不在一个服务器上，</span>
				<span style="" lang="EN-US">A</span>
				<span style="font-family: 宋体;">要频繁的调用</span>
				<span style="" lang="EN-US">C</span>
				<span style="font-family: 宋体;">，我们可以在</span>
				<span style="" lang="EN-US">A</span>
				<span style="font-family: 宋体;">上做一个代理类</span>
				<span style="" lang="EN-US">Proxy</span>
				<span style="font-family: 宋体;">，把访问</span>
				<span style="" lang="EN-US">C</span>
				<span style="font-family: 宋体;">的工作交给</span>
				<span style="" lang="EN-US">Proxy</span>
				<span style="font-family: 宋体;">，这样对于</span>
				<span style="" lang="EN-US">A</span>
				<span style="font-family: 宋体;">来说，就好像在直接访问</span>
				<span style="" lang="EN-US">C</span>
				<span style="font-family: 宋体;">的对象。在对</span>
				<span style="" lang="EN-US">A</span>
				<span style="font-family: 宋体;">的开发中我们可以把注意力完全放在业务的实现上。</span>
				<span style="" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN-US">
						<span style="">       </span>GoF</span>
				<span style="font-family: 宋体;">《设计模式》中说道：为其他对象提供一种代理以控制这个对象的访问。</span>
				<span style="" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN-US">
						<span style="">       </span>Proxy</span>
				<span style="font-family: 宋体;">模式的结构：<br />   <img alt="" src="http://www.cnblogs.com/images/cnblogs_com/kid-li/Proxy2.jpg" border="0" height="101" width="421" /><br /></span>
				<span style="" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center">
				<span style="" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN-US">
						<span style="">       </span>
				</span>
				<span style="font-family: 宋体;">下面通过一个场景来看看</span>
				<span style="" lang="EN-US">Proxy</span>
				<span style="font-family: 宋体;">的实现，我们要使用代理类型</span>
				<span style="font-family: 新宋体;" lang="EN-US">ProxyClass</span>
				<span style="font-family: 宋体;">的对象调用远程机器上的一个类型</span>
				<span style="font-family: 新宋体;" lang="EN-US">LongDistanceClass</span>
				<span style="font-family: 新宋体;">的对象。<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>
				</span>
				<span style="font-family: 新宋体;">首先我们先模拟一个远程的类型：为了保持对被代理对象使用的透明性，我们使代理类型和被代理类型同时继承同一个接口<span lang="EN-US">IProxy<o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>
				</span>
				<span style="font-family: 新宋体;">接口实现：<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>
						<span style="color: blue;">interface</span> IProxy<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">string</span> Function1();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">string</span> Function2();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>
				</span>
				<span style="font-family: 新宋体;">远程对象实现：<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>
						<span style="color: gray;">///</span>
						<span style="color: green;">
						</span>
						<span style="color: gray;">&lt;summary&gt;<o:p></o:p></span>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>
						<span style="color: gray;">///</span>
						<span style="color: green;">
						</span>
				</span>
				<span style="color: green; font-family: 新宋体;">模拟的远程对象<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>
						<span style="color: gray;">///</span>
						<span style="color: green;">
						</span>
						<span style="color: gray;">&lt;/summary&gt;<o:p></o:p></span>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">class</span> LongDistanceClass:IProxy<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="color: blue; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>#region</span>
				<span style="font-family: 新宋体;" lang="EN-US"> IProxy </span>
				<span style="font-family: 新宋体;">成员<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">string</span> Function1()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: green;">//do someting<o:p></o:p></span>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: blue;">return</span>
						<span style="color: purple;">"LongDistanceClass.Function1"</span>;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">string</span> Function2()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: green;">//do someting<o:p></o:p></span>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: blue;">return</span>
						<span style="color: purple;">"LongDistanceClass.Function2"</span>;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="color: blue; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>#endregion<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>
				</span>
				<span style="font-family: 新宋体;">接下来就要实现代理类型，使用代理对象访问模拟的远程对象，代理类型实现如下：<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">class</span> ProxyClass:IProxy<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="color: blue; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>#region</span>
				<span style="font-family: 新宋体;" lang="EN-US"> IProxy </span>
				<span style="font-family: 新宋体;">成员<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">string</span> Function1()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: green;">//to access LongDistanceClass.Function1<o:p></o:p></span>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>LongDistanceClass obj = <span style="color: blue;">new</span> LongDistanceClass();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: blue;">return</span> obj.Function1();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">string</span> Function2()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: green;">//to access LongDistanceClass.Function2<o:p></o:p></span>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>LongDistanceClass obj = <span style="color: blue;">new</span> LongDistanceClass();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: blue;">return</span> obj.Function2();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="color: blue; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>#endregion<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>
				</span>
				<span style="font-family: 新宋体;">最后实现客户端代码：<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>
						<span style="color: blue;">class</span> Class1<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>[STAThread]<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">static</span>
						<span style="color: blue;">void</span>
						<st1:place w:st="on">Main</st1:place>(<span style="color: blue;">string</span>[] args)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>IProxy pro = <span style="color: blue;">new</span> ProxyClass();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>Console.WriteLine(pro.Function1());<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>Console.WriteLine(pro.Function2());<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>Console.Read();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>
				</span>
				<span style="font-family: 新宋体;">运行结果如下：<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>LongDistanceClass.Function1<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="font-family: 新宋体;" lang="EN-US">LongDistanceClass.Function2<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN-US">
						<span style="">       </span>Proxy</span>
				<span style="font-family: 宋体;">模式的要点：</span>
				<span style="" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN-US">
						<span style="">       </span>1</span>
				<span style="font-family: 宋体;">、“增加一层间接层”是软件系统中对许多负责问题的一种常见解决方法。在面向对象系统中，直接使用某些对象会带来很多问题，作为间接层的</span>
				<span style="" lang="EN-US">proxy</span>
				<span style="font-family: 宋体;">对象便是解决这一问题的常用手段。</span>
				<span style="" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN-US">
						<span style="">       </span>
				</span>
				<span style="font-family: 宋体;">在我们日常的工作中也常常用到代理模式，比如对于三层结构或者</span>
				<span style="" lang="EN-US">N-</span>
				<span lang="EN-US">
				</span>
				<span style="" lang="EN-US">tiers</span>
				<span style="font-family: 宋体;">结构中</span>
				<span style="" lang="EN-US">DAL</span>
				<span style="font-family: 宋体;">数据访问层，它把对数据库的访问进行封装。</span>
				<span style="" lang="EN-US">BLL</span>
				<span style="font-family: 宋体;">业务层的开发者只是调用</span>
				<span style="" lang="EN-US">DAL</span>
				<span style="font-family: 宋体;">中的方法来获得数据。</span>
				<span style="" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN-US">
						<span style="">       </span>
				</span>
				<span style="font-family: 宋体;">在比如前一段时间看了看</span>
				<span style="" lang="EN-US">AOP</span>
				<span style="font-family: 宋体;">和</span>
				<span style="" lang="EN-US">Remoting</span>
				<span style="font-family: 宋体;">方面的资料，对于跨越应用程序域的访问，要为客户应用程序提供一个</span>
				<span style="" lang="EN-US">TransparentProxy</span>
				<span style="font-family: 宋体;">（透明代理），客户程序实际上是通过访问这个代理来访问实际的类型对象。</span>
				<span style="" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="" lang="EN-US">2</span>
				<span style="font-family: 宋体;">、具体</span>
				<span style="" lang="EN-US">proxy</span>
				<span style="font-family: 宋体;">设计模式的实现方法、实现粒度都相差很大，有些可能对单个对象作细粒度的控制，有些可能对组件模块提供抽象代理层，在架构层次对对象作</span>
				<span style="" lang="EN-US">proxy</span>
				<span style="font-family: 宋体;">。</span>
				<span style="" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="" lang="EN-US">3</span>
				<span style="font-family: 宋体;">、</span>
				<span style="" lang="EN-US">proxy</span>
				<span style="font-family: 宋体;">并不一定要求保持接口的一致性，只要能够实现间接控制，有时候损及一些透明性是可以接受的。例如上面的那个例子，代理类型</span>
				<span style="" lang="EN-US">ProxyClass</span>
				<span style="font-family: 宋体;">和被代理类型</span>
				<span style="font-family: 新宋体;" lang="EN-US">LongDistanceClass</span>
				<span style="font-family: 宋体;">可以不用继承自同一个接口，正像</span>
				<span style="" lang="EN-US">GoF</span>
				<span style="font-family: 宋体;">《设计模式》中说的：为其他对象提供一种代理以控制这个对象的访问。代理类型从某种角度上讲也可以起到控制被代理类型的访问的作用。</span>
		</p>
<img src ="http://www.blogjava.net/franky/aggbug/104812.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/franky/" target="_blank">Franky</a> 2007-03-19 21:01 <a href="http://www.blogjava.net/franky/articles/104812.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：设计模式学习笔记（十二）——Flyweight享元模式</title><link>http://www.blogjava.net/franky/articles/104811.html</link><dc:creator>Franky</dc:creator><author>Franky</author><pubDate>Mon, 19 Mar 2007 12:59:00 GMT</pubDate><guid>http://www.blogjava.net/franky/articles/104811.html</guid><wfw:comment>http://www.blogjava.net/franky/comments/104811.html</wfw:comment><comments>http://www.blogjava.net/franky/articles/104811.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/franky/comments/commentRss/104811.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/franky/services/trackbacks/104811.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Flyweight		享元设计模式是一种结构型设计模式，它主要解决的问题是：由于（同类）对象的数量太大，采用面向对象时给系统带来了难以承受的内存开销。比如有这样一个场景：一个停车场中有		1000		辆汽车，我们所定义的汽车对象占用内存						0.3M				，那么要实例化		1000		辆就是						300M				。由此可见，在这种情...&nbsp;&nbsp;<a href='http://www.blogjava.net/franky/articles/104811.html'>阅读全文</a><img src ="http://www.blogjava.net/franky/aggbug/104811.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/franky/" target="_blank">Franky</a> 2007-03-19 20:59 <a href="http://www.blogjava.net/franky/articles/104811.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：设计模式学习笔记（十一）——Facade外观模式</title><link>http://www.blogjava.net/franky/articles/104810.html</link><dc:creator>Franky</dc:creator><author>Franky</author><pubDate>Mon, 19 Mar 2007 12:57:00 GMT</pubDate><guid>http://www.blogjava.net/franky/articles/104810.html</guid><wfw:comment>http://www.blogjava.net/franky/comments/104810.html</wfw:comment><comments>http://www.blogjava.net/franky/articles/104810.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/franky/comments/commentRss/104810.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/franky/services/trackbacks/104810.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span lang="EN-US">Facade</span>
				<span style="font-family: 宋体;">外
观模式，是一种结构型模式，它主要解决的问题是：组件的客户和组件中各种复杂的子系统有了过多的耦合，随着外部客户程序和各子系统的演化，这种过多的耦合
面临很多变化的挑战。在这里我想举一个例子：比如，现在有一辆汽车，我们（客户程序）要启动它，那我们就要发动引擎（子系统</span>
				<span lang="EN-US">1</span>
				<span style="font-family: 宋体;">），使四个车轮（子系统</span>
				<span lang="EN-US">2</span>
				<span style="font-family: 宋体;">）转动。但是实际中我们并不需要用手推动车轮使其转动，我们踩下油门，此时汽车再根据一些其他的操作使车轮转动。油门就好比系统给我们留下的接口，不论汽车是以何种方式转动车轮，车轮变化成什么牌子的，我们要开走汽车所要做的还是踩下油门。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span lang="EN-US">GoF</span>
				<span style="font-family: 宋体;">《设计模式》中说道：为子系统中的一组接口提供一个一致的界面，</span>
				<span lang="EN-US">Facade</span>
				<span style="font-family: 宋体;">模式定义了一个高层接口，这个接口使得这一子系统更加容易使用。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span lang="EN-US">Façade</span>
				<span style="font-family: 宋体;">外观模式的结构大概是这样的：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center">
				<span lang="EN-US">
						<v:shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600">
								<v:stroke joinstyle="miter">
								</v:stroke>
								<v:formulas>
										<v:f eqn="if lineDrawn pixelLineWidth 0">
										</v:f>
										<v:f eqn="sum @0 1 0">
										</v:f>
										<v:f eqn="sum 0 0 @1">
										</v:f>
										<v:f eqn="prod @2 1 2">
										</v:f>
										<v:f eqn="prod @3 21600 pixelWidth">
										</v:f>
										<v:f eqn="prod @3 21600 pixelHeight">
										</v:f>
										<v:f eqn="sum @0 0 1">
										</v:f>
										<v:f eqn="prod @6 1 2">
										</v:f>
										<v:f eqn="prod @7 21600 pixelWidth">
										</v:f>
										<v:f eqn="sum @8 21600 0">
										</v:f>
										<v:f eqn="prod @7 21600 pixelHeight">
										</v:f>
										<v:f eqn="sum @10 21600 0">
										</v:f>
								</v:formulas>
								<v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f">
								</v:path>
								<o:lock aspectratio="t" v:ext="edit">
								</o:lock>
						</v:shapetype>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">
								<img alt="" src="http://www.cnblogs.com/images/cnblogs_com/kid-li/Facade01.jpg" border="0" height="279" width="553" />       </span>
				</span>
				<span style="font-family: 宋体;">这个图是我对</span>
				<span lang="EN-US">Facade</span>
				<span style="font-family: 宋体;">模式的理解，如果大家觉得有什么不对的地方欢迎给我指出。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
				</span>
				<span style="font-family: 宋体;">我就上面说的那个情形写一下实现代码，首先我们要实现三个子系统（</span>
				<span lang="EN-US">Wheel</span>
				<span style="font-family: 宋体;">、</span>
				<span lang="EN-US">Engine</span>
				<span style="font-family: 宋体;">、</span>
				<span lang="EN-US">Body</span>
				<span style="font-family: 宋体;">）：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span lang="EN-US">
						<span style="">       </span>
				</span>
				<span style="font-size: 10pt; color: blue; font-family: 新宋体;" lang="EN-US">internal</span>
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="color: blue;">class</span>
						<span style="color: teal;">Engine<o:p></o:p></span>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">string</span> EngineWork()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: blue;">return</span>
						<span style="color: maroon;">"BMW's Engine is Working"</span>;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">string</span> EngineStop()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: blue;">return</span>
						<span style="color: maroon;">"BMW's Engine is stoped"</span>;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>
						<span style="color: blue;">internal</span>
						<span style="color: blue;">class</span>
						<span style="color: teal;">Wheel<o:p></o:p></span>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">string</span> WheelCircumrotate()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">       </span>
						<span style=""> </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: blue;">return</span>
						<span style="color: maroon;">"BMW's Wheel is Circumrotating"</span>;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">string</span> WheelStop()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: blue;">return</span>
						<span style="color: maroon;">"BMW's Wheel is stoped"</span>;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>
						<span style="color: blue;">internal</span>
						<span style="color: blue;">class</span>
						<span style="color: teal;">Body<o:p></o:p></span>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: teal;">Wheel</span>[] wheels = <span style="color: blue;">new</span><span style="color: teal;">Wheel</span>[4];<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: teal;">Engine</span> engine = <span style="color: blue;">new</span><span style="color: teal;">Engine</span>();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span> Body()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = 0; i &lt; wheels.Length; i++)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">                </span>wheels[i] = <span style="color: blue;">new</span><span style="color: teal;">Wheel</span>();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 20.25pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 20.25pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 20.25pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;">然后，我们再来实现汽车的<span lang="EN-US">Facade<o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 20.25pt; text-align: left;" align="left">
				<span style="font-size: 10pt; color: blue; font-family: 新宋体;" lang="EN-US">class</span>
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="color: teal;">CarFacade<o:p></o:p></span>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: teal;">Body</span> body = <span style="color: blue;">new</span><span style="color: teal;">Body</span>();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">void</span> Run()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: teal;">Console</span>.WriteLine(body.engine.EngineWork());<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: blue;">for</span>(<span style="color: blue;">int</span> i = 0; i &lt; body.wheels.Length; i++)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">                </span>
						<span style="color: teal;">Console</span>.WriteLine(body.wheels[i].WheelCircumrotate());<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style=""> </span>
						<span style="">           </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">void</span> Stop()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: teal;">Console</span>.WriteLine(body.engine.EngineStop());<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = 0; i &lt; body.wheels.Length; i++)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">                </span>
						<span style="color: teal;">Console</span>.WriteLine(body.wheels[i].WheelStop());<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 20.25pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 20.25pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 20.25pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;">现在我们来使用客户端程序验证一下，代码如下：<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 20.25pt; text-align: left;" align="left">
				<span style="font-size: 10pt; color: blue; font-family: 新宋体;" lang="EN-US">class</span>
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="color: teal;">Program<o:p></o:p></span>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">static</span>
						<span style="color: blue;">void</span>
						<st1:place w:st="on">Main</st1:place>(<span style="color: blue;">string</span>[] args)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: teal;">CarFacade</span> car = <span style="color: blue;">new</span><span style="color: teal;">CarFacade</span>();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>car.Run();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>car.Stop();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: teal;">Console</span>.Read();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 20.25pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
				</span>
				<span style="font-family: 宋体;">执行结果如下；</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>BMW's Engine is Working</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span lang="EN-US">BMW's Wheel is Circumrotating</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span lang="EN-US">BMW's Wheel is Circumrotating</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span lang="EN-US">BMW's Wheel is Circumrotating</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span lang="EN-US">BMW's Wheel is Circumrotating</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span lang="EN-US">BMW's Engine is stoped</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span lang="EN-US">BMW's Wheel is stoped</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span lang="EN-US">BMW's Wheel is stoped</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span lang="EN-US">BMW's Wheel is stoped</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span lang="EN-US">BMW's Wheel is stoped</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="font-family: 宋体;">正如上面所说：客户端代码（</span>
				<span lang="EN-US">Program</span>
				<span style="font-family: 宋体;">）不需要关心子系统，它只需要关心</span>
				<span lang="EN-US">CarFacade</span>
				<span style="font-family: 宋体;">所留下来的和外部交互的接口，而子系统是在</span>
				<span lang="EN-US">CarFacade</span>
				<span style="font-family: 宋体;">中聚合。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span lang="EN-US">Façade</span>
				<span style="font-family: 宋体;">模式的几个要点：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>1</span>
				<span style="font-family: 宋体;">、从客户程序的角度看，</span>
				<span lang="EN-US">Facade</span>
				<span style="font-family: 宋体;">模式不仅简化了整个组件系统的接口，同时对于组件内部与外部客户程序来说，从某种程度上也达到了一种“解耦”的效果——内部子系统的任何变化不会影响到</span>
				<span lang="EN-US">Facade</span>
				<span style="font-family: 宋体;">接口的变化。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span lang="EN-US">2</span>
				<span style="font-family: 宋体;">、</span>
				<span lang="EN-US">Facade</span>
				<span style="font-family: 宋体;">设计模式更注重从架构的层次去看整个系统，而不是单个类的层次。</span>
				<span lang="EN-US">Facade</span>
				<span style="font-family: 宋体;">很多时候更是一种架构设计模式。</span>
		</p>
<img src ="http://www.blogjava.net/franky/aggbug/104810.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/franky/" target="_blank">Franky</a> 2007-03-19 20:57 <a href="http://www.blogjava.net/franky/articles/104810.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：设计模式学习笔记（十）——Decorator装饰模式</title><link>http://www.blogjava.net/franky/articles/104809.html</link><dc:creator>Franky</dc:creator><author>Franky</author><pubDate>Mon, 19 Mar 2007 12:56:00 GMT</pubDate><guid>http://www.blogjava.net/franky/articles/104809.html</guid><wfw:comment>http://www.blogjava.net/franky/comments/104809.html</wfw:comment><comments>http://www.blogjava.net/franky/articles/104809.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/franky/comments/commentRss/104809.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/franky/services/trackbacks/104809.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span lang="EN-US">Decorator</span>
				<span style="font-family: 宋体;">装
饰模式是一种结构型模式，它主要是解决：“过度地使用了继承来扩展对象的功能”，由于继承为类型引入的静态特质，使得这种扩展方式缺乏灵活性；并且随着子
类的增多（扩展功能的增多），各种子类的组合（扩展功能的组合）会导致更多子类的膨胀（多继承）。继承为类型引入的静态特质的意思是说以继承的方式使某一
类型要获得功能是在编译时。所谓静态，是指在编译时；动态，是指在运行时。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span lang="EN-US">GoF</span>
				<span style="font-family: 宋体;">《设计模式》中说道：动态的给一个对象添加一些额外的职责。就增加功能而言，</span>
				<span lang="EN-US">Decorator</span>
				<span style="font-family: 宋体;">模式比生成子类更为灵活。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;" align="left">
				<span style="font-family: 宋体;">下面来看看</span>
				<span lang="EN-US">Decorator</span>
				<span style="font-family: 宋体;">模式的结构：<br /><br /><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/kid-li/Decorator1.jpg" border="0" height="322" width="383" /><br /><br /></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: center;" align="center">
				<span lang="EN-US">
						<v:shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600">
								<v:stroke joinstyle="miter">
								</v:stroke>
								<v:formulas>
										<v:f eqn="if lineDrawn pixelLineWidth 0">
										</v:f>
										<v:f eqn="sum @0 1 0">
										</v:f>
										<v:f eqn="sum 0 0 @1">
										</v:f>
										<v:f eqn="prod @2 1 2">
										</v:f>
										<v:f eqn="prod @3 21600 pixelWidth">
										</v:f>
										<v:f eqn="prod @3 21600 pixelHeight">
										</v:f>
										<v:f eqn="sum @0 0 1">
										</v:f>
										<v:f eqn="prod @6 1 2">
										</v:f>
										<v:f eqn="prod @7 21600 pixelWidth">
										</v:f>
										<v:f eqn="sum @8 21600 0">
										</v:f>
										<v:f eqn="prod @7 21600 pixelHeight">
										</v:f>
										<v:f eqn="sum @10 21600 0">
										</v:f>
								</v:formulas>
								<v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f">
								</v:path>
								<o:lock aspectratio="t" v:ext="edit">
								</o:lock>
						</v:shapetype>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="font-family: 宋体;">看这个结构好像不是很明白，下面我根据代码讲解一下这个结构。我想了一个场景：我们现在用的手机功能很多，我就用</span>
				<span lang="EN-US">Decorator</span>
				<span style="font-family: 宋体;">模式实现一下对某个手机的</span>
				<span lang="EN-US">GSP</span>
				<span style="font-family: 宋体;">和蓝牙功能扩展。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="font-family: 宋体;">首先，我们需要一个手机的接口或者是抽象类，我这里就用抽象类来实现，代码如下：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left;" align="left">
				<span style="font-size: 10pt; color: blue; font-family: 新宋体;" lang="EN-US">public</span>
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="color: blue;">abstract</span>
						<span style="color: blue;">class</span>
						<span style="color: teal;">AbstractCellPhone<o:p></o:p></span>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">abstract</span>
						<span style="color: blue;">string</span> CallNumber();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">abstract</span>
						<span style="color: blue;">string</span> SendMessage();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="font-size: 10pt; color: black; font-family: 新宋体;" lang="EN-US">AbstractCellPhone</span>
				<span style="font-size: 10pt; color: black; font-family: 新宋体;">也就是结构图中的<span lang="EN-US">Component</span>，然后，我再来实现<span lang="EN-US">Nokia</span>和<span lang="EN-US">Moto</span>的手机类，这类要继承<span lang="EN-US">AbstractCellPhone</span>，也就是图中<span lang="EN-US">ConcreteComponent</span>类要继承<span lang="EN-US">Component</span>，实现代码如下：<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left;" align="left">
				<span style="font-size: 10pt; color: blue; font-family: 新宋体;" lang="EN-US">public</span>
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="color: blue;">class</span>
						<span style="color: teal;">NokiaPhone</span> : <span style="color: teal;">AbstractCellPhone<o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">override</span>
						<span style="color: blue;">string</span> CallNumber()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style=""> </span>
						<span style="">           </span>
						<span style="color: blue;">return</span>
						<span style="color: maroon;">"NokiaPhone call sombody"</span>;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">override</span>
						<span style="color: blue;">string</span> SendMessage()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: blue;">return</span>
						<span style="color: maroon;">"NokiaPhone send a message to somebody"</span>;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">class</span>
						<span style="color: teal;">MotoPhone</span> : <span style="color: teal;">AbstractCellPhone<o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">override</span>
						<span style="color: blue;">string</span> CallNumber()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: blue;">return</span>
						<span style="color: maroon;">"MotoPhone call sombody"</span>;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">override</span>
						<span style="color: blue;">string</span> SendMessage()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: blue;">return</span>
						<span style="color: maroon;">"MotoPhone send a message to somebody"</span>;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style=""> </span>}<span style="">    </span><o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="font-size: 10pt; font-family: 新宋体;">接下来我需要一个<span lang="EN-US">Decorator</span>接口或者抽象类，实现代码如下：<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left;" align="left">
				<span style="font-size: 10pt; color: blue; font-family: 新宋体;" lang="EN-US">public</span>
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="color: blue;">abstract</span>
						<span style="color: blue;">class</span>
						<span style="color: teal;">Decorator</span>:<span style="color: teal;">AbstractCellPhone<o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: teal;">AbstractCellPhone</span> _phone;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span> Decorator(<span style="color: teal;">AbstractCellPhone</span> phone)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>_phone = phone;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">override</span>
						<span style="color: blue;">string</span> CallNumber()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: blue;">return</span> _phone.CallNumber();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">override</span>
						<span style="color: blue;">string</span> SendMessage()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: blue;">return</span> _phone.SendMessage();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">  </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="font-size: 10pt; font-family: 新宋体;">正如结构图中，这个<span lang="EN-US">Decorator</span>即继承了<span lang="EN-US">AbstractCellPhone</span>，又包含了一个私有的<span lang="EN-US">AbstractCellPhone</span>的对象。这样做的意义是：</span>
				<span style="color: black;" lang="EN-US">Decorator</span>
				<span style="color: black; font-family: 宋体;">类又使用了另外一个</span>
				<span style="color: black;" lang="EN-US">Component</span>
				<span style="color: black; font-family: 宋体;">类。我们可以使用一个或多个</span>
				<span style="color: black;" lang="EN-US">Decorator</span>
				<span style="color: black; font-family: 宋体;">对象来“装饰”一个</span>
				<span style="color: black;" lang="EN-US">Component</span>
				<span style="color: black; font-family: 宋体;">对象，且装饰后的对象仍然是一个</span>
				<span style="color: black;" lang="EN-US">Component</span>
				<span style="color: black; font-family: 宋体;">对象。</span>
				<span style="font-size: 10pt; font-family: 新宋体;">在下来，我要实现<span lang="EN-US">GSP</span>和蓝牙的功能扩展，它们要继承自<span lang="EN-US">Decorator</span>，代码如下：<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left;" align="left">
				<span style="font-size: 10pt; color: blue; font-family: 新宋体;" lang="EN-US">public</span>
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="color: blue;">class</span>
						<span style="color: teal;">DecoratorGPS</span> : <span style="color: teal;">Decorator<o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span> DecoratorGPS(<span style="color: teal;">AbstractCellPhone</span> phone)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>: <span style="color: blue;">base</span>(phone)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{ }<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">override</span>
						<span style="color: blue;">string</span> CallNumber()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: blue;">return</span>
						<span style="color: blue;">base</span>.CallNumber() + <span style="color: maroon;">" with GPS"</span>;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">override</span>
						<span style="color: blue;">string</span> SendMessage()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: blue;">return</span>
						<span style="color: blue;">base</span>.SendMessage() + <span style="color: maroon;">" with GPS"</span>;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style=""> </span>
						<span style="">   </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">class</span>
						<span style="color: teal;">DecoratorBlueTooth</span> : <span style="color: teal;">Decorator<o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span> DecoratorBlueTooth(<span style="color: teal;">AbstractCellPhone</span> phone)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>: <span style="color: blue;">base</span>(phone)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{ }<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">override</span>
						<span style="color: blue;">string</span> CallNumber()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: blue;">return</span>
						<span style="color: blue;">base</span>.CallNumber() + <span style="color: maroon;">" with BlueTooth"</span>;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">override</span>
						<span style="color: blue;">string</span> SendMessage()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: blue;">return</span>
						<span style="color: blue;">base</span>.SendMessage() + <span style="color: maroon;">" with BlueTooth"</span>;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style=""> </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="color: black; font-family: 宋体;">最后，用客户端程序验证一下：</span>
				<span style="color: black;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: 21pt; text-align: left;" align="left">
				<span style="font-size: 10pt; color: blue; font-family: 新宋体;" lang="EN-US">static</span>
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="color: blue;">void</span>
						<st1:place w:st="on">Main</st1:place>(<span style="color: blue;">string</span>[] args)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">             </span>
						<span style="color: teal;">AbstractCellPhone</span> phone = <span style="color: blue;">new</span><span style="color: teal;">NokiaPhone</span>();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: teal;">Console</span>.WriteLine(phone.CallNumber());<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: teal;">Console</span>.WriteLine(phone.SendMessage());<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: teal;">DecoratorGPS</span> gps = <span style="color: blue;">new</span><span style="color: teal;">DecoratorGPS</span>(phone);<span style="">     </span><span style="color: green;">//add GSP<o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: teal;">Console</span>.WriteLine(gps.CallNumber());<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: teal;">Console</span>.WriteLine(gps.SendMessage());<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: teal;">DecoratorBlueTooth</span> bluetooth = <span style="color: blue;">new</span><span style="color: teal;">DecoratorBlueTooth</span>(gps); <span style="color: green;">//add GSP and bluetooth<o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: teal;">Console</span>.WriteLine(bluetooth.CallNumber());<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: teal;">Console</span>.WriteLine(bluetooth.SendMessage());<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: teal;">Console</span>.Read();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="font-size: 10pt; font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>
						<span style=""> </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="font-size: 10pt; font-family: 新宋体;">执行结果：<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="color: black;" lang="EN-US">NokiaPhone call sombody<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="color: black;" lang="EN-US">NokiaPhone send a message to somebody<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="color: black;" lang="EN-US">NokiaPhone call sombody with GPS<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="color: black;" lang="EN-US">NokiaPhone send a message to somebody with GPS<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="color: black;" lang="EN-US">NokiaPhone call sombody with GPS with BlueTooth<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="color: black;" lang="EN-US">NokiaPhone send a message to somebody with GPS with BlueTooth<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="color: black;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="color: black; font-family: 宋体;">从执行的结果不难看出扩展功能已被添加。最后再说说</span>
				<span style="color: black;" lang="EN-US">Decorator</span>
				<span style="color: black; font-family: 宋体;">装饰模式的几点要点：</span>
				<span style="color: black;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="color: black;" lang="EN-US">1</span>
				<span style="color: black; font-family: 宋体;">、通过采用组合、而非继承的手法，</span>
				<span style="color: black;" lang="EN-US">Decorator</span>
				<span style="color: black; font-family: 宋体;">模式实现了在运行时动态的扩展对象功能的能力，而且可以根据需要扩展多个功能。避免了单独使用继承带来的“灵活性差”和“多子类衍生问题”。</span>
				<span style="color: black;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="color: black;" lang="EN-US">2</span>
				<span style="color: black; font-family: 宋体;">、</span>
				<span style="color: black;" lang="EN-US">Component</span>
				<span style="color: black; font-family: 宋体;">类在</span>
				<span style="color: black;" lang="EN-US">Decorator</span>
				<span style="color: black; font-family: 宋体;">模式中充当抽象接口的角色，不应该去实现具体的行为。而且</span>
				<span style="color: black;" lang="EN-US">Decorator</span>
				<span style="color: black; font-family: 宋体;">类对于</span>
				<span style="color: black;" lang="EN-US">Component</span>
				<span style="color: black; font-family: 宋体;">类应该透明——换言之</span>
				<span style="color: black;" lang="EN-US">Component</span>
				<span style="color: black; font-family: 宋体;">类无需知道</span>
				<span style="color: black;" lang="EN-US">Decorator</span>
				<span style="color: black; font-family: 宋体;">类，</span>
				<span style="color: black;" lang="EN-US">Decorator</span>
				<span style="color: black; font-family: 宋体;">类是从外部来扩展</span>
				<span style="color: black;" lang="EN-US">Component</span>
				<span style="color: black; font-family: 宋体;">类的功能。</span>
				<span style="color: black;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="color: black;" lang="EN-US">3</span>
				<span style="color: black; font-family: 宋体;">、</span>
				<span style="color: black;" lang="EN-US">Decorator</span>
				<span style="color: black; font-family: 宋体;">类在接口上表现为</span>
				<span style="color: black;" lang="EN-US">is-a Component</span>
				<span style="color: black; font-family: 宋体;">的继承关系，即</span>
				<span style="color: black;" lang="EN-US">Decorator</span>
				<span style="color: black; font-family: 宋体;">类继承了</span>
				<span style="color: black;" lang="EN-US">Component</span>
				<span style="color: black; font-family: 宋体;">类所具有的接口。但在实现上又表现为</span>
				<span style="color: black;" lang="EN-US">has-a Component</span>
				<span style="color: black; font-family: 宋体;">的组合关系，即</span>
				<span style="color: black;" lang="EN-US">Decorator</span>
				<span style="color: black; font-family: 宋体;">类又使用了另外一个</span>
				<span style="color: black;" lang="EN-US">Component</span>
				<span style="color: black; font-family: 宋体;">类。我们可以使用一个或多个</span>
				<span style="color: black;" lang="EN-US">Decorator</span>
				<span style="color: black; font-family: 宋体;">对象来“装饰”一个</span>
				<span style="color: black;" lang="EN-US">Component</span>
				<span style="color: black; font-family: 宋体;">对象，且装饰后的对象仍然是一个</span>
				<span style="color: black;" lang="EN-US">Component</span>
				<span style="color: black; font-family: 宋体;">对象。（在这里我想谈一下我的理解：当我们实例化一个</span>
				<span style="color: black;" lang="EN-US">Component</span>
				<span style="color: black; font-family: 宋体;">对象后，要给这个对象扩展功能，这时我们把这个</span>
				<span style="color: black;" lang="EN-US">Component</span>
				<span style="color: black; font-family: 宋体;">对象当作参数传给</span>
				<span style="color: black;" lang="EN-US">Decorator</span>
				<span style="color: black; font-family: 宋体;">的子类的构造函数——也就是扩展方法的功能类。对于引用类型传参时，实际上只是传递对象的地址，这样，在功能扩展是，操作的应该是同一个对象）</span>
				<span style="color: black;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<span style="color: black;" lang="EN-US">4</span>
		<span style="color: black; font-family: 宋体;">、</span>
		<span style="color: black;" lang="EN-US">Decorator</span>
		<span style="color: black; font-family: 宋体;">模式并非解决“多子类衍生的多继承”问题，</span>
		<span style="color: black;" lang="EN-US">Decorator</span>
		<span style="color: black; font-family: 宋体;">模式应用的要点在于解决“主体类在多个方向上的扩展功能”——是为“装饰”的含义。</span>
		<span style="color: black;" lang="EN-US">Decorator</span>
		<span style="color: black; font-family: 宋体;">是在运行时对功能进行组合。</span>
<img src ="http://www.blogjava.net/franky/aggbug/104809.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/franky/" target="_blank">Franky</a> 2007-03-19 20:56 <a href="http://www.blogjava.net/franky/articles/104809.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：设计模式学习笔记（九）——Composite组合模式</title><link>http://www.blogjava.net/franky/articles/104807.html</link><dc:creator>Franky</dc:creator><author>Franky</author><pubDate>Mon, 19 Mar 2007 12:55:00 GMT</pubDate><guid>http://www.blogjava.net/franky/articles/104807.html</guid><wfw:comment>http://www.blogjava.net/franky/comments/104807.html</wfw:comment><comments>http://www.blogjava.net/franky/articles/104807.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/franky/comments/commentRss/104807.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/franky/services/trackbacks/104807.html</trackback:ping><description><![CDATA[
		<span lang="EN-US">
				<span style="">
				</span>Composite</span>
		<span style="font-family: 宋体;">组
合模式主要是应对这样的问题：一类具有“容器特征”的对象——即他们在充当对象的同时，又是其他对象的容器的情况。在编写时我们常常会造成：客户代码过多
地依赖于对象容器复杂的内部实现，对象容器内部实现结构（而非抽象接口）的变化将引起客户代码的频繁变化，带来了代码的维护性、扩展性的弊端。</span>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>GoF</span>
				<span style="font-family: 宋体;">《设计模式》中说到：将对象组合成树形结构以表示“部分</span>
				<span lang="EN-US">-</span>
				<span style="font-family: 宋体;">整体”的层次结构。</span>
				<span lang="EN-US">Composite</span>
				<span style="font-family: 宋体;">模式使得客户对单个对象和组合对象的使用具有一致性。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>Composite</span>
				<span style="font-family: 宋体;">组合模式结构如下：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center">
				<span lang="EN-US">
						<v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f">
								<v:stroke joinstyle="miter">
								</v:stroke>
								<v:formulas>
										<v:f eqn="if lineDrawn pixelLineWidth 0">
										</v:f>
										<v:f eqn="sum @0 1 0">
										</v:f>
										<v:f eqn="sum 0 0 @1">
										</v:f>
										<v:f eqn="prod @2 1 2">
										</v:f>
										<v:f eqn="prod @3 21600 pixelWidth">
										</v:f>
										<v:f eqn="prod @3 21600 pixelHeight">
										</v:f>
										<v:f eqn="sum @0 0 1">
										</v:f>
										<v:f eqn="prod @6 1 2">
										</v:f>
										<v:f eqn="prod @7 21600 pixelWidth">
										</v:f>
										<v:f eqn="sum @8 21600 0">
										</v:f>
										<v:f eqn="prod @7 21600 pixelHeight">
										</v:f>
										<v:f eqn="sum @10 21600 0">
										</v:f>
								</v:formulas>
								<v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect">
								</v:path>
								<o:lock v:ext="edit" aspectratio="t">
								</o:lock>
						</v:shapetype>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;" align="left">
				<span lang="EN-US">
						<span style="">
								<img alt="" src="http://www.cnblogs.com/images/cnblogs_com/kid-li/Composite.jpg" border="0" height="262" width="361" />
								<br />
								<br />       </span>
				</span>
				<span style="font-family: 宋体;">说道这，我觉得有一个编程中常见的场景，就是对于树的实现，很符合这个模式。下面我就用这个例子作一下。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
				</span>
				<span style="font-family: 宋体;">首先，我们先分析对于一棵树所包含的部分，树干、树枝、树叶，其中树干可以看成一个树枝（就是粗了点）。那么我们就应该有两种类实现</span>
				<span lang="EN-US">Leaf</span>
				<span style="font-family: 宋体;">（树叶）和</span>
				<span lang="EN-US">Limb</span>
				<span style="font-family: 宋体;">（树枝）。对于叶子节点和枝节点的不同在于枝节点有子树，而叶子节点没有子树。为了使单个对象和组合对象的使用具有一致性，我可以将叶子节点想象成没有子树的枝节点。这样我就可以得到一个抽象类，代码如下：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span lang="EN-US">
						<span style="">       </span>
				</span>
				<span style="color: blue; font-family: 新宋体;" lang="EN-US">public</span>
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="color: blue;">abstract</span>
						<span style="color: blue;">class</span> AbstractClass<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">string</span> name;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span> ArrayList list;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">abstract</span>
						<span style="color: blue;">void</span> Add(AbstractClass item);<span style="">       </span><span style="color: green;">//</span></span>
				<span style="color: green; font-family: 新宋体;">增加一个子节点<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">abstract</span>
						<span style="color: blue;">void</span> Remove(AbstractClass item);<span style="">    </span><span style="color: green;">//</span></span>
				<span style="color: green; font-family: 新宋体;">去掉一个子节点<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">abstract</span>
						<span style="color: blue;">string</span> Print();<span style="">                     </span><span style="color: green;">//</span></span>
				<span style="color: green; font-family: 新宋体;">打印当前节点<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>}</span>
				<span style="" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
				</span>
				<span style="font-family: 宋体;">然后，我在对叶子节点和枝节点作不同的实现：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
				</span>
				<span style="font-family: 宋体;">枝节点：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span lang="EN-US">
						<span style="">       </span>
				</span>
				<span style="color: blue; font-family: 新宋体;" lang="EN-US">public</span>
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="color: blue;">class</span> Limb:AbstractClass<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span> Limb()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>list = <span style="color: blue;">new</span> ArrayList();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">override</span>
						<span style="color: blue;">void</span> Add(AbstractClass item)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>list.Add(item);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">override</span>
						<span style="color: blue;">void</span> Remove(AbstractClass item)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: blue;">if</span>(list.Contains(item))<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">                </span>list.Remove(item);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">override</span>
						<span style="color: blue;">string</span> Print()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>Console.Write(name + <span style="color: purple;">"\n"</span>);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: blue;">if</span>(list.Count != 0)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">                </span>
						<span style="color: blue;">for</span>(<span style="color: blue;">int</span> i = 0;i&lt;list.Count;i++)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">                </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">                    </span>Console.Write(<span style="color: purple;">"(Parent is "</span> + name + <span style="color: purple;">")"</span>);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">                    </span>((AbstractClass)list[i]).Print();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">                </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: blue;">return</span> name;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>
				</span>
				<span style="font-family: 新宋体;">叶子节点：<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">class</span> Leaf:AbstractClass<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span> Leaf()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>list = <span style="color: blue;">null</span>;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">override</span>
						<span style="color: blue;">void</span> Add(AbstractClass item)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">override</span>
						<span style="color: blue;">void</span> Remove(AbstractClass item)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">override</span>
						<span style="color: blue;">string</span> Print()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>Console.Write(name + <span style="color: purple;">","</span>);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: blue;">return</span>
						<span style="color: blue;">this</span>.name;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>
				</span>
				<span style="font-family: 新宋体;">对于叶子节点来说，不需要子节点，当然也就不需要添加和删除子节点的方法。<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>
				</span>
				<span style="font-family: 新宋体;">好，接下来，我们可以在客户程序中组建一棵树，来测试一下：<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">static</span>
						<span style="color: blue;">void</span>
						<st1:place w:st="on">Main</st1:place>(<span style="color: blue;">string</span>[] args)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>AbstractClass Tree = <span style="color: blue;">new</span> Limb();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>GetTree(Tree);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>PrintTree(Tree);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>Console.Read();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>
						<span style="">    </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">static</span>
						<span style="color: blue;">void</span> GetTree(AbstractClass Tree)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>Tree.name = <span style="color: purple;">"1"</span>;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>AbstractClass leaf2 = <span style="color: blue;">new</span> Leaf();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>leaf2.name = <span style="color: purple;">"2"</span>;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>Tree.Add(leaf2);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>AbstractClass limb3 = <span style="color: blue;">new</span> Limb();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>limb3.name = <span style="color: purple;">"3"</span>;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>Tree.Add(limb3);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>AbstractClass leaf4 = <span style="color: blue;">new</span> Leaf();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>leaf4.name = <span style="color: purple;">"4"</span>;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>limb3.Add(leaf4);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>AbstractClass leaf5 = <span style="color: blue;">new</span> Leaf();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>leaf5.name = <span style="color: purple;">"5"</span>;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>limb3.Add(leaf5);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">static</span>
						<span style="color: blue;">void</span> PrintTree(AbstractClass Tree)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>Tree.Print();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>
				</span>
				<span style="font-family: 新宋体;">输出结果如下：<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="" lang="EN-US">1<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="" lang="EN-US">(Parent is 1)2,(Parent is 1)3<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="" lang="EN-US">(Parent is 3)4,(Parent is 3)5,<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="font-family: 宋体;">在组织这个树时，的确能感觉到</span>
				<span style="" lang="EN-US">GoF</span>
				<span style="font-family: 宋体;">《设计模式》中的那句话：</span>
				<span style="font-family: 宋体;">单个对象和组合对象的使用具有一致性。当然也的确感觉到一点矛盾：对于叶子节点来说，不需要</span>
				<span lang="EN-US">ArrayList</span>
				<span style="font-family: 宋体;">和</span>
				<span lang="EN-US">Add</span>
				<span style="font-family: 宋体;">（）</span>
				<span lang="EN-US">Remove</span>
				<span style="font-family: 宋体;">（）应该不继承才对，当然如果在代码执行性能可以达到要求的情况下，简化一下编码实现复杂度也是挺好的一件事。</span>
				<span style="" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="font-family: 宋体;">最后在来说说</span>
				<span lang="EN-US">Composite</span>
				<span style="font-family: 宋体;">组合模式的几个要点：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>1</span>
				<span style="font-family: 宋体;">、</span>
				<span lang="EN-US">Composite</span>
				<span style="font-family: 宋体;">模式采用树形结构来实现普遍存在的对象容器，从而将“一对多”的关系转化为“一对一”的关系，使得客户代码可以一致的处理对象和对象容器，无需关心处理的是单个对象，还是组合的对象容器。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span lang="EN-US">2</span>
				<span style="font-family: 宋体;">、将“客户代码与复杂的对象容器结构”解耦是</span>
				<span lang="EN-US">Composite</span>
				<span style="font-family: 宋体;">模式的核心思想，解耦之后，客户代码将与纯粹的对象接口——而非对象容器的复杂内部实现结构——发生依赖关系，从而更能“应对变化”。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span lang="EN-US">3</span>
				<span style="font-family: 宋体;">、</span>
				<span lang="EN-US">Composite</span>
				<span style="font-family: 宋体;">模式中，是将“</span>
				<span lang="EN-US">Add</span>
				<span style="font-family: 宋体;">和</span>
				<span lang="EN-US">Remove</span>
				<span style="font-family: 宋体;">的和对象容器相关的方法”定义在“表示抽象对象的</span>
				<span lang="EN-US">Component</span>
				<span style="font-family: 宋体;">类”中，还是将其定义在“表示对象容器的</span>
				<span lang="EN-US">Composite</span>
				<span style="font-family: 宋体;">类”中，是一个关乎“透明性”和“安全性”的两难问题，需要仔细权衡结构，这又是必须付出的代价。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span lang="EN-US">4</span>
				<span style="font-family: 宋体;">、</span>
				<span lang="EN-US">Composite</span>
				<span style="font-family: 宋体;">模式在具体实现中，可以让父对象中的字对象反向追溯：如果父对象有频繁的遍历需求，可使用缓存技巧来改善效率</span>
		</p>
<img src ="http://www.blogjava.net/franky/aggbug/104807.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/franky/" target="_blank">Franky</a> 2007-03-19 20:55 <a href="http://www.blogjava.net/franky/articles/104807.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：设计模式学习笔记（八）——Bridge桥接模式</title><link>http://www.blogjava.net/franky/articles/104806.html</link><dc:creator>Franky</dc:creator><author>Franky</author><pubDate>Mon, 19 Mar 2007 12:53:00 GMT</pubDate><guid>http://www.blogjava.net/franky/articles/104806.html</guid><wfw:comment>http://www.blogjava.net/franky/comments/104806.html</wfw:comment><comments>http://www.blogjava.net/franky/articles/104806.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/franky/comments/commentRss/104806.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/franky/services/trackbacks/104806.html</trackback:ping><description><![CDATA[
		<span lang="EN-US">
				<span style="">  </span>Bridge</span>
		<span style="font-family: 宋体;">桥接模式是一种结构型模式，它主要应对的是：由于类型的固有罗辑，使得类型具有两个或两个以上的纬度变化。也就是要求抽象不应依赖于实现细节，实现细节应依赖于抽象。</span>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
				</span>
				<span style="font-family: 宋体;">《设计模式》中说到将抽象部分与实现部分分离，使他们可以独立的变化。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
				</span>
				<span style="font-family: 宋体;">举个例子更清楚些，好像我们平时玩的游戏中有</span>
				<span lang="EN-US">PS</span>
				<span style="font-family: 宋体;">版的，但是不是大家都有</span>
				<span lang="EN-US">PS</span>
				<span style="font-family: 宋体;">。这时我们等一段时间，一般会出</span>
				<span lang="EN-US">PC</span>
				<span style="font-family: 宋体;">版的或其他版本。由于支持游戏的平台不一样，但是如果我们编写的游戏程序为了适应另一种平台就要全部重新编写的话岂不是很麻烦。再加上游戏本身的变动，一句众人皆知的话：“死定了</span>
				<span lang="EN-US">”</span>
				<span style="font-family: 宋体;">。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
				</span>
				<span style="font-family: 宋体;">现在我们来看看</span>
				<span lang="EN-US">Bridge</span>
				<span style="font-family: 宋体;">桥接模式，看看它是如何解决类似问题的，首先我们看看</span>
				<span lang="EN-US">Bridge</span>
				<span style="font-family: 宋体;">模式的结构。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<v:shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600">
								<v:stroke joinstyle="miter">
								</v:stroke>
								<v:formulas>
										<v:f eqn="if lineDrawn pixelLineWidth 0">
										</v:f>
										<v:f eqn="sum @0 1 0">
										</v:f>
										<v:f eqn="sum 0 0 @1">
										</v:f>
										<v:f eqn="prod @2 1 2">
										</v:f>
										<v:f eqn="prod @3 21600 pixelWidth">
										</v:f>
										<v:f eqn="prod @3 21600 pixelHeight">
										</v:f>
										<v:f eqn="sum @0 0 1">
										</v:f>
										<v:f eqn="prod @6 1 2">
										</v:f>
										<v:f eqn="prod @7 21600 pixelWidth">
										</v:f>
										<v:f eqn="sum @8 21600 0">
										</v:f>
										<v:f eqn="prod @7 21600 pixelHeight">
										</v:f>
										<v:f eqn="sum @10 21600 0">
										</v:f>
								</v:formulas>
								<v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f">
								</v:path>
								<o:lock aspectratio="t" v:ext="edit">
								</o:lock>
						</v:shapetype>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">
								<img alt="" src="http://www.cnblogs.com/images/cnblogs_com/kid-li/Bridge1.jpg" border="0" height="185" width="553" />
								<br />       </span>
				</span>
				<span style="font-family: 宋体;">实际上，我们要做到的是把变化的部分提出，对其抽象，使变化独立。那我们如何做呢？通过组合的方式将变化独立出去。将一个事物中的多个纬度变化分离。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
				</span>
				<span style="font-family: 宋体;">下面举一个场景来理解一下，还是用汽车举例，我现在要一辆车（</span>
				<span lang="EN-US">BMW</span>
				<span style="font-family: 宋体;">或</span>
				<span lang="EN-US">BORA</span>
				<span style="font-family: 宋体;">）在路（</span>
				<span lang="EN-US">WaterRoad</span>
				<span style="font-family: 宋体;">或</span>
				<span lang="EN-US">Cement</span>
				<span style="font-family: 宋体;">）上跑。现在有两个纬度的变化点：汽车和路。也就是上图中的</span>
				<span lang="EN-US">AbstractChangePoint1</span>
				<span style="font-family: 宋体;">和</span>
				<span lang="EN-US">AbstractChangePoint2</span>
				<span style="font-family: 宋体;">。</span>
				<span lang="EN-US">AbstractChangePoint1</span>
				<span style="font-family: 宋体;">中包含有</span>
				<span lang="EN-US">AbstractChangePoint2</span>
				<span style="font-family: 宋体;">对象成员。。代码实现如下：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span lang="EN-US">
						<span style="">       </span>
				</span>
				<span style="color: blue; font-family: 新宋体;" lang="EN-US">abstract</span>
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="color: blue;">class</span>
						<span style="color: teal;">AbstractCar<o:p></o:p></span>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: teal;">AbstractRoad</span> road;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span> AbstractCar(<span style="color: teal;">AbstractRoad</span> road)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: blue;">this</span>.road = road;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">abstract</span>
						<span style="color: blue;">string</span> Run();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">abstract</span>
						<span style="color: blue;">string</span> Stop();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>
						<span style="color: blue;">abstract</span>
						<span style="color: blue;">class</span>
						<span style="color: teal;">AbstractRoad<o:p></o:p></span>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">abstract</span>
						<span style="color: blue;">string</span> GetRoadType();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt;">
				<span style="font-family: 新宋体;" lang="EN-US">}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt;">
				<span style="font-family: 新宋体;">以汽车为变化中心，用组装的方式将两个变化点结合起来。使路的变化和汽车隔离。下面来编写路的实现。<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt; text-align: left;" align="left">
				<span style="color: blue; font-family: 新宋体;" lang="EN-US">class</span>
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="color: teal;">WaterRoad</span>:<span style="color: teal;">AbstractRoad<o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">override</span>
						<span style="color: blue;">string</span> GetRoadType()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: blue;">return</span>
						<span style="color: maroon;">"It is WaterRoad"</span>;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt;">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style=""> </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt; text-align: left;" align="left">
				<span style="color: blue; font-family: 新宋体;" lang="EN-US">class</span>
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="color: teal;">CementRoad</span>:<span style="color: teal;">AbstractRoad<o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">override</span>
						<span style="color: blue;">string</span> GetRoadType()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: blue;">return</span>
						<span style="color: maroon;">"It is Cement"</span>;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt;">
				<span style="font-family: 新宋体;" lang="EN-US">}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt;">
				<span style="font-family: 新宋体;">然后再来编写汽车的实现<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt; text-align: left;" align="left">
				<span style="color: blue; font-family: 新宋体;" lang="EN-US">class</span>
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="color: teal;">BMWCar</span>:<span style="color: teal;">AbstractCar<o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span> BMWCar(<span style="color: teal;">AbstractRoad</span> road)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>: <span style="color: blue;">base</span>(road)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">           </span>
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">override</span>
						<span style="color: blue;">string</span> Run()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: blue;">return</span>
						<span style="color: maroon;">"BMW is running"</span>;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">override</span>
						<span style="color: blue;">string</span> Stop()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: blue;">return</span>
						<span style="color: maroon;">"BMW is stopped"</span>;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt;">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style=""> </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt; text-align: left;" align="left">
				<span style="color: blue; font-family: 新宋体;" lang="EN-US">class</span>
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="color: teal;">BROACar</span>:<span style="color: teal;">AbstractCar<o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span> BROACar(<span style="color: teal;">AbstractRoad</span> road)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>: <span style="color: blue;">base</span>(road)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">override</span>
						<span style="color: blue;">string</span> Run()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: blue;">return</span>
						<span style="color: maroon;">"BROA is running"</span>;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">override</span>
						<span style="color: blue;">string</span> Stop()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: blue;">return</span>
						<span style="color: maroon;">"BROA is stopped"</span>;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt;">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">  </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt;">
				<span style="font-family: 新宋体;">然后我们在客户代码中调用这些类，首先，我想要这个场景是<span lang="EN-US">BMW</span>在<span lang="EN-US">WaterRoad</span>上跑，客户端代码如下：<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: 21pt; text-align: left;" align="left">
				<span style="color: blue; font-family: 新宋体;" lang="EN-US">static</span>
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="color: blue;">void</span>
						<st1:place w:st="on">Main</st1:place>(<span style="color: blue;">string</span>[] args)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: teal;">AbstractCar</span> car = <span style="color: blue;">new</span><span style="color: teal;">BMWCar</span>(<span style="color: blue;">new</span><span style="color: teal;">WaterRoad</span>());<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: teal;">Console</span>.WriteLine(car.road.GetRoadType());<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: teal;">Console</span>.WriteLine(car.Run());<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: teal;">Console</span>.WriteLine(car.Stop());<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: teal;">Console</span>.Read();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt;">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt;">
				<span style="font-family: 新宋体;">实现结果如下：<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt;">
				<span style="font-family: 新宋体;" lang="EN-US">It is WaterRoad<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt;">
				<span style="font-family: 新宋体;" lang="EN-US">BMW is running<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt;">
				<span style="font-family: 新宋体;" lang="EN-US">BMW is stopped<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt;">
				<span style="font-family: 新宋体;">如果我现在要一辆<span lang="EN-US">BORA</span>在<span lang="EN-US">Cement</span>上跑，我们只要稍微修改一下<span lang="EN-US">car</span>的实例化就可以，代码如下：<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: 10.5pt; text-align: left;" align="left">
				<span style="color: blue; font-family: 新宋体;" lang="EN-US">static</span>
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="color: blue;">void</span>
						<st1:place w:st="on">Main</st1:place>(<span style="color: blue;">string</span>[] args)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: teal;">AbstractCar</span> car = <span style="color: blue;">new</span><span style="color: teal;">BROACar</span>(<span style="color: blue;">new</span><span style="color: teal;">CementRoad</span>());<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: teal;">Console</span>.WriteLine(car.road.GetRoadType());<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: teal;">Console</span>.WriteLine(car.Run());<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: teal;">Console</span>.WriteLine(car.Stop());<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: teal;">Console</span>.Read();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt;">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">     </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt;">
				<span style="font-family: 新宋体;">实现结果如下：<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt;">
				<span style="font-family: 新宋体;" lang="EN-US">It is Cement<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt;">
				<span style="font-family: 新宋体;" lang="EN-US">BROA is running<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt;">
				<span style="font-family: 新宋体;" lang="EN-US">BROA is stopped<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>
				</span>
				<span style="font-family: 宋体;">最后我们再来说说</span>
				<span lang="EN-US">Bridge</span>
				<span style="font-family: 宋体;">模式的要点：</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span lang="EN-US">
						<span style="">       </span>1</span>
				<span style="font-family: 宋体;">、</span>
				<span lang="EN-US">Bridge</span>
				<span style="font-family: 宋体;">模式使用“对象间的组合关系”解耦了抽象和实现之间固有的绑定关系，使得抽象和实现可以沿着各自的纬度来变化。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span lang="EN-US">2</span>
				<span style="font-family: 宋体;">、所谓抽象和实现沿着各自纬度的变化，即“子类化”它们，得到各个子类之后，便可以任意组合它们。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span lang="EN-US">3</span>
				<span style="font-family: 宋体;">、</span>
				<span lang="EN-US">Bridge</span>
				<span style="font-family: 宋体;">模式有时候类似于多继承方案，但是多继承方案往往违背单一职责原则（即一个类只有一个变化的原因），复用性比较差。</span>
				<span lang="EN-US">Bridge</span>
				<span style="font-family: 宋体;">模式是比多继承方案更好的解决方法。</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span lang="EN-US">4</span>
				<span style="font-family: 宋体;">、</span>
				<span lang="EN-US">Bridge</span>
				<span style="font-family: 宋体;">模式的应用一般在“两个非常强的变化纬度”，有时候即使有两个变化的纬度，但是某个方向的变化纬度并不剧烈——换言之两个变化不会导致纵横交错的结果，并不一定要使用</span>
				<span lang="EN-US">Bridge</span>
				<span style="font-family: 宋体;">模式。</span>
		</p>
<img src ="http://www.blogjava.net/franky/aggbug/104806.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/franky/" target="_blank">Franky</a> 2007-03-19 20:53 <a href="http://www.blogjava.net/franky/articles/104806.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：设计模式学习笔记（七）——Adapter适配器模式</title><link>http://www.blogjava.net/franky/articles/104804.html</link><dc:creator>Franky</dc:creator><author>Franky</author><pubDate>Mon, 19 Mar 2007 12:50:00 GMT</pubDate><guid>http://www.blogjava.net/franky/articles/104804.html</guid><wfw:comment>http://www.blogjava.net/franky/comments/104804.html</wfw:comment><comments>http://www.blogjava.net/franky/articles/104804.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/franky/comments/commentRss/104804.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/franky/services/trackbacks/104804.html</trackback:ping><description><![CDATA[
		<a id="viewpost1_TitleUrl" class="postTitle2" href="http://www.cnblogs.com/kid-li/archive/2006/05/29/412180.html">
				<span style="" lang="EN-US">
						<span style="">  </span>Adapter</span>
				<span style="font-family: 宋体;">适配器模式是一种结构型模式，主要应对：由于应用环境的变化，常常需要将“一些现存的对象”放在新的环境中应用，但是，新环境要求的接口是现存对象所不满足的。</span>
				<span style="" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</a>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN-US">
						<span style="">       </span>
				</span>
				<span style="font-family: 宋体;">《设计模式》中说道：将一个类的接口转换成客户希望的另一个接口。</span>
				<span style="" lang="EN-US">Adapter</span>
				<span style="font-family: 宋体;">模式使得原本由于接口不兼容而不能一起工作的类可以一起工作。</span>
				<span style="" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN-US">
						<span style="">       </span>
				</span>
				<span style="font-family: 宋体;">在实际的生活中有很多例子，如：我们常使用的移动硬盘，无论是笔记本硬盘还是台式机硬盘，对于数据的传输都不使用</span>
				<span style="" lang="EN-US">Usb</span>
				<span style="font-family: 宋体;">的数据线，外接的硬盘盒就是将原来的硬盘数据传输方式适合</span>
				<span style="" lang="EN-US">Usb</span>
				<span style="font-family: 宋体;">数据线。（哎，我那个硬盘盒买的时候还</span>
				<span style="" lang="EN-US">190</span>
				<span style="font-family: 宋体;">元，其实一点都不值，整个一个盒，就那个转接芯片比较值钱，我说</span>
				<span style="" lang="EN-US">50</span>
				<span style="font-family: 宋体;">，人家不卖）。</span>
				<span style="" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN-US">
						<span style="">       </span>
				</span>
				<span style="font-family: 宋体;">我再接着说适配器模式，先举个简单的代码例子，我现在要做一个队列的类，实现先进先出的功能。利用</span>
				<span style="" lang="EN-US">ArrayList</span>
				<span style="font-family: 宋体;">对象。</span>
				<span style="" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN-US">
						<span style="">       </span>
				</span>
				<span style="font-family: 宋体;">首先，我们先定义一些队列的接口，接口中定义队列的方法，代码如下：</span>
				<span style="" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="" lang="EN-US">
						<span style="">       </span>
				</span>
				<span style="color: blue; font-family: 新宋体;" lang="EN-US">interface</span>
				<span style="font-family: 新宋体;" lang="EN-US"> IQueue<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">void</span> push(<span style="color: blue;">object</span> item);<span style="">     </span><span style="color: green;">//</span></span>
				<span style="color: green; font-family: 新宋体;">进队列<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">object</span> putout();<span style="">            </span><span style="color: green;">//</span></span>
				<span style="color: green; font-family: 新宋体;">出队列<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">object</span> ShowLastItem();<span style="">      </span><span style="color: green;">//</span></span>
				<span style="color: green; font-family: 新宋体;">返回队列中最后一项<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">object</span> ShowFirstItem();<span style="">     </span><span style="color: green;">//</span></span>
				<span style="color: green; font-family: 新宋体;">返回队列中第一项</span>
				<span style="font-family: 新宋体;" lang="EN-US">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>
				</span>
				<span style="font-family: 新宋体;">下面我们再来利用<span lang="EN-US">ArrayList</span>对象实现一个队列：<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>
						<span style="color: blue;">class</span> Queue:IQueue<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>ArrayList adaptee;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span> Queue()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>adaptee = <span style="color: blue;">new</span> ArrayList();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">void</span> push(<span style="color: blue;">object</span> item)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>adaptee.Add(item);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">object</span> putout()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: blue;">object</span> item = adaptee[0];<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>adaptee.RemoveAt(0);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: blue;">return</span> item;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">object</span> ShowLastItem()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: blue;">return</span> adaptee[adaptee.Count-1];<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">object</span> ShowFirstItem()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: blue;">return</span> adaptee[0];<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>
				</span>
				<span style="font-family: 新宋体;">实现有了，现在用客户端程序调用来看一下结果：<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>
						<span style="color: blue;">class</span> Class1<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: gray;">///</span>
						<span style="color: green;">
						</span>
						<span style="color: gray;">&lt;summary&gt;<o:p></o:p></span>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: gray;">///</span>
						<span style="color: green;">
						</span>
				</span>
				<span style="color: green; font-family: 新宋体;">应用程序的主入口点。<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: gray;">///</span>
						<span style="color: green;">
						</span>
						<span style="color: gray;">&lt;/summary&gt;<o:p></o:p></span>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>[STAThread]<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">static</span>
						<span style="color: blue;">void</span>
						<st1:place w:st="on">Main</st1:place>(<span style="color: blue;">string</span>[] args)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>Queue queue = <span style="color: blue;">new</span> Queue();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>queue.push(1);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>queue.push(2);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>queue.push(3);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>queue.push(4);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>queue.push(5);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>Console.Write(<span style="color: purple;">"FirstItem:"</span> + queue.ShowFirstItem().ToString() + <span style="color: purple;">"\n"</span>);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>Console.Write(<span style="color: purple;">"LastItem:"</span> + queue.ShowLastItem().ToString() + <span style="color: purple;">"\n"</span>);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>Console.Write(<span style="color: purple;">"output:"</span> + queue.putout().ToString() + <span style="color: purple;">"\n"</span>);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>queue.push(6);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>Console.Write(<span style="color: purple;">"FirstItem:"</span> + queue.ShowFirstItem().ToString() + <span style="color: purple;">"\n"</span>);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>Console.Write(<span style="color: purple;">"LastItem:"</span> + queue.ShowLastItem().ToString() + <span style="color: purple;">"\n"</span>);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>Console.Read();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>
				</span>
				<span style="font-family: 新宋体;">输出结果：<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>FirstItem:1<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="font-family: 新宋体;" lang="EN-US">LastItem:5<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="font-family: 新宋体;" lang="EN-US">output:1<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="font-family: 新宋体;" lang="EN-US">FirstItem:2<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="font-family: 新宋体;" lang="EN-US">LastItem:6<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="font-family: 新宋体;">适配器模式实现有两种类型：对象适配器、类适配器。上面的代码是对象适配器方式。也就是适配器（<span lang="EN-US">Queue</span>）中是使用被适配（<span lang="EN-US">ArrayList</span>）的对象实现。它的结构如下：<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center">
				<span style="font-family: 新宋体;" lang="EN-US">
						<v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f">
								<v:stroke joinstyle="miter">
								</v:stroke>
								<v:formulas>
										<v:f eqn="if lineDrawn pixelLineWidth 0">
										</v:f>
										<v:f eqn="sum @0 1 0">
										</v:f>
										<v:f eqn="sum 0 0 @1">
										</v:f>
										<v:f eqn="prod @2 1 2">
										</v:f>
										<v:f eqn="prod @3 21600 pixelWidth">
										</v:f>
										<v:f eqn="prod @3 21600 pixelHeight">
										</v:f>
										<v:f eqn="sum @0 0 1">
										</v:f>
										<v:f eqn="prod @6 1 2">
										</v:f>
										<v:f eqn="prod @7 21600 pixelWidth">
										</v:f>
										<v:f eqn="sum @8 21600 0">
										</v:f>
										<v:f eqn="prod @7 21600 pixelHeight">
										</v:f>
										<v:f eqn="sum @10 21600 0">
										</v:f>
								</v:formulas>
								<v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect">
								</v:path>
								<o:lock v:ext="edit" aspectratio="t">
								</o:lock>
						</v:shapetype>
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;" align="center">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">
								<img alt="" src="http://www.cnblogs.com/images/cnblogs_com/kid-li/Adapter21.JPG" border="0" height="200" width="441" />
								<br />    </span>Gof</span>
				<span style="font-family: 新宋体;">《设计模式》中提到了两种<span lang="EN-US">Adapter</span>适配器模式，一种叫对象适配器模式，另一种叫类适配器模式。对象适配器模式的结构如上图，也就是我刚才举的那个例子，那什么是类适配器模式呢？实际上类适配器模式就是让<span lang="EN-US">Adapter</span>的实现继承<span lang="EN-US">Adaptee</span>。换句话说：类适配器模式是以继承的方式来实现，而对象适配器模式是以组合的方式实现。以前我们说过：继承增加了模块间的耦合程度，而组合降低了耦合程度，所以有人建议多使用对象适配器模式，少用类适配器模式。不过既然提到，我也具体谈谈类适配器模式。它的结构如下图：<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<span style="font-family: 新宋体;" lang="EN-US">
				<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center">
						<img alt="" src="http://www.cnblogs.com/images/cnblogs_com/kid-li/Adapter22.JPG" border="0" height="203" width="420" />
				</p>
				<o:p>
				</o:p>
		</span>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>
				</span>
				<span style="font-family: 新宋体;">我们依然用上面的那个队列的例子，首先我们要实现一个<span lang="EN-US">Adapter</span>的类，这个类要继承适配对象<span lang="EN-US">Adaptee</span>类，也就是例子中的<span lang="EN-US">ArrayList</span>，还有队列接口，就是我们定义的<span lang="EN-US">IQueue</span>，代码如下：<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>
						<span style="color: blue;">class</span> ClassAdapter:ArrayList,IQueue<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span> ClassAdapter()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">void</span> push(<span style="color: blue;">object</span> item)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: blue;">this</span>.Add(item);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">object</span> putout()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: blue;">object</span> item = <span style="color: blue;">this</span>[0];<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: blue;">this</span>.RemoveAt(0);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: blue;">return</span> item;<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">object</span> ShowLastItem()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: blue;">return</span>
						<span style="color: blue;">this</span>[<span style="color: blue;">this</span>.Count-1];<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">object</span> ShowFirstItem()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>
						<span style="color: blue;">return</span>
						<span style="color: blue;">this</span>[0];<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>
				</span>
				<span style="font-family: 新宋体;">然后我们再修改一下客户代码：<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">static</span>
						<span style="color: blue;">void</span>
						<st1:place w:st="on">Main</st1:place>(<span style="color: blue;">string</span>[] args)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>ClassAdapter queue = <span style="color: blue;">new</span> ClassAdapter();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>queue.push(1);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>queue.push(2);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>queue.push(3);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>queue.push(4);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>queue.push(5);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>Console.Write(<span style="color: purple;">"FirstItem:"</span> + queue.ShowFirstItem().ToString() + <span style="color: purple;">"\n"</span>);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>Console.Write(<span style="color: purple;">"LastItem:"</span> + queue.ShowLastItem().ToString() + <span style="color: purple;">"\n"</span>);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>Console.Write(<span style="color: purple;">"output:"</span> + queue.putout().ToString() + <span style="color: purple;">"\n"</span>);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>queue.push(6);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>Console.Write(<span style="color: purple;">"FirstItem:"</span> + queue.ShowFirstItem().ToString() + <span style="color: purple;">"\n"</span>);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>Console.Write(<span style="color: purple;">"LastItem:"</span> + queue.ShowLastItem().ToString() + <span style="color: purple;">"\n"</span>);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>Console.Read();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>
				</span>
				<span style="font-family: 新宋体;">输出结果为：<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="font-family: 新宋体;" lang="EN-US">FirstItem:1<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="font-family: 新宋体;" lang="EN-US">LastItem:5<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="font-family: 新宋体;" lang="EN-US">output:1<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="font-family: 新宋体;" lang="EN-US">FirstItem:2<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="font-family: 新宋体;" lang="EN-US">LastItem:6<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="font-family: 新宋体;">要说明一点：从实现的代码看：<span lang="EN-US">ClassAdapter</span>类同时继承了<span lang="EN-US">ArrayList,IQueue</span>，这样违反了设计原则中的单一职责原则（<span lang="EN-US">SRP</span>）——一个类应该仅有一个引起他变化的原因。<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="font-family: 新宋体;">接下来，我们在看看<span lang="EN-US">Adapter</span>模式的几个要点：<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 57.75pt; text-indent: -36.75pt;">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">1、<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">              </span></span>
				</span>
				<span style="font-family: 新宋体;" lang="EN-US">Adapter</span>
				<span style="font-family: 新宋体;">模式主要应用于“希望服用一些现存的类，但是接口又与复用环境要求不一致的情况”，在遗留代码复用、类库迁移等方面非常有用。<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 57.75pt; text-indent: -36.75pt;">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">2、<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">              </span></span>
				</span>
				<span style="font-family: 新宋体;" lang="EN-US">Gof23</span>
				<span style="font-family: 新宋体;">定义了两种<span lang="EN-US">Adapter</span>模式的实现结构：对象适配器和类适配器。但类适配器采用“多继承”的实现方式，带来了不良的高耦合，所以一般不推荐使用。对象适配器采用“对象组合”的方式，更符合松耦合精神。<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 57.75pt; text-indent: -36.75pt;">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">3、<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">              </span></span>
				</span>
				<span style="font-family: 新宋体;" lang="EN-US">Adapter</span>
				<span style="font-family: 新宋体;">模式本身要求我们尽可能的使用“面向接口的编程”风格，这样才能在后期很方便的适配<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="font-family: 新宋体;" lang="EN-US">Adapter</span>
				<span style="font-family: 新宋体;">模式的实现方法有很多，说到这我在举一个例子，我现在有这样一个场景。我有一辆<span lang="EN-US">BORA</span>车子和<span lang="EN-US">BMW</span>的<span lang="EN-US">Engine</span>和<span lang="EN-US">Wheel</span>，我现在想改装这辆<span lang="EN-US">BORA</span>使其拥有<span lang="EN-US">BMW</span>的<span lang="EN-US">Engine</span>和<span lang="EN-US">Wheel</span>，我如何做呢？<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="font-family: 新宋体;">首先，我们要拥有一些<span lang="EN-US">BMW</span>的零部件，代码如下：<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left;" align="left">
				<span style="color: blue; font-family: 新宋体;" lang="EN-US">class</span>
				<span style="font-family: 新宋体;" lang="EN-US"> BMWPartClass<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">void</span> BMWEngine()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>Console.Write(<span style="color: purple;">"It is a BMWEngine\n"</span>);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">void</span> BMWWheel()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>Console.Write(<span style="color: purple;">"It is a BMWWheel\n"</span>);<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="font-family: 新宋体;" lang="EN-US">}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="font-family: 新宋体;">然后，再来实现对这些零部件的适配，代码如下：<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left;" align="left">
				<span style="color: blue; font-family: 新宋体;" lang="EN-US">interface</span>
				<span style="font-family: 新宋体;" lang="EN-US"> ITarget<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">void</span> Request();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>
						<span style="color: blue;">class</span> Adapter:ITarget<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>BMWPartClass adaptee = <span style="color: blue;">new</span> BMWPartClass();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">void</span> Request()<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>adaptee.BMWEngine();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>adaptee.BMWWheel();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="font-family: 新宋体;" lang="EN-US">}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="font-family: 新宋体;">对于我的<span lang="EN-US">BORA</span>的实现：<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left;" align="left">
				<span style="color: blue; font-family: 新宋体;" lang="EN-US">class</span>
				<span style="font-family: 新宋体;" lang="EN-US"> MyBORAClass<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>
						<span style="color: blue;">public</span>
						<span style="color: blue;">void</span> Process(ITarget target)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>target.Request();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="font-family: 新宋体;" lang="EN-US">}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="font-family: 新宋体;">最后是客户端代码：<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: 21pt; text-align: left;" align="left">
				<span style="color: blue; font-family: 新宋体;" lang="EN-US">static</span>
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="color: blue;">void</span>
						<st1:place w:st="on">Main</st1:place>(<span style="color: blue;">string</span>[] args)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">        </span>{<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>MyBORAClass bora = <span style="color: blue;">new</span> MyBORAClass();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>bora.Process(<span style="color: blue;">new</span> Adapter());<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">            </span>Console.Read();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="font-family: 新宋体;" lang="EN-US">
						<span style="">    </span>}<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="font-family: 新宋体;">输出结果是：<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="font-family: 新宋体;" lang="EN-US">It is a BMWEngine<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<span style="font-family: 新宋体;" lang="EN-US">It is a BMWWheel</span>
		</p>
<img src ="http://www.blogjava.net/franky/aggbug/104804.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/franky/" target="_blank">Franky</a> 2007-03-19 20:50 <a href="http://www.blogjava.net/franky/articles/104804.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>