<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1102790865060223847</id><updated>2024-07-03T10:06:51.467+08:00</updated><category term="仙境传说"/><category term="code"/><category term="设计模式"/><category term="IOC"/><category term="java"/><category term="maven"/><category term="算法"/><category term="跑跑卡丁车"/><title type='text'>转瞬即逝的永恒</title><subtitle type='html'>暗夜哭泣的精灵，用歌声救赎了世界，却无法给自己痛苦的心灵一个庇护。</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='https://undancer.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default'/><link rel='alternate' type='text/html' href='https://undancer.blogspot.com/'/><link rel='next' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default?start-index=26&amp;max-results=25'/><author><name>undancer</name><uri>http://www.blogger.com/profile/05800974944226224562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>34</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1102790865060223847.post-7386693476118907791</id><published>2009-02-21T02:20:00.000+08:00</published><updated>2009-02-21T02:21:52.494+08:00</updated><title type='text'>当你已经23后：男生女生都该看</title><content type='html'>&lt;strong&gt;女生篇&lt;/strong&gt;&lt;br /&gt;在路上主动和你套近乎的陌生人，就不要傻不拉叽的给人电话号码了，你会被短信电话骚扰致死的。 &lt;br /&gt;在场上不要标榜自己多能喝，很男人的与人划拳喝酒了，真正在乎你的人是不会看着你喝到醉醺醺的。 &lt;br /&gt;告别灰姑娘和白马王子的白日梦吧，你的脚没那么小，穿不进那水晶鞋。 &lt;br /&gt;有给男友买进口剃须刀的钱，不如给老爸买双袜子，他穿着你老妈补过几次的袜子，你注意了吗。 &lt;br /&gt;有份稳定的工作，多赚点钱，女人一定要经济独立，才有独立的人格，防止以后成了娜拉，鲁迅爷爷说过娜拉出走后要么回来，要么沦为娼。 &lt;br /&gt;中年男人，特指大款，请你吃饭唱歌泡吧，拒绝吧，你算计不过他们的。 &lt;br /&gt;曾经背叛过你的男人想回头，对其说不。 &lt;br /&gt;你曾经背叛的男人请你回头，对其说不。 &lt;br /&gt;学点衣装搭配，不要再红陪紫好死不死的穿着出门了。 &lt;br /&gt;对于年少时幼稚男对你的山盟海誓，一笑而过吧，他说这些话肯定没经过大脑。 &lt;br /&gt;大事坚持原则，小事学会变通。 &lt;br /&gt;没必要和男友争个面红耳赤，你对了，他会认为你争强好胜得理不饶人，你错了，他会认为你无理取闹没完没了。 &lt;br /&gt;有钱买条高档项链，总比戴着块假玉让人看着有品味。 &lt;br /&gt;别再动不动就学野蛮女友暴打你男人了，打坏了没有替身给你抗米面袋。 &lt;br /&gt;不要爱上有家室的男人，等他老婆孩子老父母全家总动员时，你会死的很惨。 &lt;br /&gt;每年做个身体检查，尤其是肝、肾、乳腺。 &lt;br /&gt;偶尔和妈妈一起下厨，永远比和姐妹淘无事生非的在一起胡吃海喝来得开心。 &lt;br /&gt;对于你真正要与其结婚的男友，要忠诚。 &lt;br /&gt;不要再认为你在玩别人的感情，对手可能比你道行要高。 &lt;br /&gt;想嫁给他，要做好安全措施；不想嫁给他，就更要做好安全措施。 &lt;br /&gt;不要再当月光族，你该学着攒些嫁妆钱了。 &lt;br /&gt;不要老买速溶咖啡在家喝，偶尔去趟星巴克，他会认为你懂得生活。 &lt;br /&gt;永远记住，和男生一起没白没黑的网游，只属于大学时代。 &lt;br /&gt;除非真有必要，没必要时时更换最新款手机，否则别人会认为你是卖手机的。 &lt;br /&gt;了解父母的身体状况。 &lt;br /&gt;此时的你至少该有张驾照，无论你是否有车。 &lt;br /&gt;至少有一个和你暧昧的异性朋友(没有性关系的那种)，既可以是你的精神百宝箱也可以当精神垃圾桶。 &lt;br /&gt;不要和女友的男友走得太近，背后会挨姐们儿的骂。 &lt;br /&gt;不要指望你的男友挣钱洗衣做饭家务样样精通，他没有超人的内裤可以穿在外面。 &lt;br /&gt;不要反复强调结婚以后你的男友一定要孝顺你的父母，甚至扬言要把父母接来一起住，让老公和岳父岳母相处，人与人是相互的，要是他把自己的父母也接来，你们家将会热闹得超乎想象。 &lt;br /&gt;不要才开始相处就提结婚，也不要连续两次拒绝你男友的求婚。 &lt;br /&gt;不要再想你这辈子必须找个梁朝伟或是郭台铭，因为你不是刘嘉玲。 &lt;br /&gt;不要找比自己小三岁以上的男孩，因为你也不是王菲。 &lt;br /&gt;买份保险，如果单位办了社保，就不必了。 &lt;br /&gt;给妈妈买些实用的东西，她会觉得比花要好几百倍。 &lt;br /&gt;有自己去SPA的时候不如陪妈妈去洗个澡，给她搓搓背。 &lt;br /&gt;万事随缘，但不要放弃努力。 &lt;br /&gt;不要给自己太大压力，不要学做咄咄逼人的女强人，你会越来越孤独。 &lt;br /&gt;有剩余资金，可以考虑买房了，结婚的房子不一定完全由男友负担。 &lt;br /&gt;无需把男人看得太复杂，人与人之间往往是彼此复杂化，当然，也不要当他们是白痴。 &lt;br /&gt;不要时时缠着男友，留给他点空间，感情会更深。 &lt;br /&gt;没事去看看男友的父母，比单纯巴结他管用的多。 &lt;br /&gt;男友多再不是你可以骄傲的本钱，只会被认为不靠谱。 &lt;br /&gt;对男友好不是件做作事儿，尤其人多的时候，对男友呼来喝去，他会很没面儿，也只会让人觉得你很没品。 &lt;br /&gt;此时的你再是闲人一个，没人会再夸你是乖乖女。 &lt;br /&gt;不要以为自己吸烟很有魅力，对皮肤不好，而且显得很风尘。 &lt;br /&gt;假如你还认字，那么经常看看书，提升一下自我修养。 &lt;br /&gt;别瞧不起你正经上班但挣得不多的姐们儿，人家吃碗面条，都是自个儿的血汗钱。 &lt;br /&gt;在朋友面前不要炫耀和自以为事(这样是很令人反感的)。 &lt;br /&gt;关心一点国家大事吧，别说俄国总统还是普京，政治不只是男人的事。 &lt;br /&gt;常关心一下你的男友，但关心不等于唠叨加监视。 &lt;br /&gt;和男友出去吃饭，不要因为自己是女孩，就不愿意埋单，觉得他请你是应分的，凭什么呀，你又一点也没少吃。 &lt;br /&gt;学学化妆吧，素颜美女是要拼年龄的，你很快就没这优势了。 &lt;br /&gt;多半男人认为，女人晚上也要和白天一样有魅力***。 &lt;br /&gt;如果你没有林妹妹那般才情容貌和身世，就不要动不动的流泪了，即使你做的出葬花吟，估计你也不想步林妹妹吐血后尘，关键是宝哥哥最后还娶了别人。 &lt;br /&gt;至少要保留一种健康的爱好，如：游泳，慢跑，乒乓等，记住逛街不算。 &lt;br /&gt;不要羡慕谁的好姐们儿比你多，她们的闹心事和这个数目也是成正比的。 &lt;br /&gt;永远不要认为别人的老公比你的好，因为他们爱的不是你。 &lt;br /&gt;保养一下头发吧，顶着一头烂草，彩妆也彩不起来。 &lt;br /&gt;多夸夸你的男友，你的一句话或许就是他的动力，会为你带来经济效益的。 &lt;br /&gt;想继续发展的男友最好带给父母看一看，老人的眼睛有时候确实比你雪亮。 &lt;br /&gt;不要再学男人说脏话了，你不是小太妹，会成为老太姐的。 &lt;br /&gt;以精打细算为荣，以乱吃零食为耻。 &lt;br /&gt;衣服不用一天一换，花枝招展的容易让人眼晕。 &lt;br /&gt;和男友的男友要保持一定距离，太远他会说你对他朋友不热情，太近事儿可就大了。 &lt;br /&gt;没有任何一件事，任何一个男人，值得你彻夜不眠或街头买醉，或者买安眠药。 &lt;br /&gt;女人，光鲜儿就那几年，以后拼的是道行而不只是脸蛋。 &lt;br /&gt;永远高雅的微笑。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;男生篇&lt;/strong&gt; &lt;br /&gt;酒吧认识的女人，多半就没有必要再留电话了。 &lt;br /&gt;喝酒喝好，不代表喝完吐吐完喝，在量上占个老大。 &lt;br /&gt;告别网恋吧，相比之下家人介绍的对象还是可以看看，必竟知根知底比较把握，少走弯路。 &lt;br /&gt;周末有带情人泡午夜场的钱，不如给母亲买点水果买点菜，趁现在子欲养而亲还在。 &lt;br /&gt;多赚点钱，但不要多到谁看上你，你都会觉得其只是看上你的钱的地步。 &lt;br /&gt;中年女人，实力比你雄厚，还是要选择说不。因为你付出的一定比得到的会多。 &lt;br /&gt;你曾经背叛的女人请你回头，对其说不。 &lt;br /&gt;穿着假名牌，不如一身便装，但求干净整洁。 &lt;br /&gt;对于年少时向一个女人做过的错误的诺言，你要有勇气违背它。 &lt;br /&gt;大事坚持原则，小事学会变通。 &lt;br /&gt;没必要和女友争个面红耳赤，她错了，你让着，她会感激你，其实她知道是她不讲理。 &lt;br /&gt;有钱买块好表，比在自己有脖子上加条一指来粗的金链子让人看着有品味。 &lt;br /&gt;别再动不动就想用武力解决问题，你不是泰森，也不是陈浩南。 &lt;br /&gt;不要爱上有家的女人，有一天你会觉得自己很白痴。 &lt;br /&gt;每年做个身体检查，尤其是肝，肺，胃以及血压。 &lt;br /&gt;偶尔和父亲促膝喝点小酒，永远比和一帮酒肉朋友在一起买醉来得开心。 &lt;br /&gt;对于你真正要与其结婚的女友，要忠诚。 &lt;br /&gt;不要再认为你在玩别人的感情，对手可能比你道行要高。 &lt;br /&gt;爱她，要做好安全措施；不爱她，就更要做好安全措施。 &lt;br /&gt;不要再当月光族，你该学着攒些钱了。 &lt;br /&gt;十七八岁没钱没卡叫潇酒，二十五以上没钱没卡叫没安全感。 &lt;br /&gt;永远记住，游戏与麻将叫消遣，不要沉迷。 &lt;br /&gt;除非真有必要，一般人通常没必要去买8888那样的四联号。否则见你其人，会以为你是卖卡的。 &lt;br /&gt;了解父母的身体状况。 &lt;br /&gt;此时的你至少该有张驾照，无论你是否有车。 &lt;br /&gt;N个酒肉朋友，也比不上一个与你肝胆相照的真哥们。 &lt;br /&gt;轻易不要借钱，也轻易不要借给别人钱，除非你不指着他还。 &lt;br /&gt;不要才开始相处就要求你的女友洗衣做饭样样精通，结了婚她自然就会为你做这些。 &lt;br /&gt;不要强调结婚以后你的女友一定要孝顺你的父母，人与人是相互的，只要你做到了，她也会的。 &lt;br /&gt;不要才开始相处就提结婚，也不要处了一年还不提结婚。 &lt;br /&gt;不要再想你这辈子必须找个张柏芝或李嘉欣，因为你不是周润发。 &lt;br /&gt;不要找比自己小五岁以上的女孩，如果你不是很有钱。 &lt;br /&gt;买份保险，如果单位办了社保，就不必了。 &lt;br /&gt;给母亲花一块钱母亲的笑容也是发自内心的灿烂。 &lt;br /&gt;有自己去泡桑那的时候不如陪父亲去洗个澡，给他搓搓背。 &lt;br /&gt;万事随缘，但不要放弃努力。 &lt;br /&gt;不要给自己太大压力，不要学做李嘉成，李嘉成当初也不知他会是今日的李嘉成。 &lt;br /&gt;有剩余资金，可以考虑买房了。哪怕只够付个首期。 &lt;br /&gt;无需把女人看得太复杂，人与人之间往往是彼此复杂化，当然，也不要当她们是白痴。 &lt;br /&gt;不要非等到情人节，才肯花个三头五百去买花，平时的一块巧克力，她也会笑逐颜开。 &lt;br /&gt;有和女友去开房的钱，不如存下来，假期时一起出去旅次游，感情会更深。 &lt;br /&gt;帮女友家换个灯泡，有时比给女友买套SK2还来得实惠。 &lt;br /&gt;女友多再不是你可以骄傲的本钱，只会被认为老大不小了还没个正事。 &lt;br /&gt;对女友好不是件磕趁事儿，尤其人多的时候，对女友呼来喝去，只会让人觉得你很没品。 &lt;br /&gt;此时的你再是闲人一个，没人会再夸你是浪子。 &lt;br /&gt;不要今天中华明天生命源，不如固定在天天大云的标准上。 &lt;br /&gt;假如你是中专以下学历，那么无论自考还是函授，还是提高一下，总有一天会有收益。 &lt;br /&gt;别瞧不起你正经上班的哥们，他们要找对象，比你有条件。 &lt;br /&gt;没做到的事不要轻易承诺，承诺过了，假如可以，还是努力做到。男人信誉很重要。 &lt;br /&gt;专一一点吧，没什么不好。 &lt;br /&gt;常关心一下你的女友，但关心不等于磨几。 &lt;br /&gt;不要相信女人喜欢AA制，该买单的时候还是要买的，男人爽快还是很有吸引力的。 &lt;br /&gt;不要以为男人就可以不注重形象，女人也不是瞎子。 &lt;br /&gt;多半女人认为，男人认真的时候最有魅力，无论是认真工作，还是认真****。 &lt;br /&gt;男人的眼泪可以流，用得适当，效果很好。常流不止，结果就让人作呕了。 &lt;br /&gt;新闻实事必看，哪怕有些事情不是你能说了算的，但你得了解。 &lt;br /&gt;至少要保留一种健康的爱好，如：游泳，足球，健身，蓝球等。 &lt;br /&gt;不要羡慕谁的铁子比你多，他们的闹心事和这个数目也是成正比的。 &lt;br /&gt;永远不要认为别人的媳妇比你的好，因为她必竟不是你媳妇。 &lt;br /&gt;鞋还是擦得光亮些吧，哪怕它不是名牌，也比一脚泥的AIDD还得顺眼。 &lt;br /&gt;多夸夸你的女友，哪怕是伪心的，她的心情好了，你也轻松不少。 &lt;br /&gt;想继续发展的女友最好带给母亲看一看，老人的眼睛有时候确实比你雪亮。 &lt;br /&gt;有聊QQ的时间，不如多看看新闻。 &lt;br /&gt;衣服不用一天一换，但也不要一周也不换一次。 &lt;br /&gt;和女友的女友要保持一定距离，太远她会说你对她朋友不热情，太近事儿可就大了。 &lt;br /&gt;永远不要夸你女友的女友，那会是她最忌讳的事情，最好是不要评价。 &lt;br /&gt;没有任何一件事，任何一个女人，值得你彻夜不眠或借酒浇愁。</content><link rel='replies' type='application/atom+xml' href='https://undancer.blogspot.com/feeds/7386693476118907791/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1102790865060223847/7386693476118907791' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/7386693476118907791'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/7386693476118907791'/><link rel='alternate' type='text/html' href='https://undancer.blogspot.com/2009/02/23.html' title='当你已经23后：男生女生都该看'/><author><name>undancer</name><uri>http://www.blogger.com/profile/05800974944226224562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1102790865060223847.post-8164523558329732110</id><published>2009-01-31T11:47:00.007+08:00</published><updated>2009-01-31T11:57:26.387+08:00</updated><title type='text'>凯尔西气质类型测试</title><content type='html'>&lt;p&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;你的气质类型，更接近于&lt;strong&gt;化解者&lt;/strong&gt;，是理想主义者的一个分支。你在拥有理想主义者类型共性的同时还兼具化解者的特性。&lt;br /&gt;       &lt;/p&gt;&lt;br /&gt;       16种气质类型中每个字母分别代表的意义：&lt;br /&gt;     E(Extraverted 外向) I(Introverted 内向) S(Sensory 感觉) N(Intuitive 直觉) &lt;br /&gt;     T(Thinking 思想)   F(Feeling 体验) J(Judging 判断) P(Perceiving 知觉)&lt;br /&gt;     &lt;p&gt;&lt;span class=&quot;STYLE1&quot;&gt;&lt;strong&gt;化解者&lt;/strong&gt;（&lt;strong&gt;INFP&lt;/strong&gt;）&lt;/span&gt;&lt;br /&gt;     &lt;p&gt; &amp;nbsp;&amp;nbsp;  &lt;p&gt;对于化解者而言，化解指解决困扰某人生活和人际关系中的发起行为，他的意思是，以一种安慰的方式来对待自己和他人，帮助别人恢复失去的和谐、完整。这些化解者呈现给社会一副平静且友善的表情，表面上他们文雅随和，然而其内心世界绝非如此安宁，而是有着其它类型所没有的照管能力。他们深切、热情的关心几位特别的人或一项自己喜欢的工作，希望给社会带来和平，给自己及亲人带来完整性。&lt;br /&gt;他们喜欢研究和调查，所以习惯于提倡者而非训诫型的角色，又因为他们喜好隐居以及矜持的个性决定了他们似乎更喜欢成为矛盾化解者。他们有一种源于强烈道义感的深刻的理想主义本性，将社会想像成一个合乎道德的、令人尊敬的地方。确实，为了理解化解者，我们必须理解他们的心理主义几乎无私，激励着他们为其所信服的人或事业做出非凡的牺牲。化解者因其隐居性和罕见性而仿佛孤立于世外桃源，理想主义使他们感受到与其它人的更大隔阂。他们约占总人口的1％。&lt;br /&gt;化解者或许是因为一种源于他们往往很不快乐的童年的疏远感而寻求内心以及与他人之间的和谐。他们过着充满好奇的童年生活，悲哀的是，他们受到许多父母的阻碍甚至惩罚。源于父母要求他们具有随和、勤勉的具体处事方式，现实中又有符合父母这些期望的同胞作为榜样，这常常会让化解者自惭形秽。其它类型的人可能不理睬这些不适合他们的期望，而化解者则做不到。他们即希望取悦自己的父母和同胞，却又不知道到底应当怎么作，所以会掩饰自己的与众不同之处，与家人和兄弟姐妹产生反差是令人厌恶的，他们甚至会为此困惑终生。但，其实他们极正常，只是与其他人不同而已―――就像天鹅被饲养在鸭子的家族里。&lt;br /&gt;即使如此，化解者仍然发现难以相信和指望自己。他们虽然善良而积极，却在别人的教导下，相信自己身上存在着罪恶，他们倾向于纯洁的品质，但也能潜心研究罪恶，随时警惕潜伏在他们身上的不道德行为。于是，当他们相信自己已经屈服于不良诱惑时，会习惯于采取自我牺牲的赎罪行为。但其他人很少查觉到他们内心的这种骚动，不过，这是在他们的精神世界里进行的，所以，他们并没有感到将这个问题公开的压力。&lt;br /&gt;在评论事物并做出结论的过程中，化解者宁愿服从于他们的直觉而不是逻辑推理。他们对美与丑、好与坏、道德与不道德等问题十分敏感。他们在工作中适应能力很强，喜欢新思想和新知识，理解他人的感受，并与多数人保持着良好的关系，尽管有些矜持。不喜欢受到电话干扰而善于独自工作，对复杂的情况很有耐心，却无法容忍例行的琐事。可能会犯实际行错误，却很少出现感觉上的失误。&lt;br /&gt;他们对学术活动和示范有着天然的兴趣，他们语言方面出色，经常听到社会对他们的召唤，并能挺身而出，且似乎愿意为此而做出个人牺牲。&lt;br /&gt;&lt;strong&gt;适合的工作： &lt;/strong&gt;&lt;br /&gt;宣传工作、社会工作、图书馆研究、幼儿咨询服务、人文学科方面的大学教育。&lt;/p&gt;&lt;br /&gt;     &lt;p&gt;&lt;strong&gt;适合的伴侣：陆军元帅 &lt;/strong&gt;&lt;br /&gt;       很可能从婚姻中得到很大的满足感。化解者，矜持、喜欢探索，在择偶问题上要比其它类型更为困难，他们摇摆不定。不管任何情况，他们的配偶都要忍受由于不得不应付这种紧张而形成的压力。而陆军元帅，外向、善于安排、忙于未来而整顿化解者，似乎对多重状态的生活方式训练有素，能为其指出明确的方向。&lt;/p&gt;&lt;br /&gt;     &lt;p&gt;&lt;strong&gt;关于家庭： &lt;/strong&gt;&lt;br /&gt;       作为伴侣，他们对自己的誓言予以隆重承诺，对配偶忠贞不二。他们喜欢过和谐的生活，并尽极大的努力来避免人与人之间发生冲突。他们对配偶情绪变化反应敏感并喜欢取悦他们，尽管他们或许难以公开或直接地表达兴趣和感情。他们坚守自己的梦想，却发现与另一个人朝夕相处很难满足自己浪漫而理想的婚姻生活观念。即使在最美好的日子里，他们也感到恐惧，怕今天的快乐要用以后的牺牲作为代价。他们相信“快乐一定会以痛苦作为代价”，有种不安全感。作为父母，他们致力于孩子的幸福安宁，以极大的同情心和适应力来对待他们。他们是可以通融的，甚至是顺从于他们的配偶的，除非他们的价值观遭到破坏，他们就会固执己见。但，如果家庭里，有这么一类人，就会达到长期和睦、融洽。&lt;/p&gt;&lt;br /&gt;     &lt;p&gt;&lt;strong&gt;关于领导： &lt;/strong&gt;&lt;br /&gt;       把维护他人的完整与健康视为自己的分内之事。化解者们鼓励他人，缓和他们内在的矛盾，协调他们的敌对价值观，或者弱化他们的抗争欲望。因此他们擅长于各种形式的安抚―――通融、调解、折衷，他们不具有攻击性。宁静寡言的化解者却能够成为优秀的孩童劝导者和家庭教导者，尤其在孩子怕羞、孤僻、受挫的情况下为他们提供良好的帮助。领导者在任何工作现场花费一些时间来感激这些杰出的个体都是很明智的举动。&lt;/p&gt;&lt;br /&gt;     &lt;p &gt;&lt;span class=&quot;STYLE2&quot;&gt;您所属于的大类 &gt; &gt;&lt;/span&gt;&lt;span class=&quot;STYLE1&quot;&gt; 理想主义者&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;     &lt;p &gt;&lt;strong&gt;语言―――抽象型 &lt;/strong&gt;&lt;br /&gt;适用于无法观察到的，仅仅依赖于想象力的事物，理想主义经常谈论那些仅凭想象力想像出来的事物。理想主义者的思想和语言天生具有归纳性，他们敏锐，由细节得出普遍性的概括，由事物的细微处了解它们的全部。&lt;br /&gt;他们重视自身感觉，坚持认为“肯定知道”人们真正想要什么。说话常用隐喻，并且喜欢运用修饰性语言，喜欢夸张和形容。他们一方面忽视等级地位，另一方面又对于其他类型人的身体语言、面部表情等，有着高度的敏锐性。&lt;/p&gt;&lt;br /&gt;     &lt;p&gt;&lt;strong&gt;使用工具―――合作型 &lt;/strong&gt;&lt;br /&gt;       理想主义者看来，人们选择的工具和行动，需要为他人所接受，虽然有时候不若那些不被认可的工具有效。他们对那种过于冷漠、或一心一意追求效果的功利行为感到非常的困惑，担心人性善的那方面，因此而遗失。&lt;br /&gt;       理想主义者首先考虑的，总是培养满意的人际关系，他们的理想是帮助周围人们彼此间融洽相处，从而大家为了共同的利益而努力。&lt;/p&gt;&lt;br /&gt;     &lt;p&gt;&lt;strong&gt;4.2&lt;/strong&gt;&lt;strong&gt;理想主义者的兴趣：&lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;     &lt;p&gt;多数理想主义者对买卖行为缺乏兴趣，很多人会追求自然科学领域的事业。他们通常会选择同语言文字打交道，并希望直接或间接的与他人交流。理想主义者非常容易被文学作品所感染，并倾向于以这种天生的易感性来解释它，喜欢任何形式的虚构性描述――故事、诗文、传说、神话，都能让他们感到快乐和力量。&lt;br /&gt;       理想主义者并不局限于对文学的研究上，理想主义者高度集中在社会科学领域。尤其是精神康复方面，他们能够在精神健康服务方面得到极大的满足，习惯于选择其中最人道主义的方法，提供服务咨询。&lt;br /&gt;       他们不惜任何努力使人们具备良好的自我感觉，并热心于道德、对正误的判断，而不是培养一种积极的自我形象。理想主义者和护卫者型的人都是道德守卫者，但前者关心的是幸福，后者关心的是正义。&lt;br /&gt;       他们在工作中，有个非常特殊的天赋：征募、训练、部属、发展和忠告等方面。他们擅长对他人的成长和成熟过程产生影响。他们不把教育看作训练和求证的过程，而是一种对个人关系的邀请。形成人际关系，对他们来说至关重要，然而，过多的干预他人的事情，可能会让人生厌。而且，过多的复杂人际关系，容易造成精神负载过重。&lt;/p&gt;&lt;br /&gt;     &lt;p&gt;&lt;strong&gt;4.3&lt;/strong&gt;&lt;strong&gt;理想主义者的人格定位&lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;     &lt;p&gt;&lt;strong&gt;对待现在―――利他的 &lt;/strong&gt;&lt;br /&gt;       利他主义主张，自私自利是不道德的，而为他人服务是高尚的，最大的幸福源于无私的为他人奉献，即自我牺牲。他们会全身心的帮助别人，当然，他们渴望一种“自我实现”的效果。&lt;/p&gt;&lt;br /&gt;     &lt;p&gt;&lt;strong&gt;对待未来―――轻信的 &lt;/strong&gt;&lt;br /&gt;       他们轻易且毫无保留的相信事物，与多疑的理性者形成鲜明对比，习惯于相信别人的理想主义者非常纯洁。&lt;/p&gt;&lt;br /&gt;     &lt;p&gt;&lt;strong&gt;对待过去―――神秘的 &lt;/strong&gt;&lt;br /&gt;       他们试图和生活中的困难达成妥协，觉得意外事故是令人困惑和无法解释的，并且不能够通过任何理性的分析来解释。他们勇敢的接受这样的想法：事情的结果和原因是无法被认识和用语言描述的。&lt;/p&gt;&lt;br /&gt;     &lt;p&gt;&lt;strong&gt;生活的地点―――小径 &lt;/strong&gt;&lt;br /&gt;       他们满足于行进中，引导他们探索生存意义，将他们带向更高层次的小径上。&lt;/p&gt;&lt;br /&gt;     &lt;p&gt;&lt;strong&gt;生活的时间―――明天 &lt;/strong&gt;&lt;br /&gt;       他们是未来之人，关注即将发生的事情甚于现实生活。&lt;/p&gt;&lt;br /&gt;     &lt;p&gt;&lt;strong&gt;4.4&lt;/strong&gt;&lt;strong&gt;理想主义者的自我形象&lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;&lt;br /&gt;       构成自我形象或者自我观念的，一般是三个方面，即：自尊、自重、自信，它们相互产生影响。&lt;/p&gt;&lt;br /&gt;     &lt;p&gt;&lt;strong&gt;自尊―――移情 &lt;/strong&gt;&lt;br /&gt;       当理想主义者与周围的人交往投入感情、并为他人所认可时，其自尊最为强烈。与人们在一起时体验到的移情反应作为其自尊的依据。&lt;/p&gt;&lt;br /&gt;     &lt;p&gt;&lt;strong&gt;自重―――仁爱 &lt;/strong&gt;&lt;br /&gt;       他们的尊重建立在一种维持对他人的仁爱和善意的基础上，充满了善意，对仇恨有着厌恶感。世界上任何残忍的迹象，都会伤害到理想主义者的感情。&lt;/p&gt;&lt;br /&gt;     &lt;p&gt;&lt;strong&gt;自信―――真实 &lt;/strong&gt;&lt;br /&gt;       他们的自信取决于他们诚实可信的态度，即能否成为一个真实的人，正直、心灵调和、言为心声。反之，他们则会感到焦虑，自信丧失。&lt;/p&gt;&lt;br /&gt;     &lt;p&gt;&lt;strong&gt;4.5&lt;/strong&gt;&lt;strong&gt;理想主义者的价值观&lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;     &lt;p&gt;&lt;strong&gt;本性―――热情 &lt;/strong&gt;&lt;br /&gt;       理想主义者非常容易动情，即感情来得快去的也快。幸运的是，他们倾向于积极的一面，因而他们的感情往往表现为极大的热情。&lt;/p&gt;&lt;br /&gt;     &lt;p&gt;&lt;strong&gt;信赖―――直觉 &lt;/strong&gt;&lt;br /&gt;       理想主义者信赖直觉的力量，凭第一印象而无需印证。毫无保留的信赖直觉，他们会将别人的感受，带到自己的感受区，想要感同身受，以此来拉进距离。&lt;/p&gt;&lt;br /&gt;     &lt;p&gt;&lt;strong&gt;向往―――浪漫 &lt;/strong&gt;&lt;br /&gt;       他们都是坚定不移的浪漫者，他们在各个方面都渴望浪漫，如果没有，他们会去培养。&lt;/p&gt;&lt;br /&gt;     &lt;p&gt;&lt;strong&gt;寻求―――本体 &lt;/strong&gt;&lt;br /&gt;       他们投入自己大量的时间，来追求他们自己的本体、人性的意义，以此来表达真实的自我，将这个视为生命中最重要的事业。&lt;/p&gt;&lt;br /&gt;     &lt;p&gt;&lt;strong&gt;珍视―――赞誉 &lt;/strong&gt;&lt;br /&gt;       为了使他们感到赏识，我们必须面对他们，在他们表情达意时“迎合他们的世界观”。他们常常被人误解，或迫于社会现实而扮演角色的错误。他们所关心的人对他们的赞誉，对他们而言是非常重要的，一旦出现，就另他们感到满足。&lt;/p&gt;&lt;br /&gt;     &lt;p&gt;&lt;strong&gt;渴望―――圣人 &lt;/strong&gt;&lt;br /&gt;       圣人是理想主义者最崇敬的角色典型，即努力克服物质的、世俗的牵挂、渴望生命的贤明见解之男女。&lt;/p&gt;&lt;br /&gt;     &lt;p&gt;&lt;strong&gt;4.6&lt;/strong&gt;&lt;strong&gt;理想主义者的社会角色&lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;     &lt;p&gt;人类存在两种基本的社会角色，一种是所处社会环境中，自身的地位作用确定的；另一种是我们为自己争取来的。&lt;br /&gt;       有三种社会角色在人格研究的因果关系上，起着特殊重要的意义：配偶、父母、领导。&lt;/p&gt;&lt;br /&gt;     &lt;p&gt;&lt;strong&gt;4.6.1&lt;/strong&gt;&lt;strong&gt;婚姻―――精神伴侣&lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;     &lt;p&gt;理想主义者是所有类型中，处理婚姻问题非常不同的一类。其他类型的人，对婚姻抱着实用的态度，他们认为伴侣会犯错，也伴随着妥协。而理想主义者则相反，他们会以空想主义的态度选择爱人，更经常要求伴侣和婚姻的浪漫活动。他们要求的是神秘而意味深长的的婚姻关系，还试图在其不存在的情况下加以创造。&lt;/p&gt;&lt;br /&gt;     &lt;p&gt;&lt;strong&gt;择偶 &lt;/strong&gt;&lt;br /&gt;       理想主义者型的人，通常不会给某人做出承诺，而宁愿一次同某一个人谈情说爱以探测发展特殊亲密关系的可能性。他们不喜欢随随便便或临时性的应付约会，而独具特色的期待着过去的肤浅关系能够变得深刻。他们喜欢谈论曾经深深感动过他们的电影或小说，但是倾向于谈论故事中所揭示的深刻涵义，而不是单纯的描述情节。这种以想象力及意味深长的交往方式，自由自在的同人交流的能力，往往决定了理想主义者能否认真对待一段特定的恋爱关系。&lt;br /&gt;       理想主义者很难发现他们所期待的那种能与之分享内心世界的人，它是一个反复试验的过程，需要仔细的寻觅。对理想主义者而言，与某人谈恋爱，不仅仅意味着肉体上的欢愉或社交体验，而是向另一个人敞开心扉的过程。某种程度上，还是自身灵魂的袒露，包含着对深怀敬意和相互理解的承诺和期待。&lt;br /&gt;       因而，他们对拒绝高度敏感，当对方表露蔑视，他们不得不主动断了恋情，感情上的破裂带给他们的伤害是很大的。以至于他们有时会因恐惧而避免和他人纠缠难分，或者走向另一个极端，即违心的保持一段恋情，只是为了推迟分手时所必须经历的精神伤害。&lt;br /&gt;       然而，一旦这个特殊的人出现，理想主义者就会激动不已，并全力以赴的追求这种恋爱关系。对于理想主义者来说，不仅是一桩美满的婚姻，而且还是一种异常强烈的、永恒的情感即将到来。他们会不吝啬的付出努力或想象力，不仅以浪漫的举止作为标志，还包括他们对爱情的理想化。&lt;br /&gt;       理想主义者能够从最细微的迹象中体察出他们热恋之人内在的多情和诗般感受，并相信每个人都具有精神增长的潜能，且意欲用爱去挖掘伴侣这方面的潜能。或许理想主义者并不愿意承认，这些浪漫的设想，往往具有强烈的性爱冲动，并且成为一种困扰。理想主义者的性感受可能会有很大的差异，一方面，他们坚持认为性行为必须是爱的表达，而不是欲望；另一方面，他们在自己建立的理想世界里，却非常热情，极易受到美丽躯体和性感的触动。&lt;br /&gt;       一旦两个人结合，理想主义者会感到无上的幸福。但是，期待比结合本身更吸引他们，日常生活的现实，失去了神秘的色彩，出现了平凡和欠缺。其他类型的人，当然也会觉得生活中存在差异，但是，他们却会通过调整、旅行、和努力，来转化这种差异。但是，男性理想主义者在这方面最为脆弱，他们往往倾向于去寻找一位新的情人，而非付出努力以发展现有的恋情。女性理想主义者则不会，相反，她们会变得越来越投入，继续让关系浪漫化，并深信它的完美性。对于男性理想主义者而言，亲密可能导致不稳定；而对于女性来说，则是不可或缺的一部分。&lt;br /&gt;       但，值得注意的是，19世纪60、70年代，或许是源于女性理想主义者对更为完美的婚姻关系的想象力。性解放的先锋组织中的大多数成员是女性理想主义者（特别是奋斗者），她们并不是随时准备着情愿为爱牺牲，而是宁愿为发现与男性相处的更满意方式的可能性而生存。&lt;br /&gt;       但是，多数理想主义者并不把婚姻的社会习俗看得比他们的个人承诺重要。因此，当他们确信已与对方进行了更深层次的结合、并且彼此交换了誓言，便认定他们已经完婚。而结婚仪式和理解，成为一种不必要的负担，并可能在神坛旁，显得慌乱、一脸的茫然，直到事后与配偶单独在一起时才会恢复正常。&lt;br /&gt;       这些理想主义者热情、大方、活泼、多情，自身谨慎而对人际关系敏感，非常吸引其它气质类型的人。艺术创造者觉得他们独具匠心运用的浪漫感觉很亲切，并能由于理想主义者在婚姻中注入的合乎伦理的成分而得到道德升华；护卫者对理想主义者表现出来的道德上谨慎，会感到有安全感，并从他们的投入中感受到一些朝气；但，对理想主义者最感兴趣的，却是理性者，不仅因为他们的共同点，更因为理想主义者的情感活力，以及他们对人类的洞察力，这些，都是理性者所缺乏的。&lt;/p&gt;&lt;br /&gt;     &lt;p&gt;&lt;strong&gt;婚姻 &lt;/strong&gt;&lt;br /&gt;       无论与那种人格气质的人结婚，他们都可能始终爱恋、支持和理解着他们的妻子或丈夫。理想主义者在情感世界里是无与伦比的，为婚姻生活增添了他们对配偶情绪与感受的非凡敏感以及卓越的情感交流能力。他们敏锐的关注着他人的体验，本能的对配偶表示同情，并且不愿意利用那一刻指出配偶所犯的错误，而这一点，往往是其它气质的人无法做到的。&lt;br /&gt;       理想主义者往往精通赞赏的艺术，他们习惯于向自己的爱人慷慨地表达衷心的赞许。无疑，理想主义者是最深情、专注、挚爱和富于欣赏力的配偶，并且会毫无保留的表达这些感情。&lt;br /&gt;       他们具有彻底投入别人精神世界的能力，以至于对方具有一种得到他们完全理解和接受的感觉。他们认为，建立亲密、爱恋的关系是世界上做得最为自然的事情，他们是性爱艺术的真正大师。尽管有时候这种敏感要付出代价，且当情感受到限制时，他们会烦乱，他们从配偶那里得到的感情，总是超出他们的承受能力。&lt;br /&gt;       此外，他们还受到配偶情感依赖的烦扰，尽管有时候他们的举动鼓励了这些依赖性的产生。如果他们的配偶开始显示出脆弱和很强的依赖性，虽然这些是他们曾经承诺过的，但是，理想主义者仍然会厌恶这种压力。原来被他们认为独特的爱人，现在有种被他们明显否定的感觉，并非他们有意刻薄，而是想逃避自己不再可能控制的婚姻而已。&lt;br /&gt;       理想主义者难以逃避事业的召唤以给自己的家人留出时间，学不会任何从复杂的事务中脱身，以保障家人占据他们生活中的首要地位。那些不会安排事务轻重缓急的理想主义者们，受到诱惑而不断的移情别恋，不惜放弃已有爱情的深化，而把精力用于追求新的恋情。但是，大部分的理想主义者型的人会因发展专一的爱情而获得极大的满足。他们注重培养婚姻中的浪漫情调，拥有情人和伴侣的双重身份。但是，在婚姻初期的性爱，会让理想主义者感到失望，因为他们在这方面让人惊讶的单纯，而且，往往是热情有余技巧不足，并且不愿意再去尝试其它的方法。&lt;br /&gt;       理想主义者一般都擅长社交活动，外向型的，在社交上很活跃；而内向的人，则倾向于在家营造一个私人的空间。但是，他们都是体贴家庭成员的，通常会记得纪念日。同样，如果对他们有意义的纪念日，被别人所遗忘了，他们会很受伤。&lt;/p&gt;&lt;br /&gt;     &lt;p&gt;&lt;strong&gt;伴侣组合&lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;&lt;br /&gt;       创造温馨、情深意笃的爱情是理想主义者的习惯，他们在婚姻中编排自己的人际关系魅力，然而他们要达到美满幸福的生活，仍存在一些问题。&lt;/p&gt;&lt;br /&gt;     &lt;p&gt;&lt;strong&gt;理想主义者&amp;amp;&lt;/strong&gt;&lt;strong&gt;艺术创造者： &lt;/strong&gt;&lt;br /&gt;       理想主义者极其欣赏艺术创造者型配偶在现实世界中所表现出来的洒脱、自然本色，这与他们常常忍受折磨、内疚的生活体验有着极大不同。另外，艺术创造者型伴侣喜爱享受感官享受和大胆满足性欲的特点也吸引着理想主义者型的人，并激发了他们的浪漫想像。&lt;br /&gt;       但这种婚姻中也蕴藏了令人不满意的种子，即艺术创造者型人缺乏谈论自己生命内涵的兴趣。&lt;/p&gt;&lt;br /&gt;     &lt;p&gt;&lt;strong&gt;理想主义者&amp;amp;&lt;/strong&gt;&lt;strong&gt;护卫者： &lt;/strong&gt;&lt;br /&gt;       同护卫者型的伴侣在一起使理想主义者在家中感到舒适和令人安心的稳定性，给他们一种脚踏实地的感觉。护卫者还有种让常常犹豫不决的理想主义者肃然起敬的坚定，确切的是非观。两者都属于社会合作者，在生活规范上减小了冲突矛盾。&lt;br /&gt;       然而，护卫者在分享理想主义者丰富内涵的过程中存在困惑，并有可能因此使他们的理想主义者伴侣失望。他们忠实聆听试图取悦于理想主义者，但是后者迟早会感到自己不被赏识，继而给两者带来压力。&lt;/p&gt;&lt;br /&gt;     &lt;p&gt;&lt;strong&gt;理想主义者&amp;amp;&lt;/strong&gt;&lt;strong&gt;理想主义者： &lt;/strong&gt;&lt;br /&gt;       很容易和气质相同的人结为夫妻，并往往相处得异常和睦，他们对彼此内心世界的探索让对方满意，并且也可能一时创造出美妙的性爱关系。但是，过于相似和过多的时间追求精神目标而筋疲力尽，及过多的内心交流，必然会侵入对方的私密空间，而导致双方心神不安。&lt;/p&gt;&lt;br /&gt;     &lt;p&gt;&lt;strong&gt;理想主义者&amp;amp;&lt;/strong&gt;&lt;strong&gt;理性者： &lt;/strong&gt;&lt;br /&gt;       选择理性者作为配偶，似乎最能保证理想主义者的成功。他们相互协调的基础是：两者都基本上生活在抽象的世界里。约会了其它类型后，偶然遇到的理性者会让理想主义者觉得发现了新大陆，并渴望能够想像出遥远的未来。同时，令人神往的是理性者的冷静和自主性，这两个特点，都是牢牢的抓住自己的本性，致使容易激动和内省的理想主义者对此极为钦佩，并希望仿效之。&lt;br /&gt;       当然，两者并不总是那么和睦。理想主义者的善于情感表达和理性者的自我控制、直觉和逻辑、伦理道德和技术实用主义之间的冲突，使再完善的组合也存在着挑战。理想主义者总是尝试将理性者对表达感情的抵触、表面上的冷漠攻破，可想而知是火花四溅的，也许就是因为这些火花，才使理想主义者对理性者情有独钟。&lt;/p&gt;&lt;br /&gt;     &lt;p&gt;&lt;strong&gt;4.6.2&lt;/strong&gt;&lt;strong&gt;养育子女&lt;/strong&gt;&lt;strong&gt; &lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;     &lt;p&gt;&lt;strong&gt;理想主义者型的孩子 &lt;/strong&gt;&lt;br /&gt;       他们是一群热情洋溢的小家伙，被称为“脾气暴躁之人”，因为他们的感情极其容易受到激发，而且有时会以一种令人惊异的强烈气势表现出来。小时候，总是被一种激情鼓舞着，几乎无法使其感情保持平静的状态。他们可能较早就开口说话了，外向的，并且在父母眼中从未停止过说话；内向的，同样具备强烈的感情，只是往往羞于表达而已，或许还存在某些人际交流方面的困难，特别是在家庭之外。&lt;br /&gt;       尽管理想主义者型儿童也许有时暴躁易怒，他们也能够讨人喜欢，是一种真诚表达自己喜欢了解他人的人性热情。他们很早就显露出来各种特制，只是，不幸的是，在多数情况下，他们很少存在行为典范。没有多少长辈擅长交际活动，所以他们必须自己领会，并自我完善。&lt;br /&gt;       理想主义者型显的孩子，对于最亲近的人，往往很敏感。当家庭成员关系和睦时，他们的自我感觉便平和，当父母或同胞哀伤时，他们也变得哀伤。家庭美满的，孩子的自尊能够较早较迅速的发展；反之，则缺乏泰然处理难题的防卫能力。&lt;br /&gt;       他们倾向于努力向别人显示自己良好的用意而不是提供具体帮助，他们从小就有着极高的道德期望，希望自己对待别人的态度和行为是完美无比的。在人前装模作样会让他们感到极不自在，他们很少寻求掌声。当然他们也设法去适应他人，喜欢受到成人的表扬，但并不是把自信建立于此。&lt;br /&gt;       他们希望别人承认自己是个独立的个体，他们感到自己和他人的差异，但认识不到这种差异是什么。理想主义者型和理性者型的孩子可能会产生某些与人疏远的感觉，但是理性者型的孩子仍然坚持我行我素，理想主义者型的孩子对自己的与众不同也非常满意。&lt;br /&gt;       理想主义者型的孩子需要父母承认自己的独特性，并充满爱心的认可他们的重要作用，有助于他们认定自己的独立、有价值的家庭成员资格。他们需要这样的讯息“你是很特别的人、我重视你、你对我很重要”。&lt;br /&gt;       此类型的孩子对他人最为信赖，并且相信直觉甚于行为规范。另外，他们和其它的孩子一起听故事，比其它人更容易坚信故事是真实的，甚至有些固执。他们喜欢反复的听一个故事，并自己虚构些情节加以叙述。他们喜欢中世纪骑士的故事、还有王子、公主、邪恶势力和巫婆。父母应该引导他们读些有幸福结局的故事，勇士最终胜利了、坏人改邪归正了，这样他们会被永恒的幸福吸引，不管以后无情的现实摧毁他们多少希望和梦想。&lt;br /&gt;       理想主义者型的孩子对玩具有着无法理喻的珍贵，如果丢失或被父母无意间丢弃，都会令他们感到不幸。他们更多的把玩具当成朋友，当然，也会遭到别人的嘲笑和排斥，从而体验人格遭到拒绝的感受。&lt;br /&gt;       理想主义者型的孩子是利他的，而且是全世界性的。而且这类孩子早熟，有一定的怀疑主义倾向。他们总是满腔热情的探索着某种值得信仰的理念。&lt;/p&gt;&lt;br /&gt;     &lt;p&gt;&lt;strong&gt;父母和子女―――力求融洽者 &lt;/strong&gt;&lt;br /&gt;       总是试图与子女建立亲近、融洽的关系。期待能溶入子女的生活，并以自己的积极形象给他们以促进。他们对孩子是无微不至的也是永无止境的。&lt;/p&gt;&lt;br /&gt;     &lt;p&gt;&lt;strong&gt;理想主义者父母&amp;amp;&lt;/strong&gt;&lt;strong&gt;艺术创造者型子女： &lt;/strong&gt;&lt;br /&gt;       此类型的子女对思想交流不感兴趣，也很少替家里的其它成员着想，这些表现往往令他们的父母感到困扰，甚至失望。但是，如果他们发现子女一点儿都不想沿袭自己的人生观，而是一次次进行具体尝试的时候，便会放下自己的坚持，转而鼓励孩子努力自身的艺术修养和乐观主义精神。&lt;/p&gt;&lt;br /&gt;     &lt;p&gt;&lt;strong&gt;理想主义者型父母&amp;amp;&lt;/strong&gt;&lt;strong&gt;护卫者型子女： &lt;/strong&gt;&lt;br /&gt;       护卫者型的孩子性格特征形成较慢，而显得：不勇敢、不独立、适应性差、不渴望了解新事物。由于无法辨识孩子的本性，父母不断的在孩子身上寻找自己的影子，并强加于自己的价值观在孩子身上。但，随着孩子的成长，他们的兴趣会逐渐消失，因为他们明白了，孩子是个讲求实际的小人儿。而终止了自己的教育计划，并鼓励孩子成为他们自己最初想成为的那个样子。&lt;/p&gt;&lt;br /&gt;     &lt;p&gt;&lt;strong&gt;理想主义者型父母&amp;amp;&lt;/strong&gt;&lt;strong&gt;理想主义者型子女： &lt;/strong&gt;&lt;br /&gt;       父母找到了关心和培养子女独特自我形象的肥沃土壤，而子女也乐意彻底的迎合父母，并且都很容易指出对方的错误。只是，他们在彼此理想发生冲突时，几乎无法控制地同时迁怒于对方。&lt;/p&gt;&lt;br /&gt;     &lt;p&gt;&lt;strong&gt;理想主义者型父母&amp;amp;&lt;/strong&gt;&lt;strong&gt;理性者子女： &lt;/strong&gt;&lt;br /&gt;       这组关系能够树立牢固的亲情纽带关系，父母探索他们的潜能，号召他们不要封闭自己；而子女也确实渴望扩大技能积累。然而，也并非无可挑剔，父母有时候会对孩子的冷漠、镇定自主感到沮丧，虽然对理性者孩子来说很自然，但在他们的父母看来是很残忍的。理性者不可能改变自己的处世方式。父母不久便会明白，他们不应该干涉孩子，而应该赞美他们。&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='https://undancer.blogspot.com/feeds/8164523558329732110/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1102790865060223847/8164523558329732110' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/8164523558329732110'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/8164523558329732110'/><link rel='alternate' type='text/html' href='https://undancer.blogspot.com/2009/01/blog-post.html' title='凯尔西气质类型测试'/><author><name>undancer</name><uri>http://www.blogger.com/profile/05800974944226224562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1102790865060223847.post-5991245116610358361</id><published>2009-01-12T13:36:00.010+08:00</published><updated>2009-01-12T13:47:10.583+08:00</updated><title type='text'>基于RBAC的权限设计模型</title><content type='html'>权限分析文档 &lt;br /&gt;基于RBAC的权限设计模型： &lt;br /&gt;&lt;strong&gt;1        RBAC 介绍 &lt;/strong&gt;&lt;br /&gt;RBAC 模型作为目前最为广泛接受的权限模型。 &lt;br /&gt;NIST （The National Institute of Standards and Technology，美国国家标准与技术研究院）标准RBAC模型由4个部件模型组成，这4个部件模型分别是基本模型RBAC0（Core RBAC）、角色分级模型RBAC1（Hierarchal RBAC）、角色限制模型RBAC2（Constraint RBAC）和统一模型RBAC3（Combines RBAC）[1]。RBAC0模型如图1所示。 &lt;br /&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 96px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbCs3jdIHTjP2wDCDlua_zKZnL2L1r2lUlW0AG7WbnEzcISjiqeYW0VqzGl5qaMIPZgtHXTyqft915xUgZtquyJeGR-lU0H0yyMX0D7JuMYXbDeeahI7ykQEfRq5ERgMrCblb1UrNqK8Nk/s320/clip_image001.jpg&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5290277337949295634&quot; /&gt;&lt;br /&gt;图表 1 RBAC 0 模型 &lt;br /&gt;l          RBAC0 定义了能构成一个RBAC控制系统的最小的元素集合 &lt;br /&gt;在RBAC之中,包含用户users(USERS)、角色roles(ROLES)、目标objects(OBS)、操作operations(OPS)、许可权permissions(PRMS)五个基本数据元素，权限被赋予角色,而不是用户，当一个角色被指定给一个用户时，此用户就拥有了该角色所包含的权限。会话sessions是用户与激活的角色集合之间的映射。RBAC0与传统访问控制的差别在于增加一层间接性带来了灵活性，RBAC1、RBAC2、RBAC3都是先后在RBAC0上的扩展。 &lt;br /&gt;l          RBAC1 引入角色间的继承关系 &lt;br /&gt;角色间的继承关系可分为一般继承关系和受限继承关系。一般继承关系仅要求角色继承关系是一个绝对偏序关系，允许角色间的多继承。而受限继承关系则进一步要求角色继承关系是一个树结构。 &lt;br /&gt;l          RBAC2 模型中添加了责任分离关系 &lt;br /&gt;RBAC2 的约束规定了权限被赋予角色时,或角色被赋予用户时,以及当用户在某一时刻激活一个角色时所应遵循的强制性规则。责任分离包括静态责任分离和动态责任分离。约束与用户-角色-权限关系一起决定了RBAC2模型中用户的访问许可。 &lt;br /&gt;l          RBAC3 包含了RBAC1和RBAC2 &lt;br /&gt;既提供了角色间的继承关系，又提供了责任分离关系。 &lt;br /&gt;建立角色定义表。定出当前系统中角色。 &lt;br /&gt;因为有继承的问题，所以角色体现出的是一个树形结构。 &lt;br /&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 216px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmDLuhafc9cuAiZhh0UDlRS4or_yMSrPj3Lw0S7ickaeRszuacHN2jn_N4r_6DdkNtn9DBUhWpAkhphhyphenhyphenX7hwXdffSQGJtrx6Y7yzkslfhujChQvVCGiIvTyDKW6thnUR3BZ5QHVhAstul/s320/%E6%97%A0%E6%A0%87%E9%A2%98.bmp&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5290277937186630546&quot; /&gt;&lt;br /&gt;&lt;strong&gt;2        权限设计： &lt;/strong&gt;&lt;br /&gt; &lt;br /&gt;配置资源以及资源的操作 ： 这里资源可以定义为一个通用的资源模型。提供通用的资源统一接口。 &lt;br /&gt;数据库 ER 图： &lt;br /&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 186px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiC1EJJ2YxGC20WBSIuJH71hAM2HFLy3iKF7snZuAaGiiRvupe8mbWpGoOaS6vd6swb418ue-nqZOMyKGkt1c4cQ4fq1CKQT-nfmXog1mnjP8h2aJkOW1-HUrTUYS6K4DPVctyIfDAXEZNC/s320/clip_image002.gif&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5290278174153705282&quot; /&gt;&lt;br /&gt;关系图： &lt;br /&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 242px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjOtkFW4tL4n3dKH-ZrnGrs6hDDbRhYEDOXopSBaTXnxrs19HqIdLGoHKVX_AIQuJ6WjC4lU-rynTYCAGvIVAAC-SQRdUKw1LoCMfzDmE_PYMRJoh5H8alQgORtybCOA59RHJk8ZWpxu8qN/s320/clip_image003.gif&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5290278444892892338&quot; /&gt;&lt;br /&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 261px; height: 320px;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiInkKPIn345qOG3lcYRMirGK9U1UatlY5OlkZnT_Eg0WavgqrZJhsBGHphbmq4Fi7reHZQmpJsxWgpcOF9o0b399gqCeJHROm_WbAdjFCUqwS9ArQKJQNbHxM4hi-gaH3ZtJze83btosZh/s320/%E6%97%A0%E6%A0%87%E9%A2%98.bmp&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5290278823849951682&quot; /&gt;&lt;br /&gt;&lt;strong&gt;3        分析： &lt;/strong&gt;&lt;br /&gt; &lt;br /&gt;    根据以上的类关系图和ER图可以看出。整个权限可以抽象为五个对象组成。 &lt;br /&gt;OrgBean : 用于描述org模型。 &lt;br /&gt;Role ： 用于描述角色。 &lt;br /&gt;Permission ： 用于描述权限。 &lt;br /&gt;Resource ： 用于描述资源。 &lt;br /&gt;Operation ： 用于描述操作。 &lt;br /&gt; &lt;br /&gt;其中Permission中有Resource , Operation 的聚合，资源和操作组成权限。 &lt;br /&gt;Role 和 Permission 都有自包含。因为设计到权限的继承。 &lt;br /&gt;资源Resource 也可能出现一颗树形结构，那资源也要有自包含。 &lt;br /&gt; &lt;br /&gt;&lt;strong&gt;思想 : &lt;/strong&gt;&lt;br /&gt;权限系统的核心由以下三部分构成： 1. 创造权限， 2. 分配权限， 3. 使用权限，然后，系统各部分的主要参与者对照如下： 1. 创造权限 - Creator 创造， 2. 分配权限 - Administrator 分配， 3. 使用权限 - User ： &lt;br /&gt;1. Creator 创造 Privilege ， Creator 在设计和实现系统时会划分，一个子系统或称为模块，应该有哪些权限。这里完成的是 Privilege 与 Resource 的对象声明，并没有真正将 Privilege 与具体 Resource 实例联系在一起，形成 Operator 。 &lt;br /&gt;2. Administrator 指定 Privilege 与 Resource Instance 的关联 。在这一步， 权限真正与资源实例联系到了一起， 产生了 Operator （ Privilege Instance ）。 Administrator 利用 Operator 这个基本元素，来创造他理想中的权限模型。如，创建角色，创建用户组，给用户组分配用户，将用户组与角色关联等等 ... 这些操作都是由 Administrator 来完成的。 &lt;br /&gt;3. User 使用 Administrator 分配给的权限去使用各个子系统。 Administrator 是用户，在他的心目中有一个比较适合他管理和维护的权限模型。于是，程序员只要回答一个问题，就是什么权限可以访问什么资源，也就是前面说的 Operator 。程序员提供 Operator 就意味着给系统穿上了盔甲。 Administrator 就可以按照他的意愿来建立他所希望的权限框架 可以自行增加，删除，管理 Resource 和 Privilege 之间关系。可以自行设定用户 User 和角色 Role 的对应关系。 ( 如果将 Creator 看作是 Basic 的发明者， Administrator 就是 Basic 的使用者，他可以做一些脚本式的编程 ) Operator 是这个系统中最关键的部分，它是一个纽带，一个系在 Programmer ， Administrator ， User 之间的纽带。 &lt;br /&gt; &lt;br /&gt;&lt;strong&gt;4        权限API &lt;/strong&gt;&lt;br /&gt;   getPermissionByOrgGuid(String orgGuid ) &lt;br /&gt;      通过传入一个org的Guid ， 拿到当前这个org对象都具有那些访问权限。 &lt;br /&gt; getSourcePermissionByOrgGuid(String orgGuid , String resouceGuid) &lt;br /&gt;    通过传入一个org的Guid 和 一个资源的Guid ， 返回改Org对当前这个资源的访问权限。 &lt;br /&gt; &lt;br /&gt;getPermissionByResourceGuid(String resource) &lt;br /&gt;    通过传入一个资源的Guid ， 得到当前资源下都有那些权限定义。 &lt;br /&gt; &lt;br /&gt;havingHeritPermission(String orgGuid , String resouceGuid) : Boolean &lt;br /&gt;    传入一个orgGuid， 资源GUID ，查看改OrgGuid下对资源是否有向下继承的权限。这里继承是资源的继承。即对父栏目有权限，可以继承下去对父栏目下的子栏目同样有权限。 &lt;br /&gt; &lt;br /&gt;havingPermission(String orgGuid , String resourceGuid) : Boolean &lt;br /&gt;    判断某Org对某一资源是否用权限。 &lt;br /&gt; &lt;br /&gt;以上是粗粒度的权限API 。 以下为细粒度的权限： &lt;br /&gt; &lt;br /&gt;getOperationByPermission(String permissionGuid) &lt;br /&gt;    通过permission 的Guid 得到该permission 的所有有效操作。 &lt;br /&gt; &lt;br /&gt;getOperationByGuid(String permissionGuid , String resourceGuid) &lt;br /&gt;    通过permision的Guid ， 资源的Guid 得到该资源下所有的有效操作。 &lt;br /&gt; &lt;br /&gt;screeningOpreationByGuid (String permissionGuid , String resourceGuid , String orgGuid) &lt;br /&gt;    通过permission ， resource ， org的Guid 得到改Org对这一资源的有效操作。 &lt;br /&gt; &lt;br /&gt;hasOperation(String operationGuid) : boolean &lt;br /&gt;    通过传入的operationGuid 返回是否具有操作权限。 &lt;br /&gt; &lt;br /&gt;&lt;strong&gt;5        权限的实现： &lt;/strong&gt;&lt;br /&gt;1 ．表单式认证，这是常用的，但用户到达一个不被授权访问的资源时， Web 容器就发 &lt;br /&gt;出一个 html 页面，要求输入用户名和密码。 &lt;br /&gt;2 ．用 Filter 防止用户访问一些未被授权的资源， Filter 会截取所有 Request/Response ， &lt;br /&gt;然后放置一个验证通过的标识在用户的 Session 中，然后 Filter 每次依靠这个标识来决定是否放行 Response 。 &lt;br /&gt;这个模式分为： &lt;br /&gt;Gatekeeper ：采取 Filter 或统一 Servlet 的方式。 &lt;br /&gt;Authenticator ： 在 Web 中使用 JAAS 自己来实现。 &lt;br /&gt; &lt;br /&gt;Filter 拦截只是拦截该用户是否有访问这个页面，或这一资源的权限。真正做到显示后拦截是在应用程序内部去做。 &lt;br /&gt; &lt;br /&gt;做显示拦截提供API ， 标签这两种方式。</content><link rel='replies' type='application/atom+xml' href='https://undancer.blogspot.com/feeds/5991245116610358361/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1102790865060223847/5991245116610358361' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/5991245116610358361'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/5991245116610358361'/><link rel='alternate' type='text/html' href='https://undancer.blogspot.com/2009/01/rbac-1-rbac-rbac-nist-national.html' title='基于RBAC的权限设计模型'/><author><name>undancer</name><uri>http://www.blogger.com/profile/05800974944226224562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbCs3jdIHTjP2wDCDlua_zKZnL2L1r2lUlW0AG7WbnEzcISjiqeYW0VqzGl5qaMIPZgtHXTyqft915xUgZtquyJeGR-lU0H0yyMX0D7JuMYXbDeeahI7ykQEfRq5ERgMrCblb1UrNqK8Nk/s72-c/clip_image001.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1102790865060223847.post-3293337126269386690</id><published>2008-12-22T02:02:00.001+08:00</published><updated>2008-12-22T02:04:16.961+08:00</updated><title type='text'>成年人必看的故事 教你学会做人</title><content type='html'>1、 宽容&lt;br /&gt;一只小猪、一只绵羊和一头乳牛，被关在同一个畜栏里。有一次，牧人捉住小猪，牠大声号叫，猛烈地抗拒。绵羊和乳牛讨厌牠的号叫，便说：「他常常捉我们，我们并不大呼小叫。小猪听了回答道：「捉你们和捉我完全是两回事，他捉你们，只是要你们的毛和乳汁，但是捉住我，却是要我的命呢!&lt;br /&gt;立场不同、所处环境不同的人，很难了解对方的感受；因此对别人的失意、挫折、伤痛，不宜幸灾乐祸，而应要有关怀、了解的心情。要有宽容的心&lt;br /&gt;2、 靠自己&lt;br /&gt;小蜗牛问妈妈：为什么我们从生下来，就要背负这个又硬又重的壳呢？&lt;br /&gt;妈妈：因为我们的身体没有骨骼的支撑，只能爬，又爬不快。所以要这个壳的保护！&lt;br /&gt;小蜗牛：毛虫姊姊没有骨头，也爬不快，为什么她却不用背这个又硬又重的壳呢？&lt;br /&gt;妈妈：因为毛虫姊姊能变成蝴蝶，天空会保护她啊。&lt;br /&gt;小蜗牛：可是蚯蚓弟弟也没骨头爬不快，也不会变成蝴蝶他什么不背这个又硬又重的壳呢？&lt;br /&gt;妈妈：因为蚯蚓弟弟会钻土, 大地会保护他啊。&lt;br /&gt;小蜗牛哭了起来：我们好可怜，天空不保护，大地也不保护。&lt;br /&gt;蜗牛妈妈安慰他：「所以我们有壳啊！」&lt;br /&gt;我们不靠天，也不靠地，我们靠自己。&lt;br /&gt;3、 鲨鱼与鱼&lt;br /&gt;曾有人做过实验，将一只最凶猛的鲨鱼和一群热带鱼放在同一个池子，然后用强化玻璃隔开，最初，鲨鱼每天不断冲撞那块看不到的玻璃，耐何这只是徒劳，它始终不能过到对面去，而实验人员每天都有放一些鲫鱼在池子里，所以鲨鱼也没缺少猎物，只是它仍想到对面去，想尝试那美丽的滋味，每天仍是不断的冲撞那块玻璃，它试了每个角落，每次都是用尽全力，但每次也总是弄的伤痕累累，有好几次都浑身破裂出血，持续了好一些日子，每当玻璃一出现裂痕，实验人员马上加上一块更厚的玻璃。&lt;br /&gt;后来，鲨鱼不再冲撞那块玻璃了，对那些斑斓的热带鱼也不再在意，好像他们只是墙上会动的壁画，它开始等着每天固定会出现的鲫鱼，然后用他敏捷的本能进行狩猎，好像回到海中不可一世的凶狠霸气，但这一切只不过是假像罢了，实验到了最后的阶段，实验人员将玻璃取走，但鲨鱼却没有反应，每天仍是在固定的区域游着它不但对那些热带鱼视若无睹，甚至于当那些鲫鱼逃到那边去，他就立刻放弃追逐，说什么也不愿再过去，实验结束了，实验人员讥笑它是海里最懦弱的鱼。&lt;br /&gt;可是失恋过的人都知道为什么，它怕痛。&lt;br /&gt;4、 神迹&lt;br /&gt;法国一个偏僻的小镇，据传有一个特别灵验的水泉，常会出现神迹，可以医治各种疾病。有一天，一个拄着拐杖，少了一条腿的退伍军人，一跛一跛的走过镇上的马路，旁边的镇民带着同情的回吻说：「可怜的家伙，难道他要向上帝祈求再有一条腿吗??」这一句话被退伍的军人听到了，他转过身对他们说：「我不是要向上帝祈求有一条新的腿，而是要祈求祂帮助我，叫我没有一条腿后，也知道如何过日子。」&lt;br /&gt;试想：学习为所失去的感恩，也接纳失去的事实，不管人生的得与失，总是要让自已的生命充满了亮丽与光彩，不再为过去掉泪，努力的活出自己的生命&lt;br /&gt;5、 钓竿&lt;br /&gt;有个老人在河边钓鱼，一个小孩走过去看他钓鱼，老人技巧纯熟，所以没多久就钓上了满篓的鱼，老人见小孩很可爱，要把整篓的鱼送给他，小孩摇摇头，老人惊异的问道：「你为何不要？」小孩回答：「我想要你手中的钓竿。」老人问：「你要钓竿做什么？」小孩说：「这篓鱼没多久就吃完了，要是我有钓竿，我就可以自己钓，一辈子也吃不完。」&lt;br /&gt;我想你一定会说：好聪明的小孩。错了，他如果只要钓竿，那他一条鱼也吃不到。因为，他不懂钓鱼的技巧，光有鱼竿是没用的，因为钓鱼重要的不在“钓竿”，而在“钓技”。&lt;br /&gt;有太多人认为自己拥有了人生道上的钓竿，再也无惧于路上的风雨，如此，难免会跌倒于泥泞地上。就如小孩看老人，以为只要有钓竿就有吃不完的鱼，像职员看老板，以为只要坐在办公室，就有滚进的财源。&lt;br /&gt;6、诚信&lt;br /&gt;我的帖子是好不容易搞到的，历经千辛万苦。请看完的同志珍惜楼主的劳动成果帮忙顶一下，只要轻轻的顶一下不会浪费你超过3秒钟时间的！做人要有诚信，要厚道，同时也为了让更多人能看到此帖，从中学到或感悟到些什么就达到我的目的了。我在此不胜感激、涕零！&lt;br /&gt;做人10条！&lt;br /&gt;曾经一位新东方的“高人”对我说“做事先做人，如果人都做没了还用做什么事”？细细咀嚼这句话越来越觉得有内涵。也是从那一天开始，我就一直在内心深处去自问自己做人的原则和道德底线是什么？在那之前我从来没有思考过这个问题（后来才发现生活中思考这个问题的太少了，乃至于几乎没有），但是毫无疑问对于所有想踏踏实实做事的人而言，必须让自己明确自己的做人的方式。经过长时间的思考和自己的生活磨练，直到今天我对我做人的原则和方针可以精确的细化了，大概有如下10条：&lt;br /&gt;1、对于父母，要“孝”；那么何谓“孝”？可以肯定，绝大部分有良知的人都想对父母尽孝，可是尽孝的方法是什么？这个可能每个人的家庭情况是不一样的，不能一概而论，但是对于我们这些为人子女者而言必须去思考自己的尽孝的方式，不能仅仅停留在思想层面，一定要落实到行动中去；最为关键的是尽孝要乘早；&lt;br /&gt;2、对于亲人，要宽容；家家有一本难念的经，锅碗瓢盆放在一起哪里能不磕磕碰碰呢？亲人之间难免会有点相互不理解的时候，一定要学会有一颗宽容的心，去包容别人的缺点，去多想他们对我们的好，只有这样才能亲人之间永远没有隔阂，一家人之间产生了矛盾而不去相互宽容，那么这个家也就到头了；&lt;br /&gt;3、对于朋友，要义气；好兄弟，讲义气。现在是商业化的时代，人的诚信在哪里？一个人的身边的朋友如果都不信任你的诚信，那么你这个在这个时代是不会被信任的，同样在商业时代你也就寸步难行；&lt;br /&gt;4、对于妻子，要疼爱；离家弃子的男人我见过，不过好象没有一个能善终的，换句话讲，我觉得对于一个男人而言要么不结婚，结婚了是万万不能离婚的，否则肯定得倒大霉&lt;br /&gt;5、对于老师，要感激；现在的青年人对于自己的恩师好象越来越不那么的感激了，我不知道别人怎么做的，反正我对于自己的恩师一定是感激终生&lt;br /&gt;6、对于同事，要不拘小节；每天在一个办公室里，对于同事的小缺点一定要学会“糊涂”，不能太过计较个人的利益得失，和气生财！当然遇到没有职业道德的人的话，也一定要奋起反击；&lt;br /&gt;7、对于领导，要敬畏；和领导称兄道弟没有问题，但是永远不能忘记领导就是领导，在尊敬的同时一定要保持一定的空间和距离，这样才能便于领导对整个团队和全局进行管理和分配；&lt;br /&gt;8、对于属下，要同甘苦；对于一个团队的领导者而言，他的权威绝对不是来自于更高的行政长官的任命，而是来自于自己的身体力行，无论在哪个岗位或者在哪个地方，我们都要身先士卒的冲锋陷阵，把危险和困难留给自己，把快乐和实惠留给跟着我们的打拼的兄弟姐妹；&lt;br /&gt;9、对于弱者，要同情；每次看见乞丐，只要身上有零钱，我基本都会给钱，那是因为我并不知道这个乞丐到底是不是假的，当我们无法辨别他的真伪时，宁可多给一千决不少给一块；当一个人已经放下他的尊严去乞讨时，本身就已经付出了人格的代价，我相信任何人的人格值得您掏出您的五毛钱；&lt;br /&gt;10、对于强者，要“学而不惧”；我们一定要学习身边的强者的优点，但是我们绝对不能惧怕这些强者，因为任何一个强者一定是从弱小成长起来的，不要因为别人的强大就泯灭你茁壮成长的信念；&lt;br /&gt;这里的10条仅仅是在处理与生命中一些人的关系时的方法，每个人有他自己的做人方式，所以不要苟同，做好自己就是最好的。但是有一点大家一定是一样的，那就是，所有的人必须去思考你自己的做人的底线在哪里？必须把它们清晰化。&lt;br /&gt;给崛起中的80后的五句话&lt;br /&gt;1、“天道酬勤”：富裕的时代造就了80后史无前例的懒惰的恶习，这样的恶习是毁灭这个时代本应属于80后的辉煌和荣誉的根本原因！&lt;br /&gt;2、“归真”：民族经济崛起的同时带来了80后纯真的灭失，这个世界上我们可以失去一切，但不能失去“真自我”，否则我们会永远走不出自己为自己设下的迷宫！&lt;br /&gt;3、谦慎：独生子女的特性就是“惟我独尊”，80后的主流思潮是“老子天下第一”，其实当你有一天历经了磨难，你一定会明白“人外有人，天外有天”的深刻内涵，所以80后的人们要时时铭记“谦慎”，不然在世界的任何角落都会撞的头破血流！&lt;br /&gt;4、淡泊明志：当一个时代已经开始用物质的繁华和匮乏来衡量一个人的价值时，这是时代的悲哀。正因如此，80后的人们要时刻铭记自己的梦想，坚持梦想，放下过强的物质苛求，当有一天你站在北京八宝山中央闭目聆听时，你会明白生命的真谛来自你心灵深处的梦想的实现！&lt;br /&gt;5、“自强不息，厚德载物”：自强是一个人实现自我价值的唯一途径，但是在自强的路上，我们会被世俗侵袭，所以我们要把自己的胸怀变的更为宽广，只有厚德才能载物。80后的每一个人的胸襟决定了每一个人的社会价值以及自我价值的实现，80后整个时代的人们的胸襟决定了80后这个时代在中华文明发展历史上的地位和作用！&lt;br /&gt;1、建筑师&lt;br /&gt;一位夫人打电话给建筑师，说每当火车经过时，她的睡床就会摇动。&lt;br /&gt;“这简直是无稽之谈１建筑师回答说，“我来看看。”&lt;br /&gt;建筑师到达后，夫人建议他躺在床上，体会一下火车经过时的感觉。&lt;br /&gt;建筑师刚上床躺下，夫人的丈夫就回来了。他见此情形，便厉声喝问：“你躺在我妻子的床上干什么？”&lt;br /&gt;建筑师战战兢兢地回答：“我说是在等火车，你会相信吗？”&lt;br /&gt;【顿悟】&lt;br /&gt;有些话是真的，却听上去很假；有些话是假的，却令人无庸置疑。&lt;br /&gt;２、引诱&lt;br /&gt;英国绅士与法国女人同乘一个包厢，女人想引诱这个英国人，她脱衣躺下后就抱怨身上发冷。先生把自己的被子给了她，她还是不停地说冷。&lt;br /&gt;“我还能怎么帮助你呢？”先生沮丧地问道。&lt;br /&gt;“我小时候妈妈总是用自己的身体给我取暖。”&lt;br /&gt;“小姐，这我就爱莫能助了。我总不能跳下火车去找你的妈妈吧？”&lt;br /&gt;【顿悟】&lt;br /&gt;善解风情的男人是好男人，不解风情的男人更是好男人。&lt;br /&gt;3、调羹&lt;br /&gt;麦克走进餐馆，点了一份汤，服务员马上给他端了上来。&lt;br /&gt;服务员刚走开，麦克就嚷嚷起来：“对不起，这汤我没法喝。”&lt;br /&gt;服务员重新给他上了一个汤，他还是说：“对不起，这汤我没法喝。”&lt;br /&gt;服务员只好叫来经理。&lt;br /&gt;经理毕恭毕敬地朝麦克点点头，说：“先生，这道菜是本店最拿手的，深受顾客欢迎，难道您……”&lt;br /&gt;“我是说，调羹在哪里呢？”&lt;br /&gt;【顿悟】&lt;br /&gt;有错就改，当然是件好事。但我们常常却改掉正确的，留下错误的，结果是错上加错。&lt;br /&gt;4、穿错&lt;br /&gt;饭厅内，一个异常谦恭的人胆怯地碰了碰另一个顾客，那人正在穿一件大衣。&lt;br /&gt;“对不起，请问您是不是皮埃尔先生？”&lt;br /&gt;“不，我不是。”那人回答。&lt;br /&gt;“啊，”他舒了一口气，“那我没弄错，我就是他，您穿了他的大衣。”&lt;br /&gt;【顿悟】&lt;br /&gt;要做到理直气壮，并不是件容易的事情。理直的人，往往低声下气；而理歪的人，却是气壮如牛。&lt;br /&gt;5、回电&lt;br /&gt;一个苏格兰人去伦敦，想顺便探望一位老朋友，但却忘了他的住址，于是给家父发了一份电报：“您知道托马的住址吗？速告１&lt;br /&gt;当天，他就收到一份加急回电：“知道。”&lt;br /&gt;【顿悟】&lt;br /&gt;当我们终于找到最正确的答案时，却发现它是最无用的。&lt;br /&gt;6、伤心故事&lt;br /&gt;有三个人到纽约度假。他们在一座高层宾馆的第45层订了一个套房。&lt;br /&gt;一天晚上，大楼电梯出现故障，服务员安排他们在大厅过夜。&lt;br /&gt;他们商量后，决定徒步走回房间，并约定轮流说笑话、唱歌和讲故事，以减轻登楼的劳累。&lt;br /&gt;笑话讲了，歌也唱了，好不容易爬到第34层，大家都感觉精疲力竭。&lt;br /&gt;“好吧，彼德，你来讲个幽默故事吧。”&lt;br /&gt;彼德说：“故事不长，却令人伤心至极：我把房间的钥匙忘在大厅了。”&lt;br /&gt;【顿悟】&lt;br /&gt;我们痛苦，所以幽默；我们幽默，所以快乐。&lt;br /&gt;7、卖书&lt;br /&gt;一个很有名的作家要来书店参观。书店老板受宠若惊，连忙把所有的书撤下，全部换上作家的书。作家来到书店后，心里非常高兴，问道：“贵店只售本人的书吗？”&lt;br /&gt;“当然不是。”书店老板回答，“别的书销路很好，都卖完了。”&lt;br /&gt;【顿悟】&lt;br /&gt;“拍马屁”是个奇怪的词：你象是在奉承他，又象是在侮辱他。&lt;br /&gt;8、帮忙&lt;br /&gt;在邮局大厅内，一位老太太走到一个中年人跟前，客气地说：“先生，请帮我在明信片上写上地址好吗？”&lt;br /&gt;“当然可以。”中年人按老人的要求做了。&lt;br /&gt;老太太又说：“再帮我写上一小段话，好吗？谢谢！”&lt;br /&gt;“好吧。”中年人照老太太的话写好后，微笑着问道：“还有什么要帮忙的吗？”&lt;br /&gt;“嗯，还有一件小事。”老太太看着明信片说，“帮我在下面再加一句：字迹潦草，敬请原谅。”&lt;br /&gt;【顿悟】&lt;br /&gt;你若不肯帮忙，人家会恨你一个星期；如果帮得不够完美，还不如……</content><link rel='replies' type='application/atom+xml' href='https://undancer.blogspot.com/feeds/3293337126269386690/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1102790865060223847/3293337126269386690' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/3293337126269386690'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/3293337126269386690'/><link rel='alternate' type='text/html' href='https://undancer.blogspot.com/2008/12/blog-post.html' title='成年人必看的故事 教你学会做人'/><author><name>undancer</name><uri>http://www.blogger.com/profile/05800974944226224562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1102790865060223847.post-2695581203101588336</id><published>2008-11-06T19:44:00.001+08:00</published><updated>2008-11-06T19:50:05.036+08:00</updated><title type='text'>使用maven自动创建数据库,导入导出数据</title><content type='html'>使用maven自动创建数据库,导入导出数据需要用到两个插件hibernate3-maven-plugin,dbunit-maven-plugin&lt;br /&gt;&lt;br /&gt;hibernate3-maven-plugin,有7大功能,(这里我们只使用hbm2ddl,自动生成数据库)&lt;br /&gt;The Maven Hibernate3 Plugin has seven goals.&lt;br /&gt;&lt;a href=&quot;http://mojo.codehaus.org/maven-hibernate3/hibernate3-maven-plugin/hbm2cfgxml-mojo.html&quot;&gt;hibernate3:hbm2cfgxml&lt;/a&gt;: Generates hibernate.cfg.xml&lt;br /&gt;&lt;a href=&quot;http://mojo.codehaus.org/maven-hibernate3/hibernate3-maven-plugin/hbm2ddl-mojo.html&quot;&gt;hibernate3:hbm2ddl&lt;/a&gt;: Generates database schema.&lt;br /&gt;&lt;a href=&quot;http://mojo.codehaus.org/maven-hibernate3/hibernate3-maven-plugin/hbm2doc=mojo.html&quot;&gt;hibernate3:hbm2doc&lt;/a&gt;: Generates HTML documentation for the database schema.&lt;br /&gt;&lt;a href=&quot;http://mojo.codehaus.org/maven-hibernate3/hibernate3-maven-plugin/hbm2hbmxml-mojo.html&quot;&gt;hibernate3:hbm2hbmxml&lt;/a&gt;: Generates a set of hbm.xml files&lt;br /&gt;&lt;a href=&quot;http://mojo.codehaus.org/maven-hibernate3/hibernate3-maven-plugin/hbm2java-mojo.html&quot;&gt;hibernate3:hbm2java&lt;/a&gt;: Generates Java classes from set of *.hbm.xml files&lt;br /&gt;&lt;a href=&quot;http://mojo.codehaus.org/maven-hibernate3/hibernate3-maven-plugin/schema-export-mojo.html&quot;&gt;hibernate3:schema-export&lt;/a&gt;: Creates SQL DDL file and generates the database schema from set of *.hbm.xml files&lt;br /&gt;&lt;a href=&quot;http://mojo.codehaus.org/maven-hibernate3/hibernate3-maven-plugin/schema-update-mojo.html&quot;&gt;hibernate3:schema-update&lt;/a&gt;: Updates the database schema based on the set of *.hbm.xml files&lt;br /&gt;dbunit-maven-plugin,可以实现数据库中数据的导入导出&lt;br /&gt;&lt;a href=&quot;http://mojo.codehaus.org/dbunit-maven-plugin/operation-mojo.html&quot;&gt;dbunit:operation&lt;/a&gt;: Execute a database operation using an external dataset file.&lt;br /&gt;&lt;a href=&quot;http://mojo.codehaus.org/dbunit-maven-plugin/export-mojo.html&quot;&gt;dbunit:export&lt;/a&gt;: Export database tables into a dataset file.&lt;br /&gt;&lt;a href=&quot;http://mojo.codehaus.org/dbunit-maven-plugin/compare-mojo.html&quot;&gt;dbunit:compare&lt;/a&gt;: Compare a dataset with database.&lt;br /&gt;&lt;br /&gt;具体配置,(MYSQL为例)&lt;br /&gt;在pom.xml中添加下面的代码&lt;br /&gt;&lt;build&gt;&lt;br /&gt;  &lt;plugins&gt;&lt;br /&gt;&lt;br /&gt;     &lt;plugin&gt;        &lt;groupid&gt;org.codehaus.mojo&lt;/groupid&gt;        &lt;artifactid&gt;hibernate3-maven-plugin&lt;/artifactid&gt;        &lt;version&gt;2.0-alpha-1&lt;/version&gt;        &lt;dependencies&gt;           &lt;dependency&gt;             &lt;groupid&gt;mysql&lt;/groupid&gt;             &lt;artifactid&gt;mysql-connector-java&lt;/artifactid&gt;             &lt;version&gt;5.0.4&lt;/version&gt;          &lt;/dependency&gt;        &lt;/dependencies&gt;        &lt;configuration&gt;          &lt;components&gt;            &lt;component&gt;              &lt;name&gt;hbm2ddl&lt;/name&gt;              &lt;implementation&gt;                 annotationconfiguration              &lt;/implementation&gt;            &lt;/component&gt;          &lt;/components&gt;          &lt;componentproperties&gt;            &lt;drop&gt;true&lt;/drop&gt;            &lt;jdk5&gt;true&lt;/jdk5&gt;            &lt;propertyfile&gt;               /src/main/resources/jdbc.properties            &lt;/propertyfile&gt;            &lt;configurationfile&gt;              /src/main/resources/hibernate.cfg.xml            &lt;/configurationfile&gt;          &lt;/componentproperties&gt;        &lt;/configuration&gt;        &lt;executions&gt;          &lt;execution&gt;            &lt;phase&gt;process-test-resources&lt;/phase&gt;            &lt;goals&gt;               &lt;goal&gt;hbm2ddl&lt;/goal&gt;            &lt;/goals&gt;         &lt;/execution&gt;       &lt;/executions&gt;   &lt;/plugin&gt;&lt;br /&gt;&lt;br /&gt;    &lt;plugin&gt;       &lt;groupid&gt;org.codehaus.mojo&lt;/groupid&gt;       &lt;artifactid&gt;dbunit-maven-plugin&lt;/artifactid&gt;       &lt;dependencies&gt;          &lt;dependency&gt;            &lt;groupid&gt;mysql&lt;/groupid&gt;            &lt;artifactid&gt;mysql-connector-java&lt;/artifactid&gt;            &lt;version&gt;5.0.4&lt;/version&gt;          &lt;/dependency&gt;        &lt;/dependencies&gt;        &lt;configuration&gt;          &lt;datatypefactoryname&gt;              org.dbunit.dataset.datatype.DefaultDataTypeFactory          &lt;/datatypefactoryname&gt;          &lt;driver&gt;com.mysql.jdbc.Driver&lt;/driver&gt;          &lt;url&gt;             jdbc:mysql://localhost/projectStencil?createDatabaseIfNotExist=true&amp;amp;useUnicode=true&amp;amp;characterEncoding=utf-8&amp;amp;sessionVariables=FOREIGN_KEY_CHECKS=0         &lt;/url&gt;         &lt;username&gt;root&lt;/username&gt;         &lt;password&gt;&lt;/password&gt;         &lt;src&gt;src/test/resources/sample-data.xml&lt;/src&gt;         &lt;type&gt;CLEAN_INSERT&lt;/type&gt;       &lt;/configuration&gt;       &lt;executions&gt;          &lt;execution&gt;             &lt;id&gt;test-compile&lt;/id&gt;             &lt;phase&gt;test-compile&lt;/phase&gt;             &lt;goals&gt;               &lt;goal&gt;operation&lt;/goal&gt;             &lt;/goals&gt;          &lt;/execution&gt;          &lt;execution&gt;             &lt;id&gt;test&lt;/id&gt;             &lt;phase&gt;test&lt;/phase&gt;             &lt;goals&gt;                &lt;goal&gt;operation&lt;/goal&gt;            &lt;/goals&gt;          &lt;/execution&gt;       &lt;/executions&gt;   &lt;/plugin&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;/plugins&gt;&lt;br /&gt;&lt;/build&gt;&lt;br /&gt;&lt;br /&gt;其中jdbc.properties 内容为&lt;br /&gt;hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialecthibernate.connection.username=roothibernate.connection.password=hibernate.connection.url=jdbc:mysql://localhost/projectStencil?createDatabaseIfNotExist=true&amp;amp;useUnicode=true&amp;amp;characterEncoding=utf-8hibernate.connection.driver_class=com.mysql.jdbc.Driver&lt;br /&gt;&lt;br /&gt;hibernate.cfg.xml 举例如下&lt;br /&gt;&lt;hibernate-configuration&gt; &lt;session-factory&gt;       &lt;mapping class=&quot;com...dao.model.User&quot;&gt;&lt;br /&gt;        ...&lt;br /&gt;  &lt;/session-factory&gt;&lt;/hibernate-configuration&gt;&lt;br /&gt;&lt;br /&gt;sample-data.xml 为要导入数据库的数据&lt;br /&gt;可以使用 mvn dbunit:export -Ddest=sample-data.xml 将数据库的数据导出来</content><link rel='replies' type='application/atom+xml' href='https://undancer.blogspot.com/feeds/2695581203101588336/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1102790865060223847/2695581203101588336' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/2695581203101588336'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/2695581203101588336'/><link rel='alternate' type='text/html' href='https://undancer.blogspot.com/2008/11/maven.html' title='使用maven自动创建数据库,导入导出数据'/><author><name>undancer</name><uri>http://www.blogger.com/profile/05800974944226224562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1102790865060223847.post-1020701734944048285</id><published>2008-08-22T16:55:00.001+08:00</published><updated>2008-08-22T17:05:04.966+08:00</updated><title type='text'>软件架构师</title><content type='html'>软件架构师是软件行业中一种新兴职业，工作职责是在一个软件项目开发过程中，将客户的需求转换为规范的开发计划及文本，并制定这个项目的总体架构，指导整个开发团队完成这个计划。架构师的主要任务不是从事具体的软件程序的编写，而是从事更高层次的开发构架工作。他必须对开发技术非常了解，并且需要有良好的组织管理能力。可以这样说，一个架构师工作的好坏决定了整个软件开发项目的成败。&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      &lt;br /&gt;软件架构师实际上就是软件的总体设计师。首席设计师就是总设计师，打个通俗的比方：邓小平是中国改革开放的总设计师，我们用现在的说法可以讲，邓小平是中国改革开放的首席架构师。架构师的形成一定是在实践中积累起来的，而并非上了几次培训班，读了几本书就可以成功的，架构师是在工程实践中培养出来的！&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     &lt;br /&gt;架构师也并非是万能的。架构师是客户需求和开发者之间的桥梁。在软件行业中，一般提到的架构师是技术架构师，而忽略了领域架构师或者讲是领域工程师的概念。一个好的领域专家一定是业务领域的架构师，他能够给出某一个业务领域的架构，我们可以称为业务架构，只有技术架构和业务架构紧密结合才有可能真正创造出一个好的系统！&lt;br /&gt;      架构师，首先让我想起的是高楼大厦的设计人员，通常一座大厦在建之前,都先由设计师将蓝图描绘出来，包括其形状、结构、尺寸、材料等等，然后建筑工程师带领工人们按照蓝图将大厦一层一层地建起来。&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     &lt;br /&gt;近年来，软件领域也渐渐地流行起架构师的角色，特别是对一些大型软件产品或项目的开发，这一角色显得很关键，因为缺乏好的软件架构师而导致项目失败的例子不胜枚举，一个没有经验和能力的架构师也会使项目失败的速度加快。&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;软件架构师的重要作用&lt;br /&gt;      软件架构师在整个软件开发过程中都起着重要的作用，并随着开发进程的推进而其职责或关注点不断地变化，在需求阶段，软件架构师主要负责理解和管理非功能性系统需求，比如软件的可维护性、性能、复用性、可靠性、有效性和可测试性等等，此外，架构师还要经常审查和客户及市场人员所提出的需求，确认开发团队所提出的设计；在需求越来越明确后，架构师的关注点开始转移到组织开发团队成员和开发过程定义上；在软件设计阶段，架构师负责对整个软件体系结构、关键构件、接口和开发政策的设计；在编码阶段，架构师则成为详细设计者和代码编写者的顾问，并且经常性地要举行一些技术研讨会、技术培训班等；随着软件开始测试、集成和交付，集成和测试支持将成为软件架构师的工作重点；在软件维护开始时，软件架构师就开始为下一版本的产品是否应该增加新的功能模块进行决策。&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;如何成为优秀的软件架构师&lt;br /&gt;      显而易见，在软件开发过程中，一个优秀软件架构师的重要性是不应低估的。那么如何成为优秀的软件架构师呢？&lt;br /&gt;      首先必须具有丰富的软件设计与开发经验，这有助于理解并解释所进行的设计是如何映射到实现中去。&lt;br /&gt;      其次要具有领导能力与团队协作技能，软件架构师必须是一个得到承认的技术领导，能在关键时候对技术的选择作出及时、有效的决定。&lt;br /&gt;      第三是具有很强的沟通能力，呵呵，其时这一点好象什么鬼角色都最好具备，软件架构师需要与各路人马经常打交道，客户、市场人员、开发人员、测试人员、项目经理、网络管理员、数据库工程师等等，而且在很多角色之间还要起沟通者的作用。在技术能力方面，软件架构师最重要也是最需求掌握的知识是构件通信机制方面的知识，比如远程过程调用、JAVARMI、CORBA、COM/DCOM、各种标准的通信协议、网络服务、面对对象数据库、关系数据库等等，另外，架构师应时刻注意新软件设计和开发方面的发展情况，并不断探索更有效的新方法。开发语言、设计模式和开发平台不断很快地升级，软件架构师需要吸收这些新技术新知识，并将它们用于软件系统开发工作中。当然，行业的业务知识对软件架构师也是很重要的，有助于设计&lt;/p&gt;&lt;br /&gt;      出一个满足客户需求的体系结构，优秀的软件架构师常常因为要尽快获得对行业业务的理解而必须快速学习并且进行敏锐的观察。&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     &lt;br /&gt;上面的描述是枯燥乏味的，但作为一个软件架构师，在整个软件系统的开发过程中是乐趣无穷的，因为这个角色很具有挑战性，有时需要左右逢源八面玲珑，有时又需要果断坚定不留情面。在国内，较少软件企业拥有独立的架构师，通常一个软件高手身兼数职，既是项目经理，又是软件架构师，还是软件开发者，有时还要客串一个测试人员，这对软件的开发周期和产品质量是不利的，有时一个人的观点立场是很片面的，而且繁重的工作、沉重的压力会影响一个人的情绪，情绪会影响决策，决策影响结果，所以值得我们三思而后行。&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;构架师自我培养过程&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     &lt;br /&gt;构架师不是通过理论学习可以搞出来的，不过不学习相关知识那肯定是不行的。总结构架师自我培养过程大致如下，仅供参考。&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     &lt;br /&gt;1、构架师胚胎（程序员）&lt;br /&gt;&lt;br /&gt;     &lt;br /&gt;学习的知识是语言基础、设计基础、通信基础等，应该在大学完成，内容包括java、c、c++、uml、RUP、XML、socket通信（通信协议）——学习搭建应用系统所必须的原材料。&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     &lt;br /&gt;2、构架师萌芽（高级程序员）&lt;br /&gt;&lt;br /&gt;     &lt;br /&gt;学习分布式系统、组建等内容，可以在大学或第一年工作时间接触，包括分布式系统原理、ejb、corba、com/com+、webservice（研究生可以研究网络计算机、高性能并发处理等内容）&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     &lt;br /&gt;3、构架师幼苗（设计师）&lt;br /&gt;&lt;br /&gt;     &lt;br /&gt;应该在掌握上述基础之上，结合实际项目经验，透彻领会应用设计模式，内容包括设计模式（c++版本、java版本）、ejb设计模式、J2EE构架、UDDI、软件设计模式等。在此期间，最好能够了解软件工程在实际项目中的应用以及小组开发、团队管理。&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     &lt;br /&gt;4、软件构架师的正是成型在于机遇、个人努力和天赋软件构架师其实是一种职位，但一个程序员在充分掌握软构架师所需的基本技能后，如何得到这样的机会、如何利用所掌握的技能进行应用的合理构架、如何不断的抽象和归纳自己的构架模式、如何深入行业成为能够胜任分析、构架为一体的精英人才这可不是每个人都能够遇上的馅饼……&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;软件构架师职场概况&lt;br /&gt;      如果您今天有幸同全球首富比尔·盖茨交换名片，您会注意到他的头衔是微软公司首席软件架构师。同样假如您得到中国首富丁磊的名片，您也会看到他的头衔是网易公司首席架构师。悄然间，架构师已经成为职场上最让人羡慕的职位。&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     &lt;br /&gt;在我国，随着软件业规模的不断扩大，软件人才结构性矛盾将更加突出。国家人事部门预计到2005年我国软件产业的规模将达到2500亿元，全国计算机应用专业人才的需求每年将增加百万人左右。其中，架构师这样的专业高级人才每年培养人数全国不过数百名，缺口非常之大，而其中尤其以Java架构师缺口最为明显。&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     &lt;br /&gt;众所周知，Java是当前最热门的软件开发语言，它具有跨平台、面向对象、强大的网络功能等特性。你不仅能在电脑上使用Java程序，还能在手机、PDA、家用电器上使用Java程序，甚至举世瞩目的火星车也全部采用Java技术。Java在不到10年时间内已经变成最流行的软件开发平台，最新的企业级Java 2.0版本（简称：J2EE）也成为企业应用系统上最受欢迎的开发标准。&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     &lt;br /&gt;事实上，全世界范围内的J2EE架构师都是紧缺的人才，只是中国更加明显而已。在英国，有经验的J2EE架构师，目前平均年薪已经飙涨到七万至十万英镑。全球著名的电子商务平台提供商SilverStream软件公司的技术服务总监Mark Ashton对J2EE人才的短缺深有感受，他表示许多求职者的履历表上都有把J2EE列进去，但是仔细查看或是面试之后就会发现大多数人只是听过J2EE，并没有真正用过这些技术。信息产业部电子信息产品管理司副司长丁文武近期也表示，目前我国Java人才还远远不够，至少短缺20万。特别是随着大量软件外包业务进入中国，许多外资或中资软件企业也开始面临着高级Java人才奇缺的问题，尤其是熟悉J2EE又能掌握一门相应外语的人才成为了众多大公司争抢的对象。&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     &lt;br /&gt;作为Java的发明者和Java开发标准的主要制定者——美国Sun公司对从事Java开发的技术人员提供了三级认证体系，即初级的程序员认证（SCJP）、中级的开发员认证（SCJD和SCWD）和高级的架构师认证（SCEA）。这也是软件行业中最权威的国际认证之一。目前国内已经有针对美国Sun公司认证体系的培训，但绝大多数主要针对初级的程序员认证，只有极少数专业培训机构能够提供三层完整培训。国家信息化教育示范基地——上海文华学院（www.wenhua.org）是上海仅有的一家拥有Java自上而下、由浅入深的完善的培训及认证体系的学院。作为Sun华东区最佳培训中心，上海文华学院的“对外J2EE国际软件工程师就业班”课程除了由浅入深，完整地教授整个J2EE体系外，还详尽地教授开发企业级应用软件所必须掌握的知识体系，如：操作系统、UML、数据库、项目管理、软件测试等。因此，即使你没有任何软件开发知识，也能完成这门课程的学习。课程采用项目教学，并培训计算机英语和第二外语。学员考试通过后，可以获得美国Sun公司的最高级别国际认证：Sun认证企业级Java 2架构师（SCEA），还推荐就业。学员入学前还可参加免费的“软件开发潜质测试”，评估自己是否适合开发软件。&lt;br /&gt;&lt;br /&gt;（部分摘自《东方生活报——才富周刊》）</content><link rel='replies' type='application/atom+xml' href='https://undancer.blogspot.com/feeds/1020701734944048285/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1102790865060223847/1020701734944048285' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/1020701734944048285'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/1020701734944048285'/><link rel='alternate' type='text/html' href='https://undancer.blogspot.com/2008/08/blog-post_22.html' title='软件架构师'/><author><name>undancer</name><uri>http://www.blogger.com/profile/05800974944226224562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1102790865060223847.post-2764189005775080646</id><published>2008-08-17T22:58:00.001+08:00</published><updated>2008-08-17T23:00:26.992+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="code"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="maven"/><title type='text'>Maven起步――教你开始使用Maven(图)</title><content type='html'>如果你已经有十次输入同样的Ant   targets来编译你的代码、jar或者war、生成javadocs，你一定会自问，是否有有一个重复性更少却能同样完成该工作的方法。Maven便提供了这样一种选择，将你的注意力从作业层转移到项目管理层。Maven项目已经能够知道如何构建和捆绑代码，运行测试，生成文档并宿主项目网页。&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;O&#39;Reilly&#39;s的新书Maven:A   Developer&#39;s Notebook帮你提升你的项目、使其尽快的运行起来，同时也提供了对Maven插件及其团队协作等高级特性的深度考察。在“Maven   Jump-Start” (656K PDF)的示范章节中，作者Vincent Massol和Timothy   M.O&#39;Brien向你展示了如何安装Maven，如何开始你初次的构建，研究如何使其与IDEs集成极其资源管等特性。&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;Vincent   Massol是Jakarta Catus   framework（框架）的创建者。其后他花费4年的时间在几个大项目（主要是J2EE）的架构技术上。他现在是Pivolis的创办人和CTO,这是一家专注于应用敏捷方法进行软件开发的公司。他现在居住在法国的首都City   of Light（巴黎）。&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;Timothy M. O&#39;Brien作为一个专业的歌手/程序员现正在芝加哥地区工作和生活。&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;center&gt;&lt;br /&gt;  &lt;img src=&quot;http://Java.chinaitlab.com/imgfiles/2005.8.27.10.54.47.19.1.jpg&quot; /&gt;&lt;br /&gt;&lt;/center&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;  让我们开始使用Maven。在本章结束时，你应该能够从头建立一个Maven的项目，使用Maven进行相关管理，创建基于某些感兴趣报告的简单的web站点。&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  &lt;strong&gt;安装Maven&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  开始本书以前，你有一些必备的安装工作。本书中的例子用Java1.4.2编写，Maven能够兼容Java1.4.2和Java1.5.0。本书中所写Maven的最新版本是在编写本书时发布的―Maven   1.0.2。除JDK和Maven1.0.2之外，你还需要连接到Internet，Maven将通过公网站点下载相关其需要的。那么，前进，安装Maven吧。&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  我该如何做？&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  从Apache   Software Foundation(ASF)下载Maven。进入http://maven.apache.org/从左侧的导航菜单中的Getting   Maven菜单选择下载。它将带你进入一个让你选择Windows   安装包、zip文件、tar&#39;d.bzip文件或者tar&#39;d.gzip文件。下载适合你平台的分类。&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  我该如何做？&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  从Apache   Software Foundation(ASF)下载Maven。进入http://maven.apache.org/从左侧的导航菜单中的Getting   Maven菜单选择下载。它将带你进入一个让你选择Windows   安装包、zip文件、tar&#39;d.bzip文件或者tar&#39;d.gzip文件。下载适合你平台的分类。&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  提示&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  某些Developer&#39;s   Notebook中涉及的插件未与Maven1.0.2绑定。请参考第6章并且附录A有安装Maven所需插件的全部列表以及详细说明。&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  在Microsoft   Windows平台，下载Windows安装包（maven-1.0.2.exe），跟随自动安装过程中的提示。在使用Maven Windows   安装器进行安装后，你应该定义一个用户环境变量，MAVEN_HOME，指向你本地的Maven安装。你此时需要进入控制面版→系统→高级选择环境变量按钮，添加%MAVEN_HOME%bin到你的PATH环境变量。进入命令提示行运行cmd.exe，如果Maven安装成功，你将能够看到命令行有下面的输出：&lt;br /&gt;&lt;br /&gt;  C:devmavenbookcode&amp;gt;maven   -v&lt;br /&gt;&lt;br /&gt;  __ __&lt;br /&gt;&lt;br /&gt;  | / |__ _Apache__ ___&lt;br /&gt;&lt;br /&gt;  | |/| / _` V / -_) &#39; ~ intelligent   projects ~&lt;br /&gt;&lt;br /&gt;  |_| |___,_|_/___|_||_| v.   1.0.2&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  如果你愿意安装Maven到一个除了C:Program FilesApache Software FoundationMaven   1.0.2的目录，你也可以下载Maven1.0.2.zip文件，解压缩到任何目录。设置MAVEN_HOME指   向到Maven解压缩的目录，并且添加%MAVEN_HOME%Bin到你的PATH环境变量。&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  在Unix平台，下载tar&#39;d.zip文件（Maven-1.0.2.tar.gz）并接压缩tar   xvzf   maven-1.0.2.tar.gz到你选择的目录。本试验假设你解压Maven到/usr/local/maven-1.0.2目录下。你此时需要设置两个环境变量，MAVEN_HOME和PATH。下面的命令为这两个变量设置适当的值：&lt;br /&gt;&lt;br /&gt;  [tobrien@mavenbook   tobrien]$ export MAVEN_HOME=/usr/local/maven-1.0.2&lt;br /&gt;&lt;br /&gt;  [tobrien@mavenbook   tobrien]$ export   PATH=$:$/bin&lt;br /&gt;&lt;br /&gt;  如果Maven被成功安装到你的机器，你能够看到与Windows系统同样的输出。恭喜！你已经成安装了Maven。&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  提示&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  有些人喜欢保存本地应用程序在Unix下的/opt目录或&lt;br /&gt;&lt;br /&gt;  Windows下的c:apps。你可以根据个人喜好安装Maven。&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  刚刚发生了什么？&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  你刚刚安装了Maven1.0.2并且配置了一些环境变量。是的！一旦你对MAVEN_HOME进行了有效的设置或是maven.bat或maven.sh已经存在，你已经能够完成Developer&#39;s   Notebook本次的实验。&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  关于......Maven 2?&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  是时机提及Maven   2（有时也被称为“m2”）。Maven 2完成了对Maven   1的重写。重写的首要目的是要提供了强大的Jave构建和包含API的项目，允许Maven被植入任何地方，尤其是高级别的产品如IDEs、质量工具、报告工具等这些。Maven   2构建生命周期的概念正式话，其比Maven更易扩展。&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  Maven 1和Maven   2有许多共同点，但它们还有几个主要的不同之处。在书中的各个部分我们尽可能提示你所希望了解的那些不同之处。更多关于Maven   2的信息，请转到http://maven.apache.org/下载Maven   2的体验版本，并加入Maven用户或开发者邮件列表。如果你听过Continuous   Integration，你可能也想看一看命名为Continuum的Maven子项目，地址在http://maven.apache.org/continuum。&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  &lt;strong&gt;开始一个新的项目&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  创建新项目的争论一部分在于有很大部分的工作努力被用到在“发展基础设施”上―自动构建、单元测试、文档、项目报告等。使用Maven你可以加速这个过程，生成项目的框架使其作为新应用的种子。&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  我该如何做？&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  Maven拥有一个应用程序生成插件（Genapp）你能通过其创建一个新项目。首先创建一个空的目录c:devmavenbookcodegenapptest-application这将成为应用程序生成后的处所。通过执行genapp这个目标来运行Genapp插件，选择默认的模版并且提供一些你的新项目的相关信息。&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  C:devmavenbookcodegenapptest-application&amp;gt;maven   genapp&lt;br /&gt;&lt;br /&gt;  __ __&lt;br /&gt;&lt;br /&gt;  | / |__ _Apache__ ___&lt;br /&gt;&lt;br /&gt;  | |/| / _` V / -_) &#39; ~   intelligent projects ~&lt;br /&gt;&lt;br /&gt;  |_| |___,_|_/___|_||_| v. 1.0.2&lt;br /&gt;&lt;br /&gt;  Attempting to   download commons-jelly-tags-interaction-20030211.143817.jar.4K downloadedEnter a   project template to use: [default][Enter]Please specify an id for your   application:&lt;br /&gt;&lt;br /&gt;  [app]test-applicationPlease specify a name for your   application: [Example Application]Test ApplicationPlease specify the package for   your application: [example.app]mdn.testappbuild:start:genapp:&lt;br /&gt;&lt;br /&gt;  [copy]   Copying 1 file to   C:devmavenbookcodegenapptest-applicationsrcjavamdntestapp[copy] Copying 3 files   to C:devmavenbookcodegenapptest-applicationsrctestmdntestapp[copy] Copying 1   file to C:devmavenbookcodegenapptest-application[copy] Copying 2 files to   C:devmavenbookcodegenapptest-applicationBUILD   SUCCESSFUL&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  本插件会要求用户一些输入，从这个输出内容你可以看到你使用了默认的（defalut）应用程序模板，并且你提供了新项目的应用程序ID、name，和包名。默认的（default）应用程序模板创建了一个单独的类，mdn.testapp.app，和一个静态main函数和两个JUnit测试。&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  Maven的应用程序生成插件生成了下面的目录和文件：&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  test-application/project.propertiesproject.xmlsrc/conf/app.propertiesjava/mdn/testapp/App.javatest/mdn/testapp/AbstractTestCase.javaAppTest.javaNaughtyTest.java&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  所有Maven项目有一个参考了项目对象模型（POM）的标准目录结构,   （as described   shortly）。如果你有一些现存的类你想添加到一个项目，添加它们到src/java，如果你有一些单元测试将它们添加到src/test。如果这些已有的类和单元测试依赖一些外部的苦，你将在随后的章节看到如何添加一个附属。xdos目录包含了格式为XDoc的项目文档。&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  提示&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  请注意Maven1.0.2装载的Genapp插件版本创建了非标准的布局。在Maven项目中src/java和src/test不再出现在固有的源代码和单元测试位置。取而代之的是你可以使用src/main/java和src/test/java.为了改变这些，修改你项目的xml文件，改变src/java的引用为src/main-/java，src/test的引用为src/test/java.更多的信息，请参见“Maven   Conventions”，地址在http://maven.apache.org/-reference/conventions.html.&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  project.xml是项目的描述符；它是一个内容为POM的XML文件。让我们看看这个project.xml的拷贝，其已经定义了这个项目：&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  &amp;lt;project&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;pomVersion&amp;gt;&lt;br /&gt;&lt;br /&gt;  3&amp;lt;/pomVersion&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;artifactId&amp;gt;test-application&lt;br /&gt;&lt;br /&gt;  &amp;lt;/artifactId&amp;gt;&amp;lt;name&amp;gt;Test   Application&lt;br /&gt;&lt;br /&gt;  &amp;lt;/name&amp;gt;&amp;lt;currentVersion&amp;gt;1.0&lt;br /&gt;&lt;br /&gt;  &amp;lt;/currentVersion&amp;gt;&amp;lt;organization&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;name&amp;gt;&lt;br /&gt;&lt;br /&gt;  Your   Organization&lt;br /&gt;&lt;br /&gt;  &amp;lt;/name&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;url&amp;gt;http://www.someorganization.biz/&amp;lt;/url&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;logo&amp;gt;http://www.someorganization.biz/logo.gif|jpg|...&amp;lt;/logo&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;/organization&amp;gt;&amp;lt;inceptionYear&amp;gt;2005&amp;lt;/inceptionYear&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;package&amp;gt;mdn.testapp&lt;br /&gt;&lt;br /&gt;  &amp;lt;/package&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;logo&amp;gt;http://yourproject/logo.jpg|gif|...&lt;br /&gt;&lt;br /&gt;  &amp;lt;/logo&amp;gt;&amp;lt;description&amp;gt;An   example projec &lt;/p&gt;&lt;br /&gt;&lt;p&gt;　现在，运行jar目标并且看看Maven的输出吧；它将包含下面如下这些。&lt;br /&gt;&lt;br /&gt;  　　&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  　　&lt;br /&gt;  Attempting to download   spring-core-1.1.4.jar.266K downloadedAttempting to download   spring-web-1.1.4.jar.111K   downloaded&lt;br /&gt;&lt;br /&gt;  　　&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  　　&lt;br /&gt;  图1-1显示了jar目标触发的一系列事件：&lt;br /&gt;&lt;br /&gt;  　　&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  　　&lt;br /&gt;  1.Maven查看POM,依据project.xml的定义，看到在springframework组中的两个人造物的依赖关系。它将载你本地Maven的资源库中检查spring-core-1.1.4.jar和spring-web-1.1.4.jar。&lt;br /&gt;&lt;br /&gt;  　　&lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;  　　&lt;br /&gt;  2.当Maven找不到这些文件，它将到http://www.ibiblio.org/maven/springframework/jars/寻找JAR文件。这些JAR文件会被下载并放置于你本地Maven的资源库中。它们也被添加到你项目的classpath中。下次在你的项目查询这些文件时，Maven将在你本地的资源库中提供它们。&lt;br /&gt;&lt;br /&gt;　　&lt;/p&gt;&lt;br /&gt;&lt;center&gt;&lt;br /&gt;　&lt;br /&gt;  &lt;img src=&quot;http://Java.chinaitlab.com/imgfiles/2005.8.27.11.0.37.19.2.jpg&quot; /&gt;&lt;br /&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;center&gt;&lt;br /&gt;  图1-1.Maven本地和远程资源库为test application项目提供的spring   Jar&lt;br /&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;刚刚发生了什么？&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;Maven为你节省了相当的时间和不必要的麻烦。Maven到来之前，依赖关系常常被捆绑到一个项目的目录或者项目应该指向到添加正确的JAR到你的classpath。使用Maven管理依赖关系显然有着明显的优势；作为初学者，如果你的项目依赖30个外部的JAR文件，这就不需要在你的资源库中存储成兆的JAR文件。这意味着当你在项目的外部检查资源控制的时候更少的存储空间和更快的下载时间。另外，如果你有多个项目依赖相同的外部依赖，Maven仅需要下载一次依赖关系，并且每个项目引用一个单独的副本在你本地的资源库中。当依赖关系能够从Maven资源库远程下载的时候，没有强制的原因让你存储你项目的依赖关系的版本。&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;当Maven下载依赖关系，其在你本地的机器上从远程的Maven资源库拷贝一个文件到你本地的Maven资源库。Maven如何定位依赖关系的？它使用project.xml中dependency元素的信息，如图1-2所示。&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;center&gt;&lt;br /&gt;　&lt;br /&gt;  &lt;img src=&quot;http://Java.chinaitlab.com/imgfiles/2005.8.27.11.0.54.19.3.jpg&quot; /&gt;&lt;br /&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;center&gt;&lt;br /&gt;  图1-2.POM和Maven资源库的映射&lt;br /&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;指定的groupId告诉Maven查看特定的目录-springframework。指定type告诉Maven查找特定的子目录如jar和war（注意s是Maven附加到type元素上的）；本例中，type是被忽略的，JAR类型是默认类型。当你指定了artifactId，你正告诉Maven哪个文件将从jar目录下载。顶级目录表现为组标示符，JAR文件名的第一部分表现为artifact标示符，文件名最后的部分，包括扩展名表现为version标示符。Maven使用下面的公式来决定一个来自于资源库中的依赖关系。[REPO_ROOT]参考你远程的资源库：&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;[REPO_ROOT]/&amp;lt;groupId&amp;gt;/&amp;lt;type&amp;gt;s/&amp;lt;artifactId&amp;gt;-&amp;lt;currentVersion&amp;gt;.&amp;lt;type&amp;gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;提示&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;Maven2.0的说明中，资源库可能开始于类似Java包的结构。作为springframework的替代，groupId被提议的结构为org.springframework.另外，每个版本将有一个分隔目录用以增加Maven资源库的效率。更多有关改变的提交建议，参见http://docs.codehaus.org/display/   MAVEN/Repository+Layout+-+Final.&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;一个本地的资源库来处理依赖关系。在Unix机器上，你的Maven资源库能在~/.maven/repository目录找到，在Windows机器上，你的Maven的资源库在你的%USERPROFILE%目录。如果你看一看本地Maven的资源库，你将会注意到它正包含一个springframework的目录。%USERPROFILE%.mavenrepositoryspringframeworkjars目录包含spring-core依赖关系的两个：spring-core-1.1.4.jar文件和spring-core-1.1.4.jar.md5文件,其包含MD5文件用于验证sprint-core   JAR文件的完整性。Maven   1当前并没有使用MD5来验证完成品的完整性，但在将来的版本可能会用其来验证完成品的完整性。&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;提示&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;在Windows机器上，%USERPROFILE%通常决定于C：D-ocuments   and Settingsvmassol这种目录。%USERPR-OFILE%被用在Unix的主目录。（%USERPROFILE% isused in the   spirit of the abbreviation for a Unix home   directory.）&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;关于......使用id元素?&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;如果你工作在现存的Maven项目，你可能有依赖关系使用id元素。下面的dependencies元素示范了使用单独id元素来附加Jakarta   Commons   Math的1.0版本：&amp;lt;；dependencies&amp;gt;&amp;lt;；dependency&amp;gt;&amp;lt;；id&amp;gt;commons-math&amp;lt;；/id&amp;gt;&amp;lt;；version&amp;gt;1.0&amp;lt;；/version&amp;gt;&amp;lt;；/dependency&amp;gt;&amp;lt;；/dependencies&amp;gt;单独使用id元素工作仅在groupId和artifactId匹配时，如果你浏览Maven资源库，你将看到下面的目录结构：&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;/commons-math&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;/jars&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;commons-math-1.0.jar&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;commons-math-1.1.jar&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;使用id元素工作，单独的id标记已经不被赞成使用并在Maven   2中消失。当你看到别的Maven项目中使用dependencies的速记符号时，请尝试使用groupId和artifactId来标识你的依赖关系。&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;strong&gt;依赖快照&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;如果你开发的程序依赖的依赖关系经常改变，你可能想将依赖的每个依赖关系替代为最近构件的硬编码的版本。在一个项目依赖的依赖关系还处在beta的版本，或你正开发一系列项目依赖的Maven项目时时特别有用，这将在第3章论述。本实验，你将学习到如何依靠快照。&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;我该如何做？&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;在你的依赖关系块儿中指定一个明确的版本，使用SNAPSHOT关键字作为版本名称的一部分。每次你执行Maven目标时，Maven将从远程资源库中检查较新的依赖关系。如果远程资源库的版本较新Maven将下载其到本地资源库。例如：下面的依赖关系将一直下载spring的新版JAR文件。&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&amp;lt;groupId&amp;gt;springframework&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&amp;lt;artifactId&amp;gt;spring&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&amp;lt;version&amp;gt;1.2-SNAPSHOT&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&amp;lt;/version&amp;gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;刚刚发生了什么？&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;当你使用SNAPSHOT依赖关系，你正告诉Maven使用远程资源库的最新版本。在你使用多项目插件或者当你依赖的一个完成品尚处于开发阶段这将得心应手。在你工作的团队仅有较少的开发者组成时，最好也常这么做。你将使用SNAPSHOT依赖关系当你的项目依赖一个最近的开发或者非正式版本的特别组件。SNAPSHOT依赖关系应该在开发阶段被保留，并且，概括说，你不用改发布一个依赖于SNAPSHOT依赖关系的项目。&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;strong&gt;执行脱机构建&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;如果你需要在一个离线的情况下使用Maven，你可能需要知道如何确使Maven不检查最新的SNAPSHOT依赖关系。本实验将向你展示如何用Maven执行脱机构建。&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;我该如何做？&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;这个方法很简单：仅仅使用-o命令行选项。例如，如果你没有网络连接，但又想执行测试目标，运行Maven -o   test。Maven将执行这个test目标而不检查依赖关系。如果你的项目没有依赖SNAPSHOT构建，你也可以断看你的环境来添加-o标志。如果你依赖SNAPSHOT构建，你将需要使用-o标志，Maven将在每次执行目标时尝试检查最新的SNAPSHOT。在这种情况下不使用-o标志本项目将不会构建成功。&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;关于......   执行离线构建如果你不想下载任何完成品？&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;当然，这将不会工作。离线构建的工作，你必须已经有必需的依赖关系在你本地的资源库。项目最简单的获得Maven下载依赖&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;关系的方法是在每个Maven项目实例简单的运行“noop”目标，build:start。这个目标执行之前任何其它的目标并不执行任何动作。如果你运行build:start，Maven将从project.xml获得获取任何依赖关系。&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;strong&gt;使用Maven控制台&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;如果你再三的从命令行运行Maven，你可以通过Maven控制台来节省时间。Maven控制台提供一个“外壳”，在这你可以键入目标的名称来执行Maven。通过使用Maven可以避免每次载你想运行一个Maven目标时Java   Virtual Machine（JVM）启动的等待。&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;我该如何做？&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;Maven   Console是一个插件，你可以通过键入maven console在命令提示符。这将产生下面的输出：&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;__ __&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;| / |__   _Apache__ ___&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;| |/| / _` V / -_) &#39; ~ intelligent projects ~&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;|_|   |___,_|_/___|_||_| v. 1.0.2The following commands are available:list - list all   available goalshelp - this message&amp;lt;goalname&amp;gt; - attain a goalquit - quits   the consoletest-application 1.0 &amp;gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;目前，你可以在命令行执行任何你能执行的目标。开始是一下；键入   java:compile。Maven将执行   java:compile目标并返回提示符其它的目标。在一个序列中运行两个目标，你可以在提示符处输入它们，通过“空格”-例如， clean   test。众所周知作为“goal chaining”这是你想通过Maven获得指定一系列目标的方法。退出Maven   Console，键入quit，查看有效目标列表，键入list。&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;刚刚发生了什么？&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;在Maven   Console下Maven执行java:compile目标非常之快，不信么？当你使用Maven   Console时你所执行的目标是在一个现成的JVM下。当你从命令行运行Maven时，你每次运行一个目标都不得不等待JVM的启动。如果你不确信其对性能的提升，自己试试看。在命令行下运行java:complie   10次，再在Maven Console下同样运行java:compile   10次。注意时间的差别，你将发现JVM启动的时间开始增加。如果你找到你自己常用的Maven目标，Maven   Console将通过启动JVM一次为来节省时间。&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;strong&gt;生成Eclipse项目&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　&lt;br /&gt;我打赌你一定想在IDE下工作。Maven通过插件来与Eclipse,InelliJ,IDEA,JBuilder,JDeveloper以及Emacs集成。Maven很好的与全部这些工作集成，本实验关注</content><link rel='replies' type='application/atom+xml' href='https://undancer.blogspot.com/feeds/2764189005775080646/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1102790865060223847/2764189005775080646' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/2764189005775080646'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/2764189005775080646'/><link rel='alternate' type='text/html' href='https://undancer.blogspot.com/2008/08/mavenmaven.html' title='Maven起步――教你开始使用Maven(图)'/><author><name>undancer</name><uri>http://www.blogger.com/profile/05800974944226224562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1102790865060223847.post-6213480599667957899</id><published>2008-08-08T00:54:00.001+08:00</published><updated>2008-08-08T00:54:34.349+08:00</updated><title type='text'>新北京，新奥运</title><content type='html'>新北京，新奥运</content><link rel='replies' type='application/atom+xml' href='https://undancer.blogspot.com/feeds/6213480599667957899/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1102790865060223847/6213480599667957899' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/6213480599667957899'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/6213480599667957899'/><link rel='alternate' type='text/html' href='https://undancer.blogspot.com/2008/08/blog-post_08.html' title='新北京，新奥运'/><author><name>undancer</name><uri>http://www.blogger.com/profile/05800974944226224562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1102790865060223847.post-4605579028541006416</id><published>2008-08-07T23:52:00.000+08:00</published><updated>2008-08-07T23:53:06.736+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="code"/><category scheme="http://www.blogger.com/atom/ns#" term="算法"/><title type='text'>贪婪算法</title><content type='html'>1.贪婪算法引述 &lt;br /&gt;&lt;br /&gt;先举个实例来通俗地说明贪婪算法。一个小孩买了价值33美分的糖，并将1美元的钱交给售货员。售货员希望用数目最少的硬币找给小孩。假设提供了数目不限的面值为2 5美分、1 0美分、5美分、及1美分的硬币。售货员分步骤组成要找的零钱数，每次加入一个硬币。&lt;br /&gt;选择硬币时所采用的贪婪准则如下：每一次选择应使零钱数尽量增大。为保证解法的可行性（即：所给的零钱等于要找的零钱数），所选择的硬币不应使零钱总数超过最终所需的数目。&lt;br /&gt;现在需要找给小孩6 7美分，首先入选的是两枚2 5美分的硬币，第三枚入选的不能是2 5美分的硬币，否则硬币的选择将不可行（零钱总数超过6 7美分），第三枚应选择1 0美分的硬币，然后是5美分的，最后加入两个1美分的硬币。&lt;br /&gt;  &lt;br /&gt;贪婪算法有种直觉的倾向，在找零钱时，直觉告诉我们应使找出的硬币数目最少（至少是接近最少的数目）。可以证明采用上述贪婪算法找零钱时所用的硬币数目的确最少。&lt;br /&gt;可见贪婪算法的实现思路：在每一步中，它要求“贪婪”地选择最佳操作，并希望通过一系列局部的最优选择，能够产生一个整个问题的(全局)最优解。&lt;br /&gt;&lt;br /&gt;2.贪婪算法原理&lt;br /&gt;&lt;br /&gt;在传统贪婪算法中采用逐步构造最优解的方法。在每个阶段，都做出一个看上去最优的决策（在一定的标准下）。决策一旦做出，就不可再更改。做出贪婪决策的依据称为贪婪准则（greedy criterion）。&lt;br /&gt;贪心思想的本质是每次都形成局部最优解，换一种方法说，就是每次都处理出一个最好的方案。即，贪婪法建议通过一系列步骤来构造问题的解，每一步对目前构造的部分解做一个扩展，直到获得问题的完全解为止。这个技术的核心是，所做的每一步选择都必须满足：&lt;br /&gt;l      可行的：即它必须满足问题的约束。&lt;br /&gt;l      局部最优：它是当前步骤中所有可行选择中最佳的局部选择。&lt;br /&gt;l      不可取消：即选择一旦做出，在算法的后面步骤中就无法改变了。&lt;br /&gt;贪心算法的最大特点就是快。通常，二次方级的存储要浪费额外的空间，而且很不幸，那些空间经常得不出正解。但是，当使用贪心算法时，这些空间可以帮助算法更容易实现且更快执行。&lt;br /&gt;&lt;br /&gt;3.贪婪算法实现的难点&lt;br /&gt;&lt;br /&gt;a. 如何贪婪:&lt;br /&gt;怎样才能从众多可行解中找到最优解呢？其实，大部分都是有规律的。在样例中，贪婪就有很明显的规律。在每一步中，它要求“贪婪”地选择最佳操作，并希望通过一系列局部的最优选择，能够产生一个整个问题的(全局)最优解。正因为贪心有如此性质，它才能比其他算法要快。然而，还有一些问题并不是这种情况，对于这样的问题，如果我们关心的是，或者说我们能够满足于一个近似解，贪婪算法仍然是有价值的。&lt;br /&gt;&lt;br /&gt;b. 贪婪的正确性:&lt;br /&gt;要证明所设计贪婪方法的正确性，才是真正挑战，因为并不是每次局部最优解都会与整体最优解之间有联系，往往靠贪婪方法生成的解不是最优解。这样，贪婪方法的证明就成了贪婪正确的关键。一个你想出的贪婪方法也许是错的，即使它在大部分数据中都是可行的，你必须考虑到所有可能出现的特殊情况，并证明你的贪婪方法在这些特殊情况中仍然正确。这样经过千锤百炼的性质才能构成一个正确的贪婪方法。&lt;br /&gt;&lt;br /&gt;    4.贪婪算法应用范围&lt;br /&gt;&lt;br /&gt;贪婪算法总是做出在当前看来最好的选择。也就是说贪婪算法并不从整体最优考虑，它所做出的选择只是在某种意义上的局部最优选择。当然，希望贪婪算法得到的最终结果也是整体最优的。虽然贪婪算法不能对所有问题都得到整体最优解，但对许多问题它能产生整体最优解。在一些情况下，即使贪婪算法不能得到整体最优解，其最终结果却是最优解的很好近似。&lt;br /&gt;如果需要解决的问题有贪婪性质存在，那么采用贪婪算法无疑是最好的选择！因为基于贪婪算法的程序执行起来速度极快，并且节约空间。衡量算法的关键就是效率，即程序执行时消耗的时间和空间。当然，贪心算法有一定使用范围，而且有一部分极难证明，若是没有把握，最好还是不要冒险，因为还有其他算法会比它要保险。</content><link rel='replies' type='application/atom+xml' href='https://undancer.blogspot.com/feeds/4605579028541006416/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1102790865060223847/4605579028541006416' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/4605579028541006416'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/4605579028541006416'/><link rel='alternate' type='text/html' href='https://undancer.blogspot.com/2008/08/blog-post.html' title='贪婪算法'/><author><name>undancer</name><uri>http://www.blogger.com/profile/05800974944226224562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1102790865060223847.post-2718675238869281701</id><published>2008-07-14T06:45:00.001+08:00</published><updated>2008-07-14T06:49:14.864+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="code"/><title type='text'>编写你自己的单点登录（SSO）服务</title><content type='html'>单点登录（SSO）的技术被越来越广泛地运用到各个领域的软件系统当中。本文从业务的角度分析了单点登录的需求和应用领域；从技术本身的角度分析了单点登录技术的内部机制和实现手段，并且给出Web-SSO和桌面SSO的实现、&lt;a href=&quot;http://www.vscodes.com/&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color:#800080;&quot;&gt;源代码&lt;/span&gt;&lt;/a&gt;和详细讲解；还从安全和性能的角度对现有的实现技术进行进一步分析，指出相应的风险和需要改进的方面。本文除了从多个方面和角度给出了对单点登录（SSO）的全面分析，还并且讨论了如何将现有的应用和SSO服务结合起来，能够帮助应用架构师和系统分析人员从本质上认识单点登录，从而更好地设计出符合需要的安全架构。&lt;br /&gt;关键字：SSO, Java, J2EE, JAAS&lt;br /&gt;1 什么是单点登陆&lt;br /&gt;单点登录（Single Sign On），简称为 SSO，是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中，用户只需要登录一次就可以访问所有相互信任的应用系统。&lt;br /&gt;较大的企业内部，一般都有很多的业务支持系统为其提供相应的管理和IT服务。例如财务系统为财务人员提供财务的管理、计算和报表服务；人事系统为人事部门提供全公司人员的维护服务；各种业务系统为公司内部不同的业务提供不同的服务等等。这些系统的目的都是让计算机来进行复杂繁琐的计算工作，来替代人力的手工劳动，提高工作效率和质量。这些不同的系统往往是在不同的时期建设起来的，运行在不同的平台上；也许是由不同厂商开发，使用了各种不同的技术和标准。如果举例说国内一著名的IT公司（名字隐去），内部共有60多个业务系统，这些系统包括两个不同版本的SAP的ERP系统，12个不同类型和版本的数据库系统，8个不同类型和版本的操作系统，以及使用了3种不同的防火墙技术，还有数十种互相不能兼容的协议和标准，你相信吗？不要怀疑，这种情况其实非常普遍。每一个应用系统在运行了数年以后，都会成为不可替换的企业IT架构的一部分，如下图所示。&lt;br /&gt;随着企业的发展，业务系统的数量在不断的增加，老的系统却不能轻易的替换，这会带来很多的开销。其一是管理上的开销，需要维护的系统越来越多。很多系统的数据是相互冗余和重复的，数据的不一致性会给管理工作带来很大的压力。业务和业务之间的相关性也越来越大，例如公司的计费系统和财务系统，财务系统和人事系统之间都不可避免的有着密切的关系。&lt;br /&gt;为了降低管理的消耗，最大限度的重用已有投资的系统，很多企业都在进行着企业应用集成（EAI）。企业应用集成可以在不同层面上进行：例如在数据存储层面上的“数据大集中”，在传输层面上的“通用数据交换平台”，在应用层面上的“业务流程整合”，和用户界面上的“通用企业门户”等等。事实上，还用一个层面上的集成变得越来越重要，那就是“身份认证”的整合，也就是“单点登录”。&lt;br /&gt;通常来说，每个单独的系统都会有自己的安全体系和身份认证系统。整合以前，进入每个系统都需要进行登录，这样的局面不仅给管理上带来了很大的困难，在安全方面也埋下了重大的隐患。下面是一些著名的调查公司显示的统计数据：&lt;br /&gt;用户每天平均 16 分钟花在身份验证任务上 - 资料来源： IDS&lt;br /&gt;频繁的 IT 用户平均有 21 个密码 - 资料来源： NTA Monitor Password Survey&lt;br /&gt;49% 的人写下了其密码，而 67% 的人很少改变它们&lt;br /&gt;每 79 秒出现一起身份被窃事件 - 资料来源：National Small Business Travel Assoc&lt;br /&gt;全球欺骗损失每年约 12B - 资料来源：Comm Fraud Control Assoc&lt;br /&gt;到 2007 年，身份管理市场将成倍增长至 $4.5B - 资料来源：IDS&lt;br /&gt;&lt;br /&gt;使用“单点登录”整合后，只需要登录一次就可以进入多个系统，而不需要重新登录，这不仅仅带来了更好的用户体验，更重要的是降低了安全的风险和管理的消耗。请看下面的统计数据：&lt;br /&gt;提高 IT 效率：对于每 1000 个受管用户，每用户可节省$70K&lt;br /&gt;帮助台呼叫减少至少1/3，对于 10K 员工的公司，每年可以节省每用户 $75，或者合计 $648K&lt;br /&gt;生产力提高：每个新员工可节省 $1K，每个老员工可节省 $350 �资料来源：Giga&lt;br /&gt;ROI 回报：7.5 到 13 个月 �资料来源：Gartner&lt;br /&gt;&lt;br /&gt;另外，使用“单点登录”还是SOA时代的需求之一。在面向服务的架构中，服务和服务之间，程序和程序之间的通讯大量存在，服务之间的安全认证是SOA应用的难点之一，应此建立“单点登录”的系统体系能够大大简化SOA的安全问题，提高服务之间的合作效率。&lt;br /&gt;2 单点登陆的技术实现机制&lt;br /&gt;随着SSO技术的流行，SSO的产品也是满天飞扬。所有著名的软件厂商都提供了相应的解决方案。在这里我并不想介绍自己公司（Sun Microsystems）的产品，而是对SSO技术本身进行解析，并且提供自己开发这一类产品的方法和简单演示。有关我写这篇文章的目的，请参考我的博客（&lt;a href=&quot;http://yuwang881.blog.sohu.com/3184816.html&quot;&gt;http://yuwang881.blog.sohu.com/3184816.html&lt;/a&gt;）。&lt;br /&gt;单点登录的机制其实是比较简单的，用一个现实中的例子做比较。颐和园是北京著名的旅游景点，也是我常去的地方。在颐和园内部有许多独立的景点，例如“苏州街”、“佛香阁”和“德和园”，都可以在各个景点门口单独买票。很多游客需要游玩所有德景点，这种买票方式很不方便，需要在每个景点门口排队买票，钱包拿进拿出的，容易丢失，很不安全。于是绝大多数游客选择在大门口买一张通票（也叫套票），就可以玩遍所有的景点而不需要重新再买票。他们只需要在每个景点门口出示一下刚才买的套票就能够被允许进入每个独立的景点。&lt;br /&gt;单点登录的机制也一样，如下图所示，当用户第一次访问应用系统1的时候，因为还没有登录，会被引导到认证系统中进行登录（1）；根据用户提供的登录信息，认证系统进行身份效验，如果通过效验，应该返回给用户一个认证的凭据－－ticket（2）；用户再访问别的应用的时候（3，5）就会将这个ticket带上，作为自己认证的凭据，应用系统接受到请求之后会把ticket送到认证系统进行效验，检查ticket的合法性（4，6）。如果通过效验，用户就可以在不用再次登录的情况下访问应用系统2和应用系统3了。&lt;br /&gt;从上面的视图可以看出，要实现SSO，需要以下主要的功能：&lt;br /&gt;所有应用系统共享一个身份认证系统。&lt;br /&gt;统一的认证系统是SSO的前提之一。认证系统的主要功能是将用户的登录信息和用户信息库相比较，对用户进行登录认证；认证成功后，认证系统应该生成统一的认证标志（ticket），返还给用户。另外，认证系统还应该对ticket进行效验，判断其有效性。&lt;br /&gt;所有应用系统能够识别和提取ticket信息&lt;br /&gt;要实现SSO的功能，让用户只登录一次，就必须让应用系统能够识别已经登录过的用户。应用系统应该能对ticket进行识别和提取，通过与认证系统的通讯，能自动判断当前用户是否登录过，从而完成单点登录的功能。&lt;br /&gt;&lt;br /&gt;上面的功能只是一个非常简单的SSO架构，在现实情况下的SSO有着更加复杂的结构。有两点需要指出的是：&lt;br /&gt;单一的用户信息数据库并不是必须的，有许多系统不能将所有的用户信息都集中存储，应该允许用户信息放置在不同的存储中，如下图所示。事实上，只要统一认证系统，统一ticket的产生和效验，无论用户信息存储在什么地方，都能实现单点登录。&lt;br /&gt;&lt;br /&gt;统一的认证系统并不是说只有单个的认证服务器，如下图所示，整个系统可以存在两个以上的认证服务器，这些服务器甚至可以是不同的产品。认证服务器之间要通过标准的通讯协议，互相交换认证信息，就能完成更高级别的单点登录。如下图，当用户在访问应用系统1时，由第一个认证服务器进行认证后，得到由此服务器产生的ticket。当他访问应用系统4的时候，认证服务器2能够识别此ticket是由第一个服务器产生的，通过认证服务器之间标准的通讯协议（例如SAML）来交换认证信息，仍然能够完成SSO的功能。&lt;br /&gt;&lt;br /&gt;3 WEB-SSO的实现&lt;br /&gt;随着互联网的高速发展，WEB应用几乎统治了绝大部分的软件应用系统，因此WEB-SSO是SSO应用当中最为流行。WEB-SSO有其自身的特点和优势，实现起来比较简单易用。很多商业软件和&lt;a href=&quot;http://www.vscodes.com/&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color:#800080;&quot;&gt;开源&lt;/span&gt;&lt;/a&gt;软件都有对WEB-SSO的实现。其中值得一提的是OpenSSO （&lt;a href=&quot;https://opensso.dev.java.net/&quot;&gt;https://opensso.dev.java.net/&lt;/a&gt;），为用Java实现WEB-SSO提供架构指南和服务指南，为用户自己来实现WEB-SSO提供了理论的依据和实现的方法。&lt;br /&gt;为什么说WEB-SSO比较容易实现呢？这是有WEB应用自身的特点决定的。&lt;br /&gt;众所周知，Web协议（也就是HTTP）是一个无状态的协议。一个Web应用由很多个Web页面组成，每个页面都有唯一的URL来定义。用户在浏览器的地址栏输入页面的URL，浏览器就会向Web Server去发送请求。如下图，浏览器向Web服务器发送了两个请求，申请了两个页面。这两个页面的请求是分别使用了两个单独的HTTP连接。所谓无状态的协议也就是表现在这里，浏览器和Web服务器会在第一个请求完成以后关闭连接通道，在第二个请求的时候重新建立连接。Web服务器并不区分哪个请求来自哪个客户端，对所有的请求都一视同仁，都是单独的连接。这样的方式大大区别于传统的（Client/Server）C/S结构,在那样的应用中，客户端和服务器端会建立一个长时间的专用的连接通道。正是因为有了无状态的特性，每个连接资源能够很快被其他客户端所重用，一台Web服务器才能够同时服务于成千上万的客户端。&lt;br /&gt;但是我们通常的应用是有状态的。先不用提不同应用之间的SSO，在同一个应用中也需要保存用户的登录身份信息。例如用户在访问页面1的时候进行了登录，但是刚才也提到，客户端的每个请求都是单独的连接，当客户再次访问页面2的时候，如何才能告诉Web服务器，客户刚才已经登录过了呢？浏览器和服务器之间有约定：通过使用cookie技术来维护应用的状态。Cookie是可以被Web服务器设置的字符串，并且可以保存在浏览器中。如下图所示，当浏览器访问了页面1时，web服务器设置了一个cookie，并将这个cookie和页面1一起返回给浏览器，浏览器接到cookie之后，就会保存起来，在它访问页面2的时候会把这个cookie也带上，Web服务器接到请求时也能读出cookie的值，根据cookie值的内容就可以判断和恢复一些用户的信息状态。&lt;br /&gt;Web-SSO完全可以利用Cookie结束来完成用户登录信息的保存，将浏览器中的Cookie和上文中的Ticket结合起来，完成SSO的功能。&lt;br /&gt;&lt;br /&gt;为了完成一个简单的SSO的功能，需要两个部分的合作：&lt;br /&gt;统一的身份认证服务。&lt;br /&gt;修改Web应用，使得每个应用都通过这个统一的认证服务来进行身份效验。&lt;br /&gt;3.1 Web SSO 的样例&lt;br /&gt;根据上面的原理，我用J2EE的技术（JSP和Servlet）完成了一个具有Web-SSO的简单样例。样例包含一个身份认证的服务器和两个简单的Web应用，使得这两个 Web应用通过统一的身份认证服务来完成Web-SSO的功能。此样例所有的&lt;a href=&quot;http://www.vscodes.com/&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color:#800080;&quot;&gt;源代码&lt;/span&gt;&lt;/a&gt;和二进制代码都可以从网站地址&lt;a href=&quot;http://gceclub.sun.com.cn/wangyu/&quot;&gt;http://gceclub.sun.com.cn/wangyu/&lt;/a&gt; &lt;a href=&quot;http://www.vscodes.com/&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color:#800080;&quot;&gt;下载&lt;/span&gt;&lt;/a&gt;。&lt;br /&gt;&lt;br /&gt;样例&lt;a href=&quot;http://www.vscodes.com/&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color:#800080;&quot;&gt;下载&lt;/span&gt;&lt;/a&gt;、安装部署和运行指南：&lt;br /&gt;Web-SSO的样例是由三个标准Web应用组成，压缩成三个zip文件，从&lt;a href=&quot;http://gceclub.sun.com.cn/wangyu/web-sso/&quot;&gt;http://gceclub.sun.com.cn/wangyu/web-sso/&lt;/a&gt;中&lt;a href=&quot;http://www.vscodes.com/&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color:#800080;&quot;&gt;下载&lt;/span&gt;&lt;/a&gt;。其中SSOAuth（&lt;a href=&quot;http://gceclub.sun.com.cn/wangyu/web-sso/SSOAuth.zip&quot;&gt;http://gceclub.sun.com.cn/wangyu/web-sso/SSOAuth.zip&lt;/a&gt;）是身份认证服务；SSOWebDemo1（&lt;a href=&quot;http://gceclub.sun.com.cn/wangyu/web-sso/SSOWebDemo1.zip&quot;&gt;http://gceclub.sun.com.cn/wangyu/web-sso/SSOWebDemo1.zip&lt;/a&gt;）和SSOWebDemo2（&lt;a href=&quot;http://gceclub.sun.com.cn/wangyu/web-sso/SSOWebDemo2.zip&quot;&gt;http://gceclub.sun.com.cn/wangyu/web-sso/SSOWebDemo2.zip&lt;/a&gt;）是两个用来演示单点登录的Web应用。这三个Web应用之所以没有打成war包，是因为它们不能直接部署，根据读者的部署环境需要作出小小的修改。样例部署和运行的环境有一定的要求，需要符合Servlet2.3以上标准的J2EE容器才能运行（例如Tomcat5,Sun Application Server 8, Jboss 4等）。另外，身份认证服务需要JDK1.5的运行环境。之所以要用JDK1.5是因为笔者使用了一个线程安全的高性能的Java集合类“ConcurrentMap”，只有在JDK1.5中才有。&lt;br /&gt;这三个Web应用完全可以单独部署，它们可以分别部署在不同的机器，不同的操作系统和不同的J2EE的产品上，它们完全是标准的和平台无关的应用。但是有一个限制，那两台部署应用（demo1、demo2）的机器的域名需要相同，这在后面的章节中会解释到cookie和domain的关系以及如何制作跨域的WEB-SSO&lt;br /&gt;解压缩SSOAuth.zip文件，在/WEB-INF/下的web.xml中请修改“domainname”的属性以反映实际的应用部署情况，domainname需要设置为两个单点登录的应用（demo1和demo2）所属的域名。这个domainname和当前SSOAuth服务部署的机器的域名没有关系。我缺省设置的是“.sun.com”。如果你部署demo1和demo2的机器没有域名，请输入IP地址或主机名（如localhost），但是如果使用IP地址或主机名也就意味着demo1和demo2需要部署到一台机器上了。设置完后，根据你所选择的J2EE容器，可能需要将SSOAuth这个目录压缩打包成war文件。用“jar -cvf SSOAuth.war SSOAuth/”就可以完成这个功能。&lt;br /&gt;解压缩SSOWebDemo1和SSOWebDemo2文件，分别在它们/WEB-INF/下找到web.xml文件，请修改其中的几个初始化参数&lt;br /&gt;&lt;br /&gt;SSOServiceURL&lt;br /&gt;&lt;a href=&quot;http://wangyu.prc.sun.com:8080/SSOAuth/SSOAuth%3Cbr%20/%3E%3Cbr%20/%3ESSOLoginPage%3Cbr%20/%3E%3Ca%20href=&quot;&gt;http://wangyu.prc.sun.com:8080/SSOAuth/SSOAuth%3Cbr%20/%3E%3Cbr%20/%3ESSOLoginPage%3Cbr%20/%3E%3Ca%20href=&lt;/a&gt; SSOWebDemo1/test.jsp，如果是第一次访问，便会自动跳转到登录界面，如下图&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;使用系统自带的三个帐号之一登录（例如，用户名：wangyu,密码：wangyu），便能成功的看到test.jsp的内容：显示当前用户名和欢迎信息。&lt;br /&gt;&lt;br /&gt;请接着在同一个浏览器中输入第二个web应用的测试URL（test.jsp）,例如&lt;a href=&quot;http://wangyu.prc.sun.com:8080/&quot;&gt;http://wangyu.prc.sun.com:8080/&lt;/a&gt; SSOWebDemo2/test.jsp。你会发现，不需要再次登录就能看到test.jsp的内容，同样是显示当前用户名和欢迎信息，而且欢迎信息中明确的显示当前的应用名称（demo2）。&lt;br /&gt;&lt;br /&gt;3.2 WEB-SSO代码讲解&lt;br /&gt;3.2.1身份认证服务代码解析&lt;br /&gt;Web-SSO的&lt;a href=&quot;http://www.vscodes.com/&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color:#800080;&quot;&gt;源代码&lt;/span&gt;&lt;/a&gt;可以从网站地址&lt;a href=&quot;http://gceclub.sun.com.cn/wangyu/web-sso/websso_src.zipSSOAuth的代码如下面的列表显示，结构非常简单，先看看这个Servlet的主体部分：%3Cbr&quot;&gt;package DesktopSSO;&lt;br /&gt;&lt;br /&gt;import java.io.*;&lt;br /&gt;import java.net.*;&lt;br /&gt;import java.text.*;&lt;br /&gt;import java.util.*;&lt;br /&gt;import java.util.concurrent.*;&lt;br /&gt;&lt;br /&gt;import javax.servlet.*;&lt;br /&gt;import javax.servlet.http.*;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public class SSOAuth extends HttpServlet {&lt;br /&gt;&lt;br /&gt;static private ConcurrentMap accounts;&lt;br /&gt;static private ConcurrentMap SSOIDs;&lt;br /&gt;String cookiename=&quot;WangYuDesktopSSOID&quot;;&lt;br /&gt;String domainname;&lt;br /&gt;&lt;br /&gt;public void init(ServletConfig config) throws ServletException {&lt;br /&gt;super.init(config);&lt;br /&gt;domainname= config.getInitParameter(&quot;domainname&quot;);&lt;br /&gt;cookiename = config.getInitParameter(&quot;cookiename&quot;);&lt;br /&gt;SSOIDs = new ConcurrentHashMap();&lt;br /&gt;accounts=new ConcurrentHashMap();&lt;br /&gt;accounts.put(&quot;wangyu&quot;, &quot;wangyu&quot;);&lt;br /&gt;accounts.put(&quot;paul&quot;, &quot;paul&quot;);&lt;br /&gt;accounts.put(&quot;carol&quot;, &quot;carol&quot;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {&lt;br /&gt;PrintWriter out = response.getWriter();&lt;br /&gt;String action = request.getParameter(&quot;action&quot;);&lt;br /&gt;String result=&quot;failed&quot;;&lt;br /&gt;if (action==null) {&lt;br /&gt;handlerFromLogin(request,response);&lt;br /&gt;} else if (action.equals(&quot;authcookie&quot;)){&lt;br /&gt;String myCookie = request.getParameter(&quot;cookiename&quot;);&lt;br /&gt;if (myCookie != null) result = authCookie(myCookie);&lt;br /&gt;out.print(result);&lt;br /&gt;out.close();&lt;br /&gt;} else if (action.equals(&quot;authuser&quot;)) {&lt;br /&gt;result=authNameAndPasswd(request,response);&lt;br /&gt;out.print(result);&lt;br /&gt;out.close();&lt;br /&gt;} else if (action.equals(&quot;logout&quot;)) {&lt;br /&gt;String myCookie = request.getParameter(&quot;cookiename&quot;);&lt;br /&gt;logout(myCookie);&lt;br /&gt;out.close();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;.....&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;从代码很容易看出，SSOAuth就是一个简单的Servlet。其中有两个静态成员变量：accounts和SSOIDs，这两个成员变量都使用了JDK1.5中线程安全的MAP类： ConcurrentMap，所以这个样例一定要JDK1.5才能运行。Accounts用来存放用户的用户名和密码，在init()的方法中可以看到我给系统添加了三个合法的用户。在实际应用中，accounts应该是去数据库中或LDAP中获得，为了简单起见，在本样例中我使用了ConcurrentMap在内存中用程序创建了三个用户。而SSOIDs保存了在用户成功的登录后所产生的cookie和用户名的对应关系。它的功能显而易见：当用户成功登录以后，再次访问别的系统，为了鉴别这个用户请求所带的cookie的有效性，需要到SSOIDs中检查这样的映射关系是否存在。&lt;br /&gt;&lt;br /&gt;在主要的请求处理方法processRequest()中，可以很清楚的看到SSOAuth的所有功能&lt;br /&gt;如果用户还没有登录过，是第一次登录本系统，会被跳转到login.jsp页面（在后面会解释如何跳转）。用户在提供了用户名和密码以后，就会用handlerFromLogin()这个方法来验证。&lt;br /&gt;如果用户已经登录过本系统，再访问别的应用的时候，是不需要再次登录的。因为浏览器会将第一次登录时产生的cookie和请求一起发送。效验cookie的有效性是SSOAuth的主要功能之一。&lt;br /&gt;SSOAuth还能直接效验非login.jsp页面过来的用户名和密码的效验请求。这个功能是用于非web应用的SSO，这在后面的桌面SSO中会用到。&lt;br /&gt;SSOAuth还提供logout服务。&lt;br /&gt;&lt;br /&gt;下面看看几个主要的功能函数：&lt;br /&gt;private void handlerFromLogin(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {&lt;br /&gt;String username = request.getParameter(&quot;username&quot;);&lt;br /&gt;String password = request.getParameter(&quot;password&quot;);&lt;br /&gt;String pass = (String)accounts.get(username);&lt;br /&gt;if ((pass==null)(!pass.equals(password)))&lt;br /&gt;getServletContext().getRequestDispatcher(&quot;/failed.html&quot;).forward(request, response);&lt;br /&gt;else {&lt;br /&gt;String gotoURL = request.getParameter(&quot;goto&quot;);&lt;br /&gt;String newID = createUID();&lt;br /&gt;SSOIDs.put(newID, username);&lt;br /&gt;Cookie wangyu = new Cookie(cookiename, newID);&lt;br /&gt;wangyu.setDomain(domainname);&lt;br /&gt;wangyu.setMaxAge(60000);&lt;br /&gt;wangyu.setValue(newID);&lt;br /&gt;wangyu.setPath(&quot;/&quot;);&lt;br /&gt;response.addCookie(wangyu);&lt;br /&gt;System.out.println(&quot;login success, goto back &lt;a href=&quot;http://www.blogger.com/&quot;&gt;http://www.blogger.com/&lt;/a&gt;; + gotoURL);&lt;br /&gt;if (gotoURL != null) {&lt;br /&gt;PrintWriter out = response.getWriter();&lt;br /&gt;response.sendRedirect(gotoURL);&lt;br /&gt;out.close();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;handlerFromLogin()这个方法是用来处理来自login.jsp的登录请求。它的逻辑很简单：将用户输入的用户名和密码与预先设定好的用户集合（存放在accounts中）相比较，如果用户名或密码不匹配的话，则返回登录失败的页面（failed.html），如果登录成功的话，需要为用户当前的session创建一个新的ID，并将这个ID和用户名的映射关系存放到SSOIDs中，最后还要将这个ID设置为浏览器能够保存的cookie值。&lt;br /&gt;登录成功后，浏览器会到哪个页面呢？那我们回顾一下我们是如何使用身份认证服务的。一般来说我们不会直接访问身份服务的任何URL，包括login.jsp。身份服务是用来保护其他应用服务的，用户一般在访问一个受SSOAuth保护的Web应用的某个URL时，当前这个应用会发现当前的用户还没有登录，便强制将也页面转向SSOAuth的login.jsp，让用户登录。如果登录成功后，应该自动的将用户的浏览器指向用户最初想访问的那个URL。在handlerFromLogin()这个方法中，我们通过接收“goto”这个参数来保存用户最初访问的URL，成功后便重新定向到这个页面中。&lt;br /&gt;另外一个要说明的是，在设置cookie的时候，我使用了一个setMaxAge(6000)的方法。这个方法是用来设置cookie的有效期，单位是秒。如果不使用这个方法或者参数为负数的话，当浏览器关闭的时候，这个cookie就失效了。在这里我给了很大的值（1000分钟），导致的行为是：当你关闭浏览器（或者关机），下次再打开浏览器访问刚才的应用，只要在1000分钟之内，就不需要再登录了。我这样做是下面要介绍的桌面SSO中所需要的功能。&lt;br /&gt;其他的方法更加简单，这里就不多解释了。&lt;br /&gt;&lt;br /&gt;3.2.2具有SSO功能的web应用&lt;a href=&quot;http://www.blogger.com/&quot; target=&quot;_blank&quot;&gt;&lt; &gt;源代码&lt; color=&quot;&quot;&gt;http://www.javaworld.com/javaworld/jw-06-2001/jw-0622-filters.html&lt;/a&gt;）Filter是一个具有很好的模块化，可重用的编程API，用在SSO正合适不过。本样例就是使用一个filter来完成以上的功能。&lt;br /&gt;&lt;br /&gt;package SSO;&lt;br /&gt;&lt;br /&gt;import java.io.*;&lt;br /&gt;import java.net.*;&lt;br /&gt;import java.util.*;&lt;br /&gt;import java.text.*;&lt;br /&gt;import javax.servlet.*;&lt;br /&gt;import javax.servlet.http.*;&lt;br /&gt;import javax.servlet.*;&lt;br /&gt;import org.apache.commons.httpclient.*;&lt;br /&gt;import org.apache.commons.httpclient.methods.GetMethod;&lt;br /&gt;&lt;br /&gt;public class SSOFilter implements Filter {&lt;br /&gt;private FilterConfig filterConfig = null;&lt;br /&gt;private String cookieName=&quot;WangYuDesktopSSOID&quot;;&lt;br /&gt;private String SSOServiceURL= &quot;http://wangyu.prc.sun.com:8080/SSOAuth/SSOAuth&quot;;&lt;br /&gt;private String SSOLoginPage= &quot;http://wangyu.prc.sun.com:8080/SSOAuth/login.jsp&quot;;&lt;br /&gt;&lt;br /&gt;public void init(FilterConfig filterConfig) {&lt;br /&gt;&lt;br /&gt;this.filterConfig = filterConfig;&lt;br /&gt;if (filterConfig != null) {&lt;br /&gt;if (debug) {&lt;br /&gt;log(&quot;SSOFilter:Initializing filter&quot;);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;cookieName = filterConfig.getInitParameter(&quot;cookieName&quot;);&lt;br /&gt;SSOServiceURL = filterConfig.getInitParameter(&quot;SSOServiceURL&quot;);&lt;br /&gt;SSOLoginPage = filterConfig.getInitParameter(&quot;SSOLoginPage&quot;);&lt;br /&gt;}&lt;br /&gt;.....&lt;br /&gt;.....&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;以上的初始化的&lt;a href=&quot;http://www.vscodes.com/&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color:#800080;&quot;&gt;源代码&lt;/span&gt;&lt;/a&gt;有两点需要说明：一是有两个需要配置的参数SSOServiceURL和SSOLoginPage。因为当前的Web应用很可能和身份认证服务（SSOAuth）不在同一台机器上，所以需要让这个filter知道身份认证服务部署的URL，这样才能去调用它的服务。另外一点就是由于身份认证的服务调用是要通过http协议来调用的（在本样例中是这样设计的，读者完全可以设计自己的身份服务，使用别的调用协议，如RMI或SOAP等等），所有笔者引用了apache的commons工具包（详细信息情访问apache 的网站&lt;a href=&quot;http://jakarta.apache.org/commons/index.html&quot;&gt;http://jakarta.apache.org/commons/index.html&lt;/a&gt;），其中的“httpclient”可以大大简化http调用的编程。&lt;br /&gt;下面看看filter的主体方法doFilter():&lt;br /&gt;public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {&lt;br /&gt;if (debug) log(&quot;SSOFilter:doFilter()&quot;);&lt;br /&gt;HttpServletRequest request = (HttpServletRequest) req;&lt;br /&gt;HttpServletResponse response = (HttpServletResponse) res;&lt;br /&gt;String result=&quot;failed&quot;;&lt;br /&gt;String url = request.getRequestURL().toString();&lt;br /&gt;String qstring = request.getQueryString();&lt;br /&gt;if (qstring == null) qstring =&quot;&quot;;&lt;br /&gt;&lt;br /&gt;//检查http请求的head是否有需要的cookie&lt;br /&gt;String cookieValue =&quot;&quot;;&lt;br /&gt;javax.servlet.http.Cookie[] diskCookies = request.getCookies();&lt;br /&gt;if (diskCookies != null) {&lt;br /&gt;for (int i = 0; i &amp;lt; diskCookies.length; i++) {&lt;br /&gt;if(diskCookies&lt;i&gt;.getName().equals(cookieName)){&lt;br /&gt;cookieValue = diskCookies&lt;i&gt;.getValue();&lt;br /&gt;&lt;br /&gt;//如果找到了相应的cookie则效验其有效性&lt;br /&gt;result = SSOService(cookieValue);&lt;br /&gt;if (debug) log(&quot;found cookies!&quot;);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;if (result.equals(&quot;failed&quot;)) { //效验失败或没有找到cookie，则需要登录&lt;br /&gt;response.sendRedirect(SSOLoginPage+&quot;?goto=&quot;+url);&lt;br /&gt;} else if (qstring.indexOf(&quot;logout&quot;) &amp;gt; 1) {//logout服务&lt;br /&gt;if (debug) log(&quot;logout action!&quot;);&lt;br /&gt;logoutService(cookieValue);&lt;br /&gt;response.sendRedirect(SSOLoginPage+&quot;?goto=&quot;+url);&lt;br /&gt;} else {//效验成功&lt;br /&gt;request.setAttribute(&quot;SSOUser&quot;,result);&lt;br /&gt;Throwable problem = null;&lt;br /&gt;try {&lt;br /&gt;chain.doFilter(req, res);&lt;br /&gt;} catch(Throwable t) {&lt;br /&gt;problem = t;&lt;br /&gt;t.printStackTrace();&lt;br /&gt;}&lt;br /&gt;if (problem != null) {&lt;br /&gt;if (problem instanceof ServletException) throw (ServletException)problem;&lt;br /&gt;if (problem instanceof IOException) throw (IOException)problem;&lt;br /&gt;sendProcessingError(problem, res);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;doFilter()方法的逻辑也是非常简单的，在接收到请求的时候，先去查找是否存在期望的cookie值，如果找到了，就会调用SSOService(cookieValue)去效验这个cookie的有效性。如果cookie效验不成功或者cookie根本不存在，就会直接转到登录界面让用户登录；如果cookie效验成功，就不会做任何阻拦，让此请求进行下去。在配置文件中，有下面的一个节点表示了此filter的URL映射关系：只拦截所有的jsp请求。&lt;br /&gt;&lt;br /&gt;SSOFilter&lt;br /&gt;*.jsp&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;下面还有几个主要的函数需要说明：&lt;br /&gt;private String SSOService(String cookievalue) throws IOException {&lt;br /&gt;String authAction = &quot;?action=authcookie&amp;amp;cookiename=&quot;;&lt;br /&gt;HttpClient httpclient = new HttpClient();&lt;br /&gt;GetMethod httpget = new GetMethod(SSOServiceURL+authAction+cookievalue);&lt;br /&gt;try {&lt;br /&gt;httpclient.executeMethod(httpget);&lt;br /&gt;String result = httpget.getResponseBodyAsString();&lt;br /&gt;return result;&lt;br /&gt;} finally {&lt;br /&gt;httpget.releaseConnection();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private void logoutService(String cookievalue) throws IOException {&lt;br /&gt;String authAction = &quot;?action=logout&amp;amp;cookiename=&quot;;&lt;br /&gt;HttpClient httpclient = new HttpClient();&lt;br /&gt;GetMethod httpget = new GetMethod(SSOServiceURL+authAction+cookievalue);&lt;br /&gt;try {&lt;br /&gt;httpclient.executeMethod(httpget);&lt;br /&gt;httpget.getResponseBodyAsString();&lt;br /&gt;} finally {&lt;br /&gt;httpget.releaseConnection();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;这两个函数主要是利用apache中的httpclient访问SSOAuth提供的认证服务来完成效验cookie和logout的功能。&lt;br /&gt;其他的函数都很简单，有很多都是我的IDE（NetBeans）替我自动生成的。&lt;br /&gt;4 当前方案的安全局限性&lt;br /&gt;当前这个WEB-SSO的方案是一个比较简单的雏形，主要是用来演示SSO的概念和说明SSO技术的实现方式。有很多方面还需要完善，其中安全性是非常重要的一个方面。&lt;br /&gt;我们说过，采用SSO技术的主要目的之一就是加强安全性，降低安全风险。因为采用了SSO，在网络上传递密码的次数减少，风险降低是显然的，但是当前的方案却有其他的安全风险。由于cookie是一个用户登录的唯一凭据，对cookie的保护措施是系统安全的重要环节：&lt;br /&gt;cookie的长度和复杂度&lt;br /&gt;在本方案中，cookie是有一个固定的字符串（我的姓名）加上当前的时间戳。这样的cookie很容易被伪造和猜测。怀有恶意的用户如果猜测到合法的cookie就可以被当作已经登录的用户，任意访问权限范围内的资源&lt;br /&gt;cookie的效验和保护&lt;br /&gt;在本方案中，虽然密码只要传输一次就够了，可cookie在网络中是经常传来传去。一些网络探测工具（如sniff, snoop,tcpdump等）可以很容易捕获到cookie的数值。在本方案中，并没有考虑cookie在传输时候的保护。另外对cookie的效验也过于简单，并不去检查发送cookie的来源究竟是不是cookie最初的拥有者，也就是说无法区分正常的用户和仿造cookie的用户。&lt;br /&gt;当其中一个应用的安全性不好，其他所有的应用都会受到安全威胁&lt;br /&gt;因为有SSO，所以当某个处于 SSO的应用被黒客攻破，那么很容易攻破其他处于同一个SSO保护的应用。&lt;br /&gt;这些安全漏洞在商业的SSO解决方案中都会有所考虑，提供相关的安全措施和保护手段，例如Sun公司的Access Manager，cookie的复杂读和对cookie的保护都做得非常好。另外在OpneSSO （&lt;a href=&quot;https://opensso.dev.java.net/&quot;&gt;https://opensso.dev.java.net/&lt;/a&gt;）的架构指南中也给出了部分安全措施的解决方案。&lt;br /&gt;5 当前方案的功能和性能局限性&lt;br /&gt;除了安全性，当前方案在功能和性能上都需要很多的改进：&lt;br /&gt;当前所提供的登录认证模式只有一种：用户名和密码，而且为了简单，将用户名和密码放在内存当中。事实上，用户身份信息的来源应该是多种多样的，可以是来自数据库中，LDAP中，甚至于来自操作系统自身的用户列表。还有很多其他的认证模式都是商务应用不可缺少的，因此SSO的解决方案应该包括各种认证的模式，包括数字证书，Radius， SafeWord ，MemberShip，SecurID等多种方式。最为灵活的方式应该允许可插入的JAAS框架来扩展身份认证的接口&lt;br /&gt;我们编写的Filter只能用于J2EE的应用，而对于大量非Java的Web应用，却无法提供SSO服务。&lt;br /&gt;在将Filter应用到Web应用的时候，需要对容器上的每一个应用都要做相应的修改，重新部署。而更加流行的做法是Agent机制：为每一个应用服务器安装一个agent，就可以将SSO功能应用到这个应用服务器中的所有应用。&lt;br /&gt;当前的方案不能支持分别位于不同domain的Web应用进行SSO。这是因为浏览器在访问Web服务器的时候，仅仅会带上和当前web服务器具有相同domain名称的那些cookie。要提供跨域的SSO的解决方案有很多其他的方法，在这里就不多说了。Sun的Access Manager就具有跨域的SSO的功能。&lt;br /&gt;另外，Filter的性能问题也是需要重视的方面。因为Filter会截获每一个符合URL映射规则的请求，获得cookie，验证其有效性。这一系列任务是比较消耗资源的，特别是验证cookie有效性是一个远程的http的调用，来访问SSOAuth的认证服务，有一定的延时。因此在性能上需要做进一步的提高。例如在本样例中，如果将URL映射从“.jsp”改成“/*”，也就是说filter对所有的请求都起作用，整个应用会变得非常慢。这是因为，页面当中包含了各种静态元素如gif图片，css样式文件，和其他html静态页面，这些页面的访问都要通过filter去验证。而事实上，这些静态元素没有什么安全上的需求，应该在filter中进行判断，不去效验这些请求，性能会好很多。另外，如果在filter中加上一定的cache，而不需要每一个cookie效验请求都去远端的身份认证服务中执行，性能也能大幅度提高。&lt;br /&gt;另外系统还需要很多其他的服务，如在内存中定时删除无用的cookie映射等等，都是一个严肃的解决方案需要考虑的问题。&lt;br /&gt;6 桌面SSO的实现&lt;br /&gt;从WEB-SSO的概念延伸开，我们可以把SSO的技术拓展到整个桌面的应用，不仅仅局限在浏览器。SSO的概念和原则都没有改变，只需要再做一点点的工作，就可以完成桌面 SSO 的应用。&lt;br /&gt;桌面SSO和WEB-SSO一样，关键的技术也在于如何在用户登录过后保存登录的凭据。在WEB-SSO中，登录的凭据是靠浏览器的cookie机制来完成的；在桌面应用中，可以将登录的凭证保存到任何地方，只要所有SSO的桌面应用都共享这个凭证。&lt;br /&gt;从网站可以&lt;a href=&quot;http://www.vscodes.com/&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color:#800080;&quot;&gt;下载&lt;/span&gt;&lt;/a&gt;一个简单的桌面SSO的样例(&lt;a href=&quot;http://gceclub.sun.com.cn/wangyu/desktop-sso/desktopsso.zip&quot;&gt;http://gceclub.sun.com.cn/wangyu/desktop-sso/desktopsso.zip&lt;/a&gt;)和全部源码（&lt;a href=&quot;http://gceclub.sun.com.cn/wangyu/desktop-sso/desktopsso_src.zip&quot;&gt;http://gceclub.sun.com.cn/wangyu/desktop-sso/desktopsso_src.zip&lt;/a&gt;），虽然简单，但是它具有桌面SSO大多数的功能，稍微加以扩充就可以成为自己的解决方案。&lt;br /&gt;&lt;br /&gt;6.1桌面样例的部署&lt;br /&gt;运行此桌面SSO需要三个前提条件：&lt;br /&gt;a) WEB-SSO的身份认证应用应该正在运行，因为我们在桌面SSO当中需要用到统一的认证服务&lt;br /&gt;b) 当前桌面需要运行Mozilla或Netscape浏览器，因为我们将ticket保存到mozilla的cookie文件中&lt;br /&gt;c) 必须在JDK1.4以上运行。（WEB-SSO需要JDK1.5以上）&lt;br /&gt;解开desktopsso.zip文件，里面有两个目录bin和lib。&lt;br /&gt;bin目录下有一些脚本文件和配置文件，其中config.properties包含了三个需要配置的参数：&lt;br /&gt;a) SSOServiceURL要指向WebSSO部署的身份认证的URL&lt;br /&gt;b) SSOLoginPage要指向WebSSO部署的身份认证的登录页面URL&lt;br /&gt;c) cookiefilepath要指向当前用户的mozilla所存放cookie的文件&lt;br /&gt;在bin目录下还有一个login.conf是用来配置JAAS登录模块，本样例提供了两个，读者可以任意选择其中一个（也可以都选），再重新运行程序，查看登录认证的变化&lt;br /&gt;在bin下的运行脚本可能需要作相应的修改&lt;br /&gt;a) 如果是在unix下，各个jar文件需要用“:”来隔开，而不是“;”&lt;br /&gt;b) java 运行程序需要放置在当前运行的路径下，否则需要加上java的路径全名。&lt;br /&gt;&lt;br /&gt;6.2桌面样例的运行&lt;br /&gt;样例程序包含三个简单的Java控制台程序，这三个程序单独运行都需要登录。如果运行第一个命叫“GameSystem”的程序，提示需要输入用户名和密码：&lt;br /&gt;效验成功以后，便会显示当前登录的用户的基本信息等等。&lt;br /&gt;&lt;br /&gt;这时候再运行第二个桌面Java应用（mailSystem）的时候，就不需要再登录了，直接就显示出来刚才登录的用户。&lt;br /&gt;第三个应用是logout，运行它之后，用户便退出系统。再访问的时候，又需要重新登录了。请读者再制裁执行完logout之后，重新验证一下前两个应用的SSO：先运行第二个应用，再运行第一个，会看到相同的效果。&lt;br /&gt;我们的样例并没有在这里停步，事实上，本样例不仅能够和在几个Java应用之间SSO，还能和浏览器进行SSO，也就是将浏览器也当成是桌面的一部分。这对一些行业有着不小的吸引力。&lt;br /&gt;这时候再打开Mozilla浏览器，访问以前提到的那两个WEB应用，会发现只要桌面应用如果登录过，Web应用就不用再登录了，而且能显示刚才登录的用户的信息。读者可以在几个桌面和Web应用之间进行登录和logout的试验，看看它们之间的SSO。&lt;br /&gt;6.3桌面样例的源码分析&lt;br /&gt;桌面SSO的样例使用了JAAS（要了解JAAS的详细的信息请参考&lt;a href=&quot;http://java.sun.com/products/jaas&quot;&gt;http://java.sun.com/products/jaas&lt;/a&gt;）。JAAS是对PAM（Pluggable Authentication Module）的Java实现，来完成 Java应用可插拔的安全认证模块。使用JAAS作为Java应用的安全认证模块有很多好处，最主要的是不需要修改&lt;a href=&quot;http://www.vscodes.com/&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color:#800080;&quot;&gt;源代码&lt;/span&gt;&lt;/a&gt;就可以更换认证方式。例如原有的Java应用如果使用JAAS的认证，如果需要应用SSO，只需要修改JAAS的配置文件就行了。现在在流行的J2EE和其他 Java的产品中，用户的身份认证都是通过JAAS来完成的。在样例中，我们就展示了这个功能。请看配置文件login.conf&lt;br /&gt;DesktopSSO {&lt;br /&gt;desktopsso.share.PasswordLoginModule required;&lt;br /&gt;desktopsso.share.DesktopSSOLoginModule required;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;当我们注解掉第二个模块的时候，只有第一个模块起作用。在这个模块的作用下，只有test用户（密码是12345）才能登录。当我们注解掉第一个模块的时候，只有第二个模块起作用，桌面SSO才会起作用。&lt;br /&gt;&lt;br /&gt;所有的Java桌面样例程序都是标准JAAS应用，熟悉JAAS的程序员会很快了解。JAAS中主要的是登录模块（LoginModule）。下面是SSO登录模块的源码：&lt;br /&gt;public class DesktopSSOLoginModule implements LoginModule {&lt;br /&gt;..........&lt;br /&gt;private String SSOServiceURL = &quot;&quot;;&lt;br /&gt;private String SSOLoginPage = &quot;&quot;;&lt;br /&gt;private static String cookiefilepath = &quot;&quot;;&lt;br /&gt;.........&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;在config.properties的文件中，我们配置了它们的值：&lt;br /&gt;SSOServiceURL=http://wangyu.prc.sun.com:8080/SSOAuth/SSOAuth&lt;br /&gt;SSOLoginPage=http://wangyu.prc.sun.com:8080/SSOAuth/login.jsp&lt;br /&gt;cookiefilepath=C:\\Documents and Settings\\yw137672\\Application Data\\Mozilla\\Profiles\\default\\hog6z1ji.slt\\cookies.txt&lt;br /&gt;&lt;br /&gt;SSOServiceURL和SSOLoginPage成员变量指向了在Web-SSO中用过的身份认证模块：SSOAuth，这就说明在桌面系统中我们试图和Web应用共用一个认证服务。而cookiefilepath成员变量则泄露了一个“天机”：我们使用了Mozilla浏览器的cookie文件来保存登录的凭证。换句话说，和Mozilla共用了一个保存登录凭证的机制。之所以用Mozilla是应为它的Cookie文件格式简单，很容易编程访问和修改任意的Cookie值。（我试图解析Internet Explorer的cookie文件但没有成功。）&lt;br /&gt;下面是登录模块DesktopSSOLoginModule的主体：login()方法。逻辑也是非常简单：先用Cookie来登陆，如果成功，则直接就进入系统，否则需要用户输入用户名和密码来登录系统。&lt;br /&gt;public boolean login() throws LoginException{&lt;br /&gt;try {&lt;br /&gt;if (Cookielogin()) return true;&lt;br /&gt;} catch (IOException ex) {&lt;br /&gt;ex.printStackTrace();&lt;br /&gt;}&lt;br /&gt;if (passwordlogin()) return true;&lt;br /&gt;throw new FailedLoginException();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;下面是Cookielogin()方法的实体，它的逻辑是：先从Cookie文件中获得相应的Cookie值，通过身份效验服务效验Cookie的有效性。如果cookie有效就算登录成功；如果不成功或Cookie不存在，用cookie登录就算失败。&lt;br /&gt;public boolean Cookielogin() throws LoginException,IOException {&lt;br /&gt;String cookieValue=&quot;&quot;;&lt;br /&gt;int cookieIndex =foundCookie();&lt;br /&gt;if (cookieIndex&amp;lt;0)&lt;br /&gt;return false;&lt;br /&gt;else&lt;br /&gt;cookieValue = getCookieValue(cookieIndex);&lt;br /&gt;username = cookieAuth(cookieValue);&lt;br /&gt;if (! username.equals(&quot;failed&quot;)) {&lt;br /&gt;loginSuccess = true;&lt;br /&gt;return true;&lt;br /&gt;}&lt;br /&gt;return false;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;用用户名和密码登录的方法要复杂一些，通过Callback的机制和屏幕输入输出进行信息交互，完成用户登录信息的获取；获取信息以后通过userAuth方法来调用远端SSOAuth的服务来判定当前登录的有效性。&lt;br /&gt;public boolean passwordlogin() throws LoginException {&lt;br /&gt;//&lt;br /&gt;// Since we need input from a user, we need a callback handler&lt;br /&gt;if (callbackHandler == null) {&lt;br /&gt;throw new LoginException(&quot;No CallbackHandler defined&quot;);&lt;br /&gt;}&lt;br /&gt;Callback[] callbacks = new Callback[2];&lt;br /&gt;callbacks[0] = new NameCallback(&quot;Username&quot;);&lt;br /&gt;callbacks[1] = new PasswordCallback(&quot;Password&quot;, false);&lt;br /&gt;//&lt;br /&gt;// Call the callback handler to get the username and password&lt;br /&gt;try {&lt;br /&gt;callbackHandler.handle(callbacks);&lt;br /&gt;username = ((NameCallback)callbacks[0]).getName();&lt;br /&gt;char[] temp = ((PasswordCallback)callbacks[1]).getPassword();&lt;br /&gt;password = new char[temp.length];&lt;br /&gt;System.arraycopy(temp, 0, password, 0, temp.length);&lt;br /&gt;((PasswordCallback)callbacks[1]).clearPassword();&lt;br /&gt;} catch (IOException ioe) {&lt;br /&gt;throw new LoginException(ioe.toString());&lt;br /&gt;} catch (UnsupportedCallbackException uce) {&lt;br /&gt;throw new LoginException(uce.toString());&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;System.out.println();&lt;br /&gt;String authresult =&quot;&quot;;&lt;br /&gt;try {&lt;br /&gt;authresult = userAuth(username, password);&lt;br /&gt;} catch (IOException ex) {&lt;br /&gt;ex.printStackTrace();&lt;br /&gt;}&lt;br /&gt;if (! authresult.equals(&quot;failed&quot;)) {&lt;br /&gt;loginSuccess= true;&lt;br /&gt;clearPassword();&lt;br /&gt;try {&lt;br /&gt;updateCookie(authresult);&lt;br /&gt;} catch (IOException ex) {&lt;br /&gt;ex.printStackTrace();&lt;br /&gt;}&lt;br /&gt;return true;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;loginSuccess = false;&lt;br /&gt;username = null;&lt;br /&gt;clearPassword();&lt;br /&gt;System.out.println( &quot;Login: PasswordLoginModule FAIL&quot; );&lt;br /&gt;throw new FailedLoginException();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CookieAuth和userAuth方法都是利用apahce的httpclient工具包和远程的SSOAuth进行http连接，获取服务。&lt;br /&gt;private String cookieAuth(String cookievalue) throws IOException{&lt;br /&gt;String result = &quot;failed&quot;;&lt;br /&gt;&lt;br /&gt;HttpClient httpclient = new HttpClient();&lt;br /&gt;GetMethod httpget = new GetMethod(SSOServiceURL+Action1+cookievalue);&lt;br /&gt;&lt;br /&gt;try {&lt;br /&gt;httpclient.executeMethod(httpget);&lt;br /&gt;result = httpget.getResponseBodyAsString();&lt;br /&gt;} finally {&lt;br /&gt;httpget.releaseConnection();&lt;br /&gt;}&lt;br /&gt;return result;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private String userAuth(String username, char[] password) throws IOException{&lt;br /&gt;String result = &quot;failed&quot;;&lt;br /&gt;String passwd= new String(password);&lt;br /&gt;HttpClient httpclient = new HttpClient();&lt;br /&gt;GetMethod httpget = new GetMethod(SSOServiceURL+Action2+username+&quot;&amp;amp;password=&quot;+passwd);&lt;br /&gt;passwd = null;&lt;br /&gt;&lt;br /&gt;try {&lt;br /&gt;httpclient.executeMethod(httpget);&lt;br /&gt;result = httpget.getResponseBodyAsString();&lt;br /&gt;} finally {&lt;br /&gt;httpget.releaseConnection();&lt;br /&gt;}&lt;br /&gt;return result;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;还有一个地方需要补充说明的是，在本样例中，用户名和密码的输入都会在屏幕上显示明文。如果希望用掩码形式来显示密码，以提高安全性，请参考：&lt;a href=&quot;http://java.sun.com/developer/technicalArticles/Security/pwordmask/7%20真正安全的全方位SSO解决方案：Kerberos%3Cbr%20/%3E我们的样例程序（桌面SSO和WEB-SSO）都有一个共性：要想将一个应用集成到我们的SSO解决方案中，或多或少的需要修改应用程序。Web应用需要配置一个我们预制的filter；桌面应用需要加上我们桌面SSO的JAAS模块（至少要修改JAAS的配置文件）。可是有很多程序是没有%3Ca%20href=&quot; target=&quot;_blank&quot; color=&quot;#800080&quot;&gt;http://java.sun.com/developer/technicalArticles/Security/pwordmask/7%20真正安全的全方位SSO解决方案：Kerberos%3Cbr%20/%3E我们的样例程序（桌面SSO和WEB-SSO）都有一个共性：要想将一个应用集成到我们的SSO解决方案中，或多或少的需要修改应用程序。Web应用需要配置一个我们预制的filter；桌面应用需要加上我们桌面SSO的JAAS模块（至少要修改JAAS的配置文件）。可是有很多程序是没有%3Ca%20href=&lt;/a&gt;)，由MIT学校发明，被主流的操作系统所采用。在采用kerberos的平台中，登录和认证是由操作系统本身来维护，认证的凭证也由操作系统来保存，这样整个桌面都可以处于同一个SSO的系统保护中。操作系统中的各个应用（如ftp,telnet）只需要通过配置就能加入到SSO中。另外使用Kerberos最大的好处在于它的安全性。通过密钥算法的保证和密钥中心的建立，可以做到用户的密码根本不需要在网络中传输，而传输的信息也会十分的安全。&lt;br /&gt;目前支持Kerberos的操作系统包括Solaris, windows,Linux等等主流的平台。只不过要搭建一个Kerberos的环境比较复杂，KDC（密钥分发中心）的建立也需要相当的步骤。Kerberos拥有非常成熟的API，包括Java的API。使用Java Generic Security Services(GSS) API并且使用JAAS中对Kerberos的支持（详细信息请参见Sun的Java&amp;amp;Kerberos教程&lt;a href=&quot;http://java.sun.com/&quot;&gt;http://java.sun.com/&lt;/a&gt; j2se/1.5.0/docs/guide/security/jgss/tutorials/index.html），要将我们这个样例改造成对Kerberos的支持也是不难的。 值得一提的是在JDK6.0 （&lt;a href=&quot;http://www.java.net/download/jdk6&quot;&gt;http://www.java.net/download/jdk6&lt;/a&gt;）当中直接就包含了对GSS的支持，不需要单独&lt;a href=&quot;http://www.vscodes.com/&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color:#800080;&quot;&gt;下载&lt;/span&gt;&lt;/a&gt;GSS的包。&lt;br /&gt;&lt;br /&gt;8 总结&lt;br /&gt;本文的主要目的是阐述SSO的基本原理，并提供了一种实现的方式。通过对&lt;a href=&quot;http://www.vscodes.com/&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color:#800080;&quot;&gt;源代码&lt;/span&gt;&lt;/a&gt;的分析来掌握开发SSO服务的技术要点和充分理解SSO的应用范围。但是，本文仅仅说明了身份认证的服务，而另外一个和身份认证密不可分的服务----权限效验，却没有提到。要开发出真正的SSO的产品，在功能上、性能上和安全上都必须有更加完备的考虑。&lt;br /&gt;作者简介&lt;br /&gt;王昱是Sun中国工程研究院的Java工程师，现在的主要负责全球合作伙伴的技术支持。作为一名Java资深工程师和架构师，王昱在Java 的很多领域都有多年的造诣，特别是在Java虚拟机、J2EE技术(包括EJB, JSP/Servlet, JMS和Web services等技术)、集群技术和Java应用性能调优上有着较为丰富的经验。曾经多次在重要的Java会议发表演讲，并在国际著名的Java技术站 点发表文章。&lt;br /&gt;&lt;br /&gt;&lt;/i&gt;&lt;/i&gt;&lt;i&gt;&lt;i&gt;&lt;/i&gt;&lt;/i&gt;</content><link rel='replies' type='application/atom+xml' href='https://undancer.blogspot.com/feeds/2718675238869281701/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1102790865060223847/2718675238869281701' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/2718675238869281701'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/2718675238869281701'/><link rel='alternate' type='text/html' href='https://undancer.blogspot.com/2008/07/sso.html' title='编写你自己的单点登录（SSO）服务'/><author><name>undancer</name><uri>http://www.blogger.com/profile/05800974944226224562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1102790865060223847.post-5358881619402173825</id><published>2008-07-08T09:51:00.000+08:00</published><updated>2008-07-08T09:55:50.513+08:00</updated><title type='text'>[转]忽然读懂了《大话西游》...（作者不详）</title><content type='html'>世界是巨大的枷锁，你不得不重复自己或是别人的生活。&lt;br /&gt;&lt;br /&gt;记得长辈说过：年轻是一种罪过。他们说我们不成熟。&lt;br /&gt;&lt;br /&gt;真切地为自己的不俗喝彩，在深切的郁闷中，突然就看懂了《大话西游》的开头：一位才华横溢又无法无天的青年（孙悟空），根本不喜欢世人摊派给他的大事业（西天取经）。他尤其受不了师父（唐僧）的唠唠叨叨，可世俗条规（观音）又不放过他。为让他悔悟，心甘情愿地去取经，唐僧和观音达成妥协：让他五百年后重新做人。这真是一个宿命的开始。&lt;br /&gt;&lt;br /&gt;师兄曰：&quot;大学的孩子都是玻璃罐里养蛤蟆，前途光明出路不大。&quot;再贴切不过。大闹天宫无非是大学四年的黄金时光罢了，找到工作走上社会任你盖世的才华浑身的个性也自有翻不出的五指山来压。只有戴上紧箍咒取经去，九九八十一难，做一个奇奇怪怪的佛。你别无选择。&lt;br /&gt;&lt;br /&gt;五百年后的悟空叫至尊宝，在五岳山从事一份很有前途的职业--山贼。命运却要他扮演孙悟空，至尊宝只是个过渡罢了。蜘蛛精来了，白骨精来了，菩提老祖来了，牛魔王也来了……都是棋子，安静地立在命棋盘的中央。&lt;br /&gt;&lt;br /&gt;他的路线是早定好的：（1）一个人给他三颗痣（2）戴上紧箍咒（3）打败牛魔王（4）西天取经。可怜的至尊宝什么都不知道，认认真真做山贼，还爱上了白骨精，想和她结为百年之好。&lt;br /&gt;&lt;br /&gt;所有的事都瞒着他接二连三地发生。&lt;br /&gt;&lt;br /&gt;十年前我绝对不知道今天自己会在西安这所城市里打拼，如今已隐隐感受到那冥冥之中的牵引。可怕的是这还绝不是终点，不到游戏结束我不会知道答案。真相将揭晓，在我临死的瞬间。&lt;br /&gt;&lt;br /&gt;给至尊宝三颗痣的人是紫霞仙子。谁说的：总有一个女孩出现，让男孩最终成为男人。而男人永远都不可能得到她，那简直是一定的。&lt;br /&gt;&lt;br /&gt;非常喜欢紫霞的开场白：&quot;现在我郑重宣布，这座山上所有的东西都是我的，包括你。&quot;那样的气贯云霄，像一个童话故事。&lt;br /&gt;&lt;br /&gt;而现实是：这个世界没有什么属于你，包括你自己。也许我们就是为了创造属于自己的东西才来到这个世上，因为年轻，所以押注于爱情。&lt;br /&gt;&lt;br /&gt;至尊宝拒绝了紫霞，他以为自己还爱晶晶。见到晶晶，他又发现紫霞才是真爱。命运一直在同他开玩笑：至尊宝忽然成了孙悟空，千辛万苦找晶晶又爱上了紫霞。而抉择是那样残酷：要打败牛魔王救紫霞，就必须戴上紧箍咒做回神通广大的孙悟空；而戴上紧箍咒就不能有半点情欲，只有取经去。&lt;br /&gt;&lt;br /&gt;为至尊宝不平：不明白在这样的故事里为何爱情总要成为牺牲品，干嘛不让周星弛携紫霞纤纤小手--走先！爱情是那样美丽而脆弱，无法直面生活的琐碎和坚韧。哪段感情又没有绚烂的瞬间和艰难的长久，在一起就会幸福吗，未必。&lt;br /&gt;&lt;br /&gt;为紫霞叫好，&quot;我的生活我做主&quot;，一个仙子为了所爱所恨抛弃一切。虽然结局是她没有猜到了。可是她永远留在了人们的心里。&lt;br /&gt;&lt;br /&gt;至尊宝挖开自己的心，看到了紫霞留在那里的一滴眼泪，毕竟曾经沧海过。五百年又五百年，兜了一个大圈子又回到了原地。人没能战胜命运，而人的尊严却在抗争中得到了肯定，人的情感也必将不朽。&quot;生亦何欢，死亦何苦。&quot;大彻大悟。&lt;br /&gt;&lt;br /&gt;紧箍咒，圈住昔日的梦想，圈住棱角分明的个性。&lt;br /&gt;&lt;br /&gt;成熟是一个很痛的词，它不一定会得到，却一定会失去。&lt;br /&gt;&lt;br /&gt;罗曼蒂克、海誓山盟、生死相许……面对爱情这些都是琐碎，不值一提。爱情就是爱情，不是别的什么东西。能与爱情同在的只有生命，其他都滚一边儿去。&lt;br /&gt;&lt;br /&gt;你爱了，难道还不够吗？&lt;br /&gt;&lt;br /&gt;悟空爱了,不论晶晶还是紫霞，他都要将爱情进行到底。&lt;br /&gt;&lt;br /&gt;晶晶爱了，那个弃她而去的悟空，&quot;不能和喜欢的人在一起，做人又怎会开心。&quot;&lt;br /&gt;&lt;br /&gt;紫霞爱了，&quot;谁拔出我的紫青宝剑，谁就是我的如意郎君。&quot;&lt;br /&gt;&lt;br /&gt;爱一个人需要理由吗？&lt;br /&gt;&lt;br /&gt;孙悟空会爱白骨精，猪八戒爱上了蜘蛛精。紫霞爱他至深，因为他拔出了一把剑。&lt;br /&gt;&lt;br /&gt;故事里的人找爱人的理由永远千奇百怪：王子要用水晶鞋才能找到灰姑娘，薛宝钗要那有玉的人来配……可生活永远现实得多，芸芸众生，谁又能许谁一个未来，自欺欺人罢了。&lt;br /&gt;&lt;br /&gt;有理由也好，没理由也罢，可还是要爱。让我去，过程就是结果，无悔。至此后漫漫长路我独行。&lt;br /&gt;&lt;br /&gt;爱无须掩饰无须矫做无须患得患失，只要像紫霞一样说：&quot;让我们立刻开始这段感情吧！先亲我一下。&quot;&lt;br /&gt;&lt;br /&gt;晶晶口中道：&quot;我再也不会为这个男人心痛了。&quot;可还是要为他拔剑与人拼命。&lt;br /&gt;&lt;br /&gt;至尊宝梦中也要叫紫霞的名字七百四十一次，不知道的人觉得紫霞一定欠了他很多钱。&lt;br /&gt;&lt;br /&gt;爱是身不由己。&lt;br /&gt;&lt;br /&gt;紫霞说：&quot;就象飞蛾，明知会受伤也要扑到火上。&quot;&quot;我无力抗拒，向你狂奔去。&quot;无可救药的痴迷。&lt;br /&gt;&lt;br /&gt;爱是奋不顾身。&lt;br /&gt;&lt;br /&gt;至尊宝对晶晶说：&quot;你杀了我吧，我不希望你看我的时候心里却想着别的人。&quot;&lt;br /&gt;&lt;br /&gt;晶晶以为：&quot;都是骗我的。&quot;跳下崖去。&lt;br /&gt;&lt;br /&gt;紫霞把身体挡在至尊宝面前，刺进牛魔王的铁叉里。&lt;br /&gt;&lt;br /&gt;一时间，以后的人生如何，大家都无所谓了。连那样宝贵的性命，也打算随时给爱情作了祭品。一个个一头扎进这情爱苦海，宁愿永生永世不得超生。&lt;br /&gt;&lt;br /&gt;爱是深刻莫测的。&lt;br /&gt;&lt;br /&gt;三十娘流着泪说：&quot;想我春三十娘貌美如花，却跟这么丑的人有了。&quot;这是多少美丽自负的女子的宿命：心中的他是能文能武翩翩少年，枕边人却鼾声如雷大腹便便。谁敢说多年后眼望自己的丈夫不会有如此感觉，真不知幸福还是心酸。不过还是要为他挺身而去无限牺牲，像春三十娘为猪八戒放下断龙石与牛魔王同归于尽。&lt;br /&gt;&lt;br /&gt;晶晶爱悟空，至尊宝爱晶晶，紫霞爱至尊宝，&quot;他爱你你爱我我爱他&quot;，千古无解的方程。《白马啸西风》里说：&quot;如果你深深爱着的人，却又深深爱上了别人，能有什么法子？&quot;&lt;br /&gt;&lt;br /&gt;所以紫霞说：&quot;爱一个人原来是那么痛苦。&quot;晶晶找不到那个抛弃她的悟空（象不象殷离），告诉至尊宝：&quot;你经过五百年回来要找的不是我。&quot;至尊宝原以为可以与初恋共度今生，谁知初恋的时候并不懂情爱人生。当年被他推开的紫霞已经悄无声息地抵达他灵魂的最深处，而他却不自知。可紫霞死了：&quot;我的意中人是个盖世英雄，有一天他会踩着七色的云彩来娶我，我猜中了前头，可是我猜不着这结局……&quot;&lt;br /&gt;&lt;br /&gt;没有人猜得中结局，一切随风而去。&lt;br /&gt;&lt;br /&gt;恋爱的时候我们都不懂爱情，懂得爱情后却失去了可以相爱的时光。&lt;br /&gt;&lt;br /&gt;最绝望不是他不爱你或他离你而去，最绝望是你忘记了怎么去爱一个人，你已丧失了爱的能力。&lt;br /&gt;&lt;br /&gt;请记住下面的台词：&quot;曾经有一份真诚的爱情摆在我的面前，但是我没有珍惜。等到了失去的时候才后悔莫及，尘世间最痛苦的事莫过于此。如果上天可以给我一个机会再来一次的话，我会对你说三个字&quot;我爱你&quot;。如果非要把这份爱加上一个期限，我希望是一万年！&quot;也顺便记住这段话的原版，在王家卫的《重庆森林》里：&quot;如果记忆是一个罐头，我希望它永远都不会过期，如果一定要加上一个期限的话，我希望是一万年。&quot;&lt;br /&gt;&lt;br /&gt;至尊宝第一次说这番话是骗紫霞，第二次说已痛不欲生。总有一天，你会在灵魂最温柔的一隅为她重复这段话，为了你们即将封存的一万年。&quot;如果有一天我忍不住问你，你一定要骗我。不管你心里有多么不愿意，你都不要告诉我你从来没有喜欢过我。&quot;&lt;br /&gt;&lt;br /&gt;此情可待成追忆&lt;br /&gt;&lt;br /&gt;只是当时已惘然！&lt;br /&gt;&lt;br /&gt;经历过和正在经历着悟空式的命运和紫霞式的爱情，才发现生命的本质是以最低的姿态出现的。&lt;br /&gt;&lt;br /&gt;英雄？你为什么不问问做英雄的代价......</content><link rel='replies' type='application/atom+xml' href='https://undancer.blogspot.com/feeds/5358881619402173825/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1102790865060223847/5358881619402173825' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/5358881619402173825'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/5358881619402173825'/><link rel='alternate' type='text/html' href='https://undancer.blogspot.com/2008/07/blog-post.html' title='[转]忽然读懂了《大话西游》...（作者不详）'/><author><name>undancer</name><uri>http://www.blogger.com/profile/05800974944226224562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1102790865060223847.post-327772953497385976</id><published>2008-06-29T20:41:00.000+08:00</published><updated>2008-06-29T20:42:06.451+08:00</updated><title type='text'>test</title><content type='html'>&lt;br /&gt;&lt;p&gt;&lt;a href=&quot;http:/1.gif&quot; rel=&quot;lightbox&quot; title=&quot;1.gif&quot;&gt;&lt;img src=&quot;http:/1_tn.jpg&quot; title=&quot;1.gif&quot; height=&quot;136&quot; width=&quot;136&quot; alt=&quot;1.gif&quot; border=&quot;0&quot; id=&quot;urn:zoundry:jid:1.gif&quot;/&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='https://undancer.blogspot.com/feeds/327772953497385976/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1102790865060223847/327772953497385976' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/327772953497385976'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/327772953497385976'/><link rel='alternate' type='text/html' href='https://undancer.blogspot.com/2008/06/test_29.html' title='test'/><author><name>undancer</name><uri>http://www.blogger.com/profile/05800974944226224562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1102790865060223847.post-3631685941766539693</id><published>2007-11-17T18:05:00.001+08:00</published><updated>2007-11-17T18:05:39.646+08:00</updated><title type='text'>10个保持注意力的技巧</title><content type='html'>原文地址：&lt;a href=&quot;http://www.lifehack.org/articles/productivity/10-tips-for-razor-sharp-concentration.html&quot;&gt;10 Tips for Razor Sharp Concentration&lt;/a&gt;&lt;br /&gt;翻译：&lt;a title=&quot;Hubjune&quot; href=&quot;http://angelived.org//&quot;&gt;Angelived&lt;/a&gt;&lt;br /&gt;也许养成给日程计划列清单排表格的习惯能使你的工作更有条理，然而同样是为了提高效率，我相信能 掌握一些保持专注的技巧也很重要。如果你有定力能够安静地坐在台前全神贯注投入工作长达几个小时，我敢保证，在这样的状态下，即使是半个小时的工作，也一 定比不断分心常遭干扰的一天的工作能取得更多的成果。&lt;br /&gt;一、杜绝干扰&lt;br /&gt;很明显，周遭的干扰足以让你在工作中心神不宁，那么你排除了这些干扰吗？不得不承认，运行自动收 信软件（译者注：如Gmail Notifier、MSN Messenger，一般电子邮件客户端也具有此项功能，如：Mozilla Thunderbird、Microsoft Outlook、Foxmail等）能保证你在第一时间阅读来信，开着即时通讯软件（译者注：IM即Instant Messenger，如ICQ、MSN Messenger、Gtalk等）有一句没一句地回复网友们的招呼能消减工作时的寂寞，但是它们都是随时能打断工作的干扰源，你需要杜绝它们。&lt;br /&gt;一般进入专注状态需要15分钟时间，如果每5分钟就要被打断一次，你又如何能够聚精会神？所以，请特别安排划分一段时间以供查收和处理邮件，请尽量避免在电话及来访繁忙的时段安排工作，并告诉相关的人不要在你工作时打扰你。&lt;br /&gt;二、安排合适的工作场合&lt;br /&gt;工作环境对你能否专注工作有很大的影响。请把自己的座位安排在能方便够及干扰源的地方，比如正对门窗，比如让电话顺手可及，如此一来，简单无意的一瞥即可排除门窗产生的杂音，顺手一拿即可接听电话，这样才能使你的分心降低到最小程度。&lt;br /&gt;三、明确目标&lt;br /&gt;请在工作开始前就明确自己的目标。如果你对自己需要完成什么工作都不知道，这种困扰会严重影响专注程度。在作文之前，我会先想明白文章的主题并在脑里陈列提纲打个粗稿。少了“明确目标”这一步往往会导致部分工作的返工。&lt;br /&gt;四、理出头绪&lt;br /&gt;脑里七七八八的一大摞任务很难让你全神贯注。在工作开始前，除了要明确目标以外，你还应该花上几分钟时间为大堆的零碎任务理出头绪分清秩序，否则你就得在工作中浪费几个小时来处理任务间的混乱和冲突了。&lt;br /&gt;五、弄清任务要求&lt;br /&gt;请在处理任务之前弄清它的指标和要求，比如：任务的质量要求；任务的标准要求；以及任务进行过 程中会受到怎样的限制。如果你是个程序员，你需要搞清所写代码的注释语句密度标准（译者注：注释语句，是为了增加代码可读性的解释性语句，不会被编译器翻 译成可执行的机器代码。），需要调用哪些函数（译者注：函数，是程序的基本单元，是被封装起来能完成特定功能的代码段。对于C或者Fortran之类的非 高级编程语言，明确了需要调用的函数，你就可以在程序开始处将相关的函数文件包含进来，以提高编程效率。），程序的灵活性要求如何等等。如果你在作文，在 这之前就需首先为自己指定好行文风格并做出文书长度的规定。如果在任务开始之初没有弄清任务要求，就会引起无规则行事的混乱局面，那时你将在过程中不断考 虑和转变这些要求而不停返工，不但工作流程无法顺畅执行，这些停断也会使你无法专注。&lt;br /&gt;六、指定时限&lt;br /&gt;为自己强行指定时限完成任务对于工作专注度的影响有好也有坏。一个存在于意识中的时限能够使你忘记琐碎的小事并提升你的工作速度。如果你规定自己一小时之内必须完成一个徽标的设计，就能避免自己使用花里胡哨的废装赘饰，从而使徽标保持简洁清爽的面目并提高设计效率。&lt;br /&gt;时限也会令你陷入无法按时完成工作的焦虑而难以专心于手头实际的工作，所以我建议只在这些情况下为自己设定时限：&lt;br /&gt;任务时间有限。如果你需要在一天内完成一个可能花费几周时间的工作，就该为任务划分成块，分别设定时限，如此才能保证在短时间内完成任务的重要部分。&lt;br /&gt;当你遇上那些非常容易扩展伸延的任务。如果你的任务很容易延伸扩展出其他的要求并不断产生子任务，时限可以使你更好地控制进度而不至于东奔西走陷入混乱。&lt;br /&gt;避免拖延和耽搁。当你担心自己的困怠是否会耽误任务进度时，设定一个时限就是为自己安排了一个监工。&lt;br /&gt;七、清除障碍&lt;br /&gt;工作中遇到棘手的问题时难免就会碰上障碍，当你思路受阻时必定心烦意乱难以专注。这时你需要纸笔进行头脑风暴，即便在遇到障碍时灰心丧气，写下思路却能使你依然保持精神的集中而不至于心猿意马。&lt;br /&gt;八、隔离自己&lt;br /&gt;除非需要团队合作，否则请你在工作中做个隐士，在闹哄哄的工作环境中隔离自己，构筑一个私人空间，必要时给门贴上“工作中，拒绝打扰”的标识，拔掉电话线，直到工作完成再去与人闲聊攀谈。构建这样的工作环境才能使你更好地专注于工作。&lt;br /&gt;九、健康能够驱动头脑飞转&lt;br /&gt;身体状况决定了专注程度。没人会指望一个醉醺醺的家伙能百分百地投入工作。长期睡眠不足；过度 使用兴奋药物（比如咖啡因）；酽饮浓食；摄入过多能量，这些都会影响你集中注意的能力。请戒绝其中某个不良的生活习惯，保持一个月，看看你的体质是否得到 改善，我的个人经验是，只需要改变一丁点儿生活行为，就可以大幅提高专心能力。&lt;br /&gt;十、保持耐心&lt;br /&gt;在把手指放上键盘开始作文之前，我通常会在座位上安坐15～20分钟以使自己心定气闲，在这期间我总有一股站起身来离开的冲动，但我会说服自己：只有保持耐心才能专心致志地卯定文题，思流顺畅，文路扩扬。&lt;br /&gt;如果需要保持集中的心思专注，我建议你把工作以90～120分钟为界分割成段。这个分段的长短因人而异，需要根据自身特点进行设计，时间短了则会使你浪费过多时间来调节自己进入工作状态，反之则会因为工作时间太长而降低效率并分散注意力。</content><link rel='replies' type='application/atom+xml' href='https://undancer.blogspot.com/feeds/3631685941766539693/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1102790865060223847/3631685941766539693' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/3631685941766539693'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/3631685941766539693'/><link rel='alternate' type='text/html' href='https://undancer.blogspot.com/2007/11/10.html' title='10个保持注意力的技巧'/><author><name>undancer</name><uri>http://www.blogger.com/profile/05800974944226224562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1102790865060223847.post-6932684622423310998</id><published>2007-11-07T06:25:00.000+08:00</published><updated>2007-11-07T06:26:23.552+08:00</updated><title type='text'></title><content type='html'>2005年9月6日 00:12 &lt;br /&gt;渴望飞翔的人注定要死于大地，仰面看天的孩子却也渴望大海 &lt;br /&gt;评论(11) 编辑 删除 2005年9月4日 19:10 &lt;br /&gt;抛弃稚气仅剩下满目疮夷的空虚 &lt;br /&gt;评论(3) 编辑 删除 2005年7月9日 06:22 &lt;br /&gt;Mum says that holding hands is happy,But I&#39;m only single. &lt;br /&gt;评论(0) 编辑 删除 2005年6月30日 03:10 &lt;br /&gt;妈妈说钩钩小指就是幸福，我只能一个人幸福。 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2006年9月26日 11:49 &lt;br /&gt;再平静的海，也有情绪。有谁肯去聆听？ &lt;br /&gt;评论(0) 编辑 删除 2006年9月25日 01:49 &lt;br /&gt;还活着，好累。 &lt;br /&gt;评论(0) 编辑 删除 2006年8月23日 20:20 &lt;br /&gt;N36.40.10    E117.02.58  &lt;br /&gt;评论(0) 编辑 删除 2006年8月14日 22:14 &lt;br /&gt;我坚强着，直到连坚强的理由都遗忘。然后倒下。 &lt;br /&gt;评论(0) 编辑 删除 2006年7月24日 23:47 &lt;br /&gt;八十万一碗的面条，那得放多少鸡蛋吖？ &lt;br /&gt;评论(1) 编辑 删除 2005年9月14日 01:42 &lt;br /&gt;瞬间·感动 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;评论(0) 编辑 删除 2006年12月5日 19:10 &lt;br /&gt;明年春暖花开之日，便是我化冻之时。 &lt;br /&gt;评论(0) 编辑 删除 2006年11月21日 06:23 &lt;br /&gt;这是你给我选的路，我要走下去。 &lt;br /&gt;评论(0) 编辑 删除 2006年10月13日 14:01 &lt;br /&gt;暗夜哭泣的精灵，用歌声救赎了世人，却无法给自己痛苦的心灵一个庇护。 &lt;br /&gt;评论(0) 编辑 删除 2006年10月10日 21:11 &lt;br /&gt;煎熬 &lt;br /&gt;评论(0) 编辑 删除 2006年10月3日 09:06 &lt;br /&gt;又回到了画饼充饥的时代，再看我，小心我色你。 &lt;br /&gt;评论(0) 编辑 删除 2006年9月30日 16:36 &lt;br /&gt;再看我,小心我色你 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;评论(0) 编辑 删除 2007年2月5日 16:36 &lt;br /&gt;2007年2月5日，夜。回家。。。 &lt;br /&gt;评论(0) 编辑 删除 2007年1月25日 02:28 &lt;br /&gt;http://www.travian.cn/ &lt;br /&gt;评论(0) 编辑 删除 2007年1月4日 14:41 &lt;br /&gt;私おやすみなさい &lt;br /&gt;评论(0) 编辑 删除 2006年12月29日 03:03 &lt;br /&gt;日语自学中，设计模式自学中，EJB已完结，ASP.NET待续中。。。心情，火化中。。。。 &lt;br /&gt;评论(0) 编辑 删除 2006年12月24日 12:26 &lt;br /&gt;myBlogger:undancer.blogspot.com &lt;br /&gt;评论(0) 编辑 删除 2006年12月24日 12:26 &lt;br /&gt;my Blogger:undancer.blogspot.com &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;评论(0) 编辑 删除 2007年2月25日 17:26 &lt;br /&gt;如果这是光明的，就让我一直站在暗处。  我愿看着光明，却不肯让光去照耀我心灵的暗处。 &lt;br /&gt;评论(0) 编辑 删除 2007年2月20日 00:07 &lt;br /&gt;寻找Pure.White...可是找到了还能怎样。我还是就这样吧。。。不幸的2007年。 &lt;br /&gt;评论(0) 编辑 删除 2007年2月14日 14:57 &lt;br /&gt;超越物资世界的存在着。。。</content><link rel='replies' type='application/atom+xml' href='https://undancer.blogspot.com/feeds/6932684622423310998/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1102790865060223847/6932684622423310998' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/6932684622423310998'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/6932684622423310998'/><link rel='alternate' type='text/html' href='https://undancer.blogspot.com/2007/11/200596-0012-11-200594-1910-3-200579.html' title=''/><author><name>undancer</name><uri>http://www.blogger.com/profile/05800974944226224562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1102790865060223847.post-8099323396706312106</id><published>2007-05-23T00:23:00.000+08:00</published><updated>2007-05-23T00:34:25.310+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="IOC"/><title type='text'>介绍IOC</title><content type='html'>&lt;span id=&quot;ArticleContent1_ArticleContent1_lblContent&quot;&gt;&lt;div class=&quot;Section1&quot; style=&quot;&quot;&gt;&lt;span style=&quot;color: rgb(51, 51, 153);font-family:&#39;Courier New&#39;;&quot;  lang=&quot;EN-US&quot;&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;;font-family:宋体;color:navy;&quot;  &gt;作者：冰云&lt;/span&gt;&lt;span style=&quot;;font-family:&#39;Courier New&#39;;color:navy;&quot;   lang=&quot;EN-US&quot;&gt; icecloud(AT)sina.com&lt;br /&gt;BLOG: &lt;a href=&quot;http://icecloud.51.net/&quot;&gt;http://icecloud.51.net&lt;/a&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;;font-family:宋体;color:navy;&quot;  &gt;时间：&lt;/span&gt;&lt;span style=&quot;;font-family:&#39;Courier New&#39;;color:navy;&quot;   lang=&quot;EN-US&quot;&gt;2004.02.15&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt; &lt;table class=&quot;MsoTableGrid&quot; border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td bg height=&quot;216&quot; valign=&quot;top&quot; width=&quot;500&quot; style=&quot;color:#eaeaea;&quot;&gt; &lt;blockquote&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(204, 0, 0);font-family:宋体;&quot; &gt; &lt;p class=&quot;MsoNormal&quot;&gt; &lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;版权声明：&lt;/p&gt; &lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;本文由冰云完成，首发于&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;CSDN&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;，作者保留中文版权。&lt;br /&gt;未经许可，不得使用于任何商业用途。&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;欢迎转载，但请保持文章及版权声明完整。&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;如需联络请发邮件：&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;icecloud(AT)sina.com&lt;/span&gt;&lt;/blockquote&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;/span&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(51, 51, 153);font-family:宋体;&quot; &gt;一、什么是&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(51, 51, 153);font-family:&#39;Courier New&#39;;&quot;  lang=&quot;EN-US&quot;&gt;IOC&lt;/span&gt;&lt;/b&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt;&quot;&gt;&lt;span  lang=&quot;EN-GB&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;IoC&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;就是&lt;/span&gt;&lt;span  lang=&quot;EN-GB&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Inversion of Control&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;，控制反转。在&lt;/span&gt;&lt;span  lang=&quot;EN-GB&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Java&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;开发中，&lt;/span&gt;&lt;span  lang=&quot;EN-GB&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;IoC&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;意味着将你设计好的类交给系统去控制，而不是在你的类内部控制。这称为控制反转。&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt;&quot;&gt;&lt;span  lang=&quot;EN-GB&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;/span&gt; &lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt;&quot;&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;下面我们以几个例子来说明什么是&lt;/span&gt;&lt;span  lang=&quot;EN-GB&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;IoC&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt;&quot;&gt;&lt;span  lang=&quot;EN-GB&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;/span&gt; &lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt;&quot;&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;假设我们要设计一个&lt;/span&gt;&lt;span  lang=&quot;EN-GB&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Girl&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;和一个&lt;/span&gt;&lt;span  lang=&quot;EN-GB&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Boy&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;类，其中&lt;/span&gt;&lt;span  lang=&quot;EN-GB&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Girl&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;有&lt;/span&gt;&lt;span  lang=&quot;EN-GB&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;kiss&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;方法，即&lt;/span&gt;&lt;span  lang=&quot;EN-GB&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Girl&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;想要&lt;/span&gt;&lt;span  lang=&quot;EN-GB&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Kiss&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;一个&lt;/span&gt;&lt;span  lang=&quot;EN-GB&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Boy&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;。那么，我们的问题是，&lt;/span&gt;&lt;span  lang=&quot;EN-GB&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Girl&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;如何能够认识这个&lt;/span&gt;&lt;span  lang=&quot;EN-GB&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Boy&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;？&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: center;&quot; align=&quot;center&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; align=&quot;center&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://dev.csdn.net/Develop/ArticleImages/24/24397/CSDN_Dev_Image_2004-2-16115390.gif&quot; align=&quot;bottom&quot; border=&quot;0&quot; hspace=&quot;0&quot; /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;在我们中国，常见的ＭＭ与&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;GG&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;的认识方式有以下几种&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;１　青梅竹马；&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;２　亲友介绍；&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;３　父母包办&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;/span&gt; &lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;那么哪一种才是最好呢？&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;    &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(51, 51, 153);font-family:宋体;&quot; &gt;青梅竹马&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;：&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Girl&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;从小就知道自己的&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Boy&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;。&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;    &lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: center;&quot; align=&quot;center&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; align=&quot;center&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://dev.csdn.net/Develop/ArticleImages/24/24397/CSDN_Dev_Image_2004-2-16115392.gif&quot; align=&quot;bottom&quot; border=&quot;0&quot; hspace=&quot;0&quot; /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;    &lt;/p&gt; &lt;div align=&quot;center&quot;&gt; &lt;table class=&quot;MsoTableGrid&quot; style=&quot;border: medium none ; background: rgb(230, 230, 230) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; margin-left: 23.4pt; border-collapse: collapse;&quot; border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td style=&quot;border: 1pt solid windowtext; padding: 0cm 5.4pt; width: 387pt;&quot; valign=&quot;top&quot; width=&quot;516&quot;&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: left;&quot; align=&quot;left&quot;&gt;&lt;b&gt;&lt;span style=&quot;background: white none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; color: rgb(127, 0, 85);font-family:&#39;Courier New&#39;;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;&lt;/span&gt;&lt;/b&gt; &lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: left;&quot; align=&quot;left&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(127, 0, 85);font-family:&#39;Courier New&#39;;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;public&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;;font-family:&#39;Courier New&#39;;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(127, 0, 85);font-family:&#39;Courier New&#39;;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;class&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;;font-family:&#39;Courier New&#39;;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt; Girl {&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;;font-family:&#39;Courier New&#39;;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;    &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(127, 0, 85);font-family:&#39;Courier New&#39;;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;void&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;;font-family:&#39;Courier New&#39;;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt; kiss(){&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;;font-family:&#39;Courier New&#39;;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;       Boy boy = &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(127, 0, 85);font-family:&#39;Courier New&#39;;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;;font-family:&#39;Courier New&#39;;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt; Boy();&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;;font-family:&#39;Courier New&#39;;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;;font-family:&#39;Courier New&#39;;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;}&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;/span&gt; &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;/span&gt; &lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;然而从开始就创建的&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Boy&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;缺点就是无法在更换。并且要负责&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Boy&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;的整个生命周期。如果我们的&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Girl&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;想要换一个怎么办？（笔者严重不支持&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Girl&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;经常更换&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Boy&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;）&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;/span&gt; &lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;    &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(51, 51, 153);font-family:宋体;&quot; &gt;亲友介绍&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;：由中间人负责提供&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Boy&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;来见面&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: center;&quot; align=&quot;center&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://dev.csdn.net/Develop/ArticleImages/24/24397/CSDN_Dev_Image_2004-2-16115394.gif&quot; align=&quot;bottom&quot; border=&quot;0&quot; hspace=&quot;0&quot; /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;        &lt;/span&gt;&lt;/p&gt; &lt;div align=&quot;center&quot;&gt; &lt;table class=&quot;MsoTableGrid&quot; style=&quot;border: medium none ; background: rgb(230, 230, 230) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; margin-left: 23.4pt; border-collapse: collapse;&quot; border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td style=&quot;border: 1pt solid windowtext; padding: 0cm 5.4pt; width: 387pt;&quot; valign=&quot;top&quot; width=&quot;516&quot;&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: left;&quot; align=&quot;left&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(127, 0, 85);font-family:&#39;Courier New&#39;;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;&lt;br /&gt;public&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;;font-family:&#39;Courier New&#39;;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(127, 0, 85);font-family:&#39;Courier New&#39;;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;class&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;;font-family:&#39;Courier New&#39;;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt; Girl {&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;;font-family:&#39;Courier New&#39;;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;    &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(127, 0, 85);font-family:&#39;Courier New&#39;;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;void&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;;font-family:&#39;Courier New&#39;;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt; kiss(){&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;;font-family:&#39;Courier New&#39;;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;       Boy boy = BoyFactory.createBoy();    &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;;font-family:&#39;Courier New&#39;;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;;font-family:&#39;Courier New&#39;;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;}&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;/span&gt; &lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;亲友介绍，固然是好。如果不满意，尽管另外换一个好了。但是，亲友&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;BoyFactory&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;经常是以&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Singleton&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;的形式出现，不然就是，存在于&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Globals&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;，无处不在，无处不能。实在是太繁琐了一点，不够灵活。我为什么一定要这个亲友掺和进来呢？为什么一定要付给她介绍费呢？万一最好的朋友爱上了我的男朋友呢？&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;/span&gt; &lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;    &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(51, 51, 153);font-family:宋体;&quot; &gt;父母包办&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;：一切交给父母，自己不用费吹灰之力，只需要等着&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Kiss&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;就好了。&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;/span&gt; &lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: center;&quot; align=&quot;center&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; align=&quot;center&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://dev.csdn.net/Develop/ArticleImages/24/24397/CSDN_Dev_Image_2004-2-16115396.gif&quot; align=&quot;bottom&quot; border=&quot;0&quot; hspace=&quot;0&quot; /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;       &lt;/span&gt;&lt;/p&gt; &lt;div align=&quot;center&quot;&gt; &lt;table class=&quot;MsoTableGrid&quot; style=&quot;border: medium none ; background: rgb(230, 230, 230) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; margin-left: 23.4pt; border-collapse: collapse;&quot; border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td style=&quot;border: 1pt solid windowtext; padding: 0cm 5.4pt; width: 387pt;&quot; valign=&quot;top&quot; width=&quot;516&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(127, 0, 85);font-family:&#39;Courier New&#39;;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: left;&quot; align=&quot;left&quot;&gt;&lt;br /&gt;public&lt;/p&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;;font-family:&#39;Courier New&#39;;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(127, 0, 85);font-family:&#39;Courier New&#39;;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;class&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;;font-family:&#39;Courier New&#39;;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt; Girl {&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;;font-family:&#39;Courier New&#39;;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;    &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(127, 0, 85);font-family:&#39;Courier New&#39;;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;void&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;;font-family:&#39;Courier New&#39;;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt; kiss(Boy boy){&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;;font-family:&#39;Courier New&#39;;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;       // kiss boy&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;;font-family:&#39;Courier New&#39;;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;      boy.kiss();&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;;font-family:&#39;Courier New&#39;;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;;font-family:&#39;Courier New&#39;;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;}&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;    Well&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;，这是对&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Girl&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;最好的方法，只要想办法贿赂了&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Girl&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;的父母，并把&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Boy&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;交给他。那么我们就可以轻松的和&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Girl&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;来&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Kiss&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;了。看来几千年传统的父母之命还真是有用哦。至少&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Boy&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;和&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Girl&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;不用自己瞎忙乎了。&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;这就是&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;IOC&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;，将对象的创建和获取提取到外部。由外部容器提供需要的组件。&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;/span&gt; &lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;我们知道&lt;b&gt;&lt;span style=&quot;color: rgb(153, 51, 102);&quot;&gt;好莱坞原则&lt;/span&gt;&lt;/b&gt;：&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;“Do not call us, we will call you.” &lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;意思就是，&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;You, girlie, do not call the boy. We will feed you a boy&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;。&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;/span&gt; &lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;我们还应该知道&lt;b&gt;&lt;span style=&quot;color: rgb(153, 51, 102);&quot;&gt;依赖倒转原则&lt;/span&gt;&lt;/b&gt;即&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt; Dependence Inversion Princinple&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;，&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;DIP&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;。&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;/span&gt; &lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: center;&quot; align=&quot;center&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; align=&quot;center&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://dev.csdn.net/Develop/ArticleImages/24/24397/CSDN_Dev_Image_2004-2-16115398.gif&quot; align=&quot;bottom&quot; border=&quot;0&quot; hspace=&quot;0&quot; /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-left: 18pt;&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Eric Gamma&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;说，要面向抽象编程。面向接口编程是面向对象的核心。&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-left: 18pt;&quot;&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;组件应该分为两部分，即&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-left: 39pt; text-indent: 3pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(51, 51, 153);font-family:&#39;Courier New&#39;;&quot;  lang=&quot;EN-US&quot;&gt;Service&lt;/span&gt;&lt;/b&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;所提供功能的声明&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;margin-left: 39pt; text-indent: 3pt;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(51, 51, 153);font-family:&#39;Courier New&#39;;&quot;  lang=&quot;EN-US&quot;&gt;Implementation&lt;/span&gt;&lt;/b&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;, Service&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;的实现&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt;&quot;&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;好处是：多实现可以任意切换，防止&lt;/span&gt;&lt;span style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;“&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;everything depends on everything&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;”&lt;/span&gt;&lt;span style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;问题．即具体依赖于具体。&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt;&quot;&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;所以，我们的&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Boy&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;应该是实现&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Kissable&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;接口。这样一旦&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Girl&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;不想&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;kiss&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;可恶的&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Boy&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;的话，还可以&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;kiss&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;可爱的&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;kitten&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;和慈祥的&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;grandmother&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;。&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt;&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;/span&gt; &lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt;&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://dev.csdn.net/Develop/ArticleImages/24/24397/CSDN_Dev_Image_2004-2-161153910.gif&quot; align=&quot;bottom&quot; border=&quot;0&quot; hspace=&quot;0&quot; /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(51, 51, 153);font-family:宋体;&quot; &gt;二、&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(51, 51, 153);font-family:&#39;Courier New&#39;;&quot;  lang=&quot;EN-US&quot;&gt;IOC&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(51, 51, 153);font-family:宋体;&quot; &gt;的&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(51, 51, 153);font-family:&#39;Courier New&#39;;&quot;  lang=&quot;EN-US&quot;&gt;type&lt;/span&gt;&lt;/b&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;    IoC&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;的&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Type&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;指的是&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Girl&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;得到&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Boy&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;的几种不同方式。我们逐一来说明。&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;/span&gt; &lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;    &lt;b&gt;&lt;span style=&quot;color: rgb(51, 51, 153);&quot;&gt;IOC type 0&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(51, 51, 153);font-family:宋体;&quot; &gt;：&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;不用&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;IOC&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;/span&gt; &lt;/p&gt; &lt;div align=&quot;center&quot;&gt; &lt;table class=&quot;MsoTableGrid&quot; style=&quot;border: medium none ; background: rgb(230, 230, 230) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; margin-left: 23.4pt; border-collapse: collapse;&quot; border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td style=&quot;border: 1pt solid windowtext; padding: 0cm 5.4pt; width: 387pt;&quot; valign=&quot;top&quot; width=&quot;516&quot;&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: left;&quot; align=&quot;left&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(127, 0, 85);font-family:&#39;Courier New&#39;;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;&lt;/span&gt;&lt;/b&gt; &lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: left;&quot; align=&quot;left&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(127, 0, 85);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;public&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(127, 0, 85);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;class&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt; Girl &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(127, 0, 85);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;implements&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt; Servicable {&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: left;&quot; align=&quot;left&quot;&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;    &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(127, 0, 85);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;private&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt; Kissable kissable;&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: left;&quot; align=&quot;left&quot;&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;    &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(127, 0, 85);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;public&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt; Girl() {&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;        kissable = &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(127, 0, 85);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt; Boy();&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;    }&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: left;&quot; align=&quot;left&quot;&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;    &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(127, 0, 85);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;public&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(127, 0, 85);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;void&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt; kissYourKissable() {&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;        kissable.kiss();&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;    }&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: left;&quot; align=&quot;left&quot;&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;}&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;/span&gt; &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;/span&gt; &lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;    Girl&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;自己建立自己的&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Boy&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;，很难更换，很难共享给别人，只能单独使用，并负责完全的生命周期。&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;/span&gt; &lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(51, 51, 153);font-family:&#39;Courier New&#39;;&quot;  lang=&quot;EN-US&quot;&gt;    IOC type 1&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(51, 51, 153);font-family:宋体;&quot; &gt;，&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;先看代码：&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;/span&gt; &lt;/p&gt; &lt;div align=&quot;center&quot;&gt; &lt;table class=&quot;MsoTableGrid&quot; style=&quot;border: medium none ; background: rgb(230, 230, 230) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; margin-left: 23.4pt; border-collapse: collapse;&quot; border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td style=&quot;border: 1pt solid windowtext; padding: 0cm 5.4pt; width: 387pt;&quot; valign=&quot;top&quot; width=&quot;516&quot;&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: left;&quot; align=&quot;left&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(127, 0, 85);font-family:&#39;Courier New&#39;;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;&lt;/span&gt;&lt;/b&gt; &lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: left;&quot; align=&quot;left&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(127, 0, 85);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;public&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(127, 0, 85);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;class&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt; Girl &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(127, 0, 85);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;implements&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt; Servicable {&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: left;&quot; align=&quot;left&quot;&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;    Kissable kissable;&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: left;&quot; align=&quot;left&quot;&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;    &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(127, 0, 85);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;public&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(127, 0, 85);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;void&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt; service(ServiceManager mgr) {&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;        kissable = (Kissable) mgr.lookup(&lt;/span&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   &gt;“&lt;span lang=&quot;EN-US&quot;&gt;kissable&lt;/span&gt;”&lt;span lang=&quot;EN-US&quot;&gt;);&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;    }&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: left;&quot; align=&quot;left&quot;&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;    &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(127, 0, 85);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;public&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(127, 0, 85);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;void&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt; kissYourKissable() {&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;        kissable.kiss();&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;    }&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: left;&quot; align=&quot;left&quot;&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;}&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;/span&gt; &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;/span&gt; &lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;这种情况出现于&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Avalon Framework&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;。一个组件实现了&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Servicable&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;接口，就必须实现&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;service&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;方法，并传入一个&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;ServiceManager&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;。其中会含有需要的其它组件。只需要在&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;service&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;方法中初始化需要的&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Boy&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;。&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;另外，&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;J2EE&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;中从&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Context&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;取得对象也属于&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;type 1&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;。&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;/span&gt; &lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;它依赖于配置文件&lt;/span&gt;&lt;/p&gt; &lt;div align=&quot;center&quot;&gt; &lt;table class=&quot;MsoTableGrid&quot; style=&quot;border: medium none ; background: rgb(230, 230, 230) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; margin-left: 23.4pt; border-collapse: collapse;&quot; border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td style=&quot;border: 1pt solid windowtext; padding: 0cm 5.4pt; width: 387pt;&quot; valign=&quot;top&quot; width=&quot;516&quot;&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: left;&quot; align=&quot;left&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(127, 0, 85);font-family:&#39;Courier New&#39;;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;&lt;/span&gt;&lt;/b&gt; &lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: left;&quot; align=&quot;left&quot;&gt;&lt;span style=&quot;color: rgb(51, 51, 153);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;&lt;container&gt;&lt;br /&gt;&lt;/container&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(51, 51, 153);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;    &lt;component name=&quot;&lt;/span&quot;&gt;&lt;span style=&quot;color: rgb(51, 51, 153);font-size:10;&quot; lang=&quot;EN-US&quot; &gt;“&lt;/span&gt;&lt;span style=&quot;color: rgb(51, 51, 153);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;kissable&lt;/span&gt;&lt;span style=&quot;color: rgb(51, 51, 153);font-size:10;&quot; lang=&quot;EN-US&quot; &gt;“&lt;/span&gt;&lt;span style=&quot;color: rgb(51, 51, 153);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt; class=&lt;/span&gt;&lt;span style=&quot;color: rgb(51, 51, 153);font-size:10;&quot; lang=&quot;EN-US&quot; &gt;“&lt;/span&gt;&lt;span style=&quot;color: rgb(51, 51, 153);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;Boy&quot;&gt;            &lt;br /&gt;      &lt;configuration&gt; &lt;/configuration&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(51, 51, 153);font-size:10;&quot; lang=&quot;EN-US&quot; &gt;…&lt;/span&gt;&lt;span style=&quot;color: rgb(51, 51, 153);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt; &lt;/span&gt;&lt;/component&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(51, 51, 153);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;    &lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: left;&quot; align=&quot;left&quot;&gt;&lt;span style=&quot;color: rgb(51, 51, 153);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;    &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(153, 51, 102);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;&lt;component name=&quot;&lt;/span&quot;&gt;&lt;/component&gt;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(153, 51, 102);font-size:10;&quot; lang=&quot;EN-US&quot; &gt;“&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(153, 51, 102);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;girl&quot; class=&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(153, 51, 102);font-size:10;&quot; lang=&quot;EN-US&quot; &gt;“&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(153, 51, 102);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;Girl&quot; /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: rgb(51, 51, 153);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt; &lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;/span&gt; &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;/span&gt; &lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;    &lt;b&gt;&lt;span style=&quot;color: rgb(51, 51, 153);&quot;&gt;IOC type 2&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(51, 51, 153);font-family:宋体;&quot; &gt;：&lt;/span&gt;&lt;/b&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;    &lt;/span&gt;&lt;/p&gt; &lt;div align=&quot;center&quot;&gt; &lt;table class=&quot;MsoTableGrid&quot; style=&quot;border: medium none ; background: rgb(230, 230, 230) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; margin-left: 23.4pt; border-collapse: collapse;&quot; border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td style=&quot;border: 1pt solid windowtext; padding: 0cm 5.4pt; width: 387pt;&quot; valign=&quot;top&quot; width=&quot;516&quot;&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: left;&quot; align=&quot;left&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(127, 0, 85);font-family:&#39;Courier New&#39;;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;&lt;/span&gt;&lt;/b&gt; &lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: left;&quot; align=&quot;left&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(127, 0, 85);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;public&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(127, 0, 85);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;class&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt; Girl {&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: left;&quot; align=&quot;left&quot;&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;    &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(127, 0, 85);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;private&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt; Kissable kissable;&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: left;&quot; align=&quot;left&quot;&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;    &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(127, 0, 85);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;public&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(127, 0, 85);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;void&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt; setKissable(Kissable kissable) {&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;        &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(127, 0, 85);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;this&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;.kissable = kissable;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;    }&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: left;&quot; align=&quot;left&quot;&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;    &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(127, 0, 85);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;public&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(127, 0, 85);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;void&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt; kissYourKissable() {&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;        kissable.kiss();&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;    }&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: left;&quot; align=&quot;left&quot;&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;}&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;/span&gt; &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;/span&gt; &lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;    Type 2&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;出现于&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Spring Framework&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;，是通过&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;JavaBean&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;的&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;set&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;方法来将需要的&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Boy&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;传递给&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Girl&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;。它必须依赖于配置文件。&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;        &lt;/span&gt;&lt;/p&gt; &lt;div align=&quot;center&quot;&gt; &lt;table class=&quot;MsoTableGrid&quot; style=&quot;border: medium none ; background: rgb(230, 230, 230) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; margin-left: 23.4pt; border-collapse: collapse;&quot; border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td style=&quot;border: 1pt solid windowtext; padding: 0cm 5.4pt; width: 387pt;&quot; valign=&quot;top&quot; width=&quot;516&quot;&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: left;&quot; align=&quot;left&quot;&gt;&lt;span style=&quot;color: rgb(51, 51, 153);font-family:&#39;Courier New&#39;;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;&lt;/span&gt; &lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: left;&quot; align=&quot;left&quot;&gt;&lt;span style=&quot;color: rgb(51, 51, 153);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;&lt;beans&gt;&lt;br /&gt;&lt;/beans&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(51, 51, 153);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;    &lt;bean id=&quot;&lt;/span&quot;&gt;&lt;span style=&quot;color: rgb(51, 51, 153);font-size:10;&quot; lang=&quot;EN-US&quot; &gt;“&lt;/span&gt;&lt;span style=&quot;color: rgb(51, 51, 153);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;boy&quot; class=&lt;/span&gt;&lt;span style=&quot;color: rgb(51, 51, 153);font-size:10;&quot; lang=&quot;EN-US&quot; &gt;“&lt;/span&gt;&lt;span style=&quot;color: rgb(51, 51, 153);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;Boy&quot;/&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(51, 51, 153);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;    &lt;bean id=&quot;&lt;/span&quot;&gt;&lt;span style=&quot;color: rgb(51, 51, 153);font-size:10;&quot; lang=&quot;EN-US&quot; &gt;“&lt;/span&gt;&lt;span style=&quot;color: rgb(51, 51, 153);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;girl&lt;/span&gt;&lt;span style=&quot;color: rgb(51, 51, 153);font-size:10;&quot; lang=&quot;EN-US&quot; &gt;“&lt;/span&gt;&lt;span style=&quot;color: rgb(51, 51, 153);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt; class=&lt;/span&gt;&lt;span style=&quot;color: rgb(51, 51, 153);font-size:10;&quot; lang=&quot;EN-US&quot; &gt;“&lt;/span&gt;&lt;span style=&quot;color: rgb(51, 51, 153);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;Girl&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;        &lt;b&gt;&lt;span style=&quot;color: rgb(153, 51, 102);&quot;&gt;&lt;property name=&quot;&lt;/span&quot;&gt;&lt;/property&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(153, 51, 102);font-size:10;&quot; lang=&quot;EN-US&quot; &gt;“&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(153, 51, 102);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;kissable&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(153, 51, 102);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;           &lt;ref bean=&quot;&lt;/span&quot;&gt;&lt;/ref&gt;&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(153, 51, 102);font-size:10;&quot; lang=&quot;EN-US&quot; &gt;“&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(153, 51, 102);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;boy&quot;/&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: rgb(51, 51, 153);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;        &lt;/span&gt;&lt;/bean&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(51, 51, 153);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;    &lt;/span&gt;&lt;/bean&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(51, 51, 153);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt; &lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;/span&gt; &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;/span&gt; &lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(51, 51, 153);font-family:&#39;Courier New&#39;;&quot;  lang=&quot;EN-US&quot;&gt;IOC type 3&lt;/span&gt;&lt;/b&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;/span&gt; &lt;/p&gt; &lt;div align=&quot;center&quot;&gt; &lt;table class=&quot;MsoTableGrid&quot; style=&quot;border: medium none ; background: rgb(230, 230, 230) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; margin-left: 23.4pt; border-collapse: collapse;&quot; border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td style=&quot;border: 1pt solid windowtext; padding: 0cm 5.4pt; width: 387pt;&quot; valign=&quot;top&quot; width=&quot;516&quot;&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: left;&quot; align=&quot;left&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(127, 0, 85);font-family:&#39;Courier New&#39;;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;&lt;/span&gt;&lt;/b&gt; &lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: left;&quot; align=&quot;left&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(127, 0, 85);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;public&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(127, 0, 85);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;class&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt; Girl {&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: left;&quot; align=&quot;left&quot;&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;    &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(127, 0, 85);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;private&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt; Kissable kissable;&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: left;&quot; align=&quot;left&quot;&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;    &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(127, 0, 85);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;public&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt; Girl(Kissable kissable) {&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;        &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(127, 0, 85);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;this&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;.kissable = kissable;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;    }&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: left;&quot; align=&quot;left&quot;&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;    &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(127, 0, 85);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;public&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt; &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(127, 0, 85);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;void&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt; kissYourKissable() {&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;        kissable.kiss();&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;    }&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: left;&quot; align=&quot;left&quot;&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;}&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;/span&gt; &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;/span&gt; &lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;这就是&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;PicoContainer&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;的组件&lt;/span&gt;&lt;span style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;。通过构造函数传递&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Boy&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;给&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Girl&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;。&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;/span&gt; &lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;/span&gt; &lt;/p&gt; &lt;div align=&quot;center&quot;&gt; &lt;table class=&quot;MsoTableGrid&quot; style=&quot;border: medium none ; background: rgb(230, 230, 230) none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; margin-left: 23.4pt; border-collapse: collapse;&quot; border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot;&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td style=&quot;border: 1pt solid windowtext; padding: 0cm 5.4pt; width: 387pt;&quot; valign=&quot;top&quot; width=&quot;516&quot;&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: left;&quot; align=&quot;left&quot;&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;&lt;/span&gt; &lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-align: left;&quot; align=&quot;left&quot;&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;PicoContainer container = &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(127, 0, 85);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt; DefaultPicoContainer();&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;container.registerComponentImplementation(Boy.&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(127, 0, 85);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;class&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;container.registerComponentImplementation(Girl.&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(127, 0, 85);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;class&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;Girl girl = (Girl) container.getComponentInstance(Girl.&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(127, 0, 85);font-family:宋体;font-size:10;&quot;  lang=&quot;EN-US&quot; &gt;class&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;;font-family:宋体;font-size:10;color:black;&quot;   lang=&quot;EN-US&quot; &gt;girl.kissYourKissable();&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;/span&gt; &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;/span&gt; &lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;关于&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;PicoContainer&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;，作者后续文章会详细介绍。&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span style=&quot;color: rgb(51, 51, 153);font-family:&#39;Courier New&#39;;&quot;  lang=&quot;EN-US&quot;&gt;&lt;/span&gt; &lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: rgb(51, 51, 153);font-family:宋体;&quot; &gt;作者语：&lt;/span&gt;&lt;/b&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;   &lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;    Well&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;，以上的这些理论部分有些已经有了新的定义了。过些天我会再写一些文章具体说明。比如，原来的三种&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;结构现在已经重新定义为依赖注射的许多层次。&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt;&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;IoC&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;很年轻，还在发展。伴随着&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;IOC&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;的发展，&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;AOP&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;，&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;COP&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;，&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;SOP&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;等等都在不断的发展。作为程序员，随时关注着新的思想的发展是一件很轻松愉快的事情。有没有人愿意和我一起探讨学习共同进步呀！&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;    &lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;/span&gt; &lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;参考资料&lt;/span&gt;&lt;/b&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;b&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;/span&gt;&lt;/b&gt; &lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;    1 &lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;本文主要插图及文字来源于&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;ThoughtWorks&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;公司的&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Jon Tirsén &lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;与&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt; Aslak Hellesøy&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;（&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;PicoContainer&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;的两位开发者），&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;2003&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;年在&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Java Polis&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;的演讲&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;PPT&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;。有删改。&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt;&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;a href=&quot;http://www.picocontainer.org/presentations/JavaPolis2003.ppt&quot;&gt;http://www.picocontainer.org/presentations/JavaPolis2003.ppt&lt;/a&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt;&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;a href=&quot;http://www.picocontainer.org/presentations/JavaPolis2003.pdf&quot;&gt;http://www.picocontainer.org/presentations/JavaPolis2003.pdf&lt;/a&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt;&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;/span&gt; &lt;/p&gt; &lt;p class=&quot;MsoNormal&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;    2 DIP&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt; &lt;span lang=&quot;EN-US&quot;&gt;Robert C Martin, Bob&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;大叔的优秀论文&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt;&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;a href=&quot;http://www.objectmentor.com/resources/articles/dip.pdf&quot;&gt;http://www.objectmentor.com/resources/articles/dip.pdf&lt;/a&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt;&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;/span&gt; &lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt;&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;3 Dependency Injection&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;　依赖注射，&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Matrin Fowler&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;对&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;DIP&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;的扩展&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt;&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;a href=&quot;http://www.martinfowler.com/articles/injection.html&quot;&gt;http://www.martinfowler.com/articles/injection.html&lt;/a&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt;&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;/span&gt; &lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt;&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;4 IOC&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;框架&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt;&quot;&gt;&lt;span  lang=&quot;EN-GB&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;PicoContainer &lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;优秀的&lt;/span&gt;&lt;span  lang=&quot;EN-GB&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;IOC&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;框架&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt;&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;a href=&quot;http://picocontainer.org/&quot;&gt;http://picocontainer.org/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt;&quot;&gt;&lt;span  lang=&quot;EN-GB&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Avalon&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt;&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;a href=&quot;http://avalon.apache.org/&quot;&gt;http://avalon.apache.org/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt;&quot;&gt;&lt;span  lang=&quot;EN-GB&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Spring Framework&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt;&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;a href=&quot;http://www.springframework.org/&quot;&gt;http://www.springframework.org/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt;&quot;&gt;&lt;span  lang=&quot;EN-GB&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;HiveMind&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt;&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;a href=&quot;http://jakarta.apache.org/commons/hivemind&quot;&gt;http://jakarta.apache.org/commons/hivemind&lt;/a&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt;&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;/span&gt; &lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt;&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;5 &lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;中文资料&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt;&quot;&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;程序匠：国内研究&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Pico&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;的先驱&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt;&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;a href=&quot;http://douleimi.vicp.net/space/start&quot;&gt;http://douleimi.vicp.net/space/start&lt;/a&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt;&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Jdon&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;：板桥也在研究&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt;&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;a href=&quot;http://www.jdon.com/design.htm&quot;&gt;http://www.jdon.com/design.htm&lt;/a&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt;&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Spring&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;　&lt;/span&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Framework&lt;/span&gt;&lt;span style=&quot;font-family:宋体;&quot;&gt;中文论坛&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt;&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;a href=&quot;http://xglw.51.net/5team/springframework/index.php&quot;&gt;http://xglw.51.net/5team/springframework/index.php&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt;&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Avalon 中文资料&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt;&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;a href=&quot;http://www.huihoo.org/apache/avalon/introduction.html&quot;&gt;&lt;u&gt;&lt;span style=&quot;color:#800080;&quot;&gt;http://www.huihoo.org/apache/avalon/introduction.html&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt;&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;ERPROAD &lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt;&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;a href=&quot;http://www.erproad.org/index.asp?vt=bycat&amp;cat_id=37&quot;&gt;&lt;u&gt;&lt;span style=&quot;color:#800080;&quot;&gt;http://www.erproad.org/index.asp?vt=bycat&amp;amp;cat_id=37&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt;&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;Open Heart &lt;/span&gt;&lt;/p&gt; &lt;p class=&quot;MsoNormal&quot; style=&quot;text-indent: 21pt;&quot;&gt;&lt;span  lang=&quot;EN-US&quot; style=&quot;font-family:&#39;Courier New&#39;;&quot;&gt;&lt;a href=&quot;http://blogbus.com/blogbus/blog/index.php?blogid=2529&amp;cat=5&quot;&gt;&lt;u&gt;&lt;span style=&quot;color:#800080;&quot;&gt;http://blogbus.com/blogbus/blog/index.php?blogid=2529&amp;amp;cat=5&lt;/span&gt;&lt;/u&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style=&quot;font-size: 14px; line-height: 25px;&quot;&gt;&lt;strong&gt;作者Blog：&lt;/strong&gt;&lt;a id=&quot;ArticleContent1_ArticleContent1_AuthorBlogLink&quot; href=&quot;http://blog.csdn.net/icecloud/&quot; target=&quot;_blank&quot;&gt;http://blog.csdn.net/icecloud/&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://undancer.blogspot.com/feeds/8099323396706312106/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1102790865060223847/8099323396706312106' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/8099323396706312106'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/8099323396706312106'/><link rel='alternate' type='text/html' href='https://undancer.blogspot.com/2007/05/ioc.html' title='介绍IOC'/><author><name>undancer</name><uri>http://www.blogger.com/profile/05800974944226224562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1102790865060223847.post-6737169853398122695</id><published>2007-01-28T18:14:00.000+08:00</published><updated>2007-01-28T18:53:17.483+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="跑跑卡丁车"/><title type='text'>跑跑卡丁车</title><content type='html'>&lt;span style=&quot;;font-family:arial;font-size:100%;&quot;  &gt;&lt;blockquote&gt;前言：&lt;br /&gt;-----------------------------------------------------------------------------------------------&lt;br /&gt;从内测的时候就将玩跑跑竞速的人分为五个等级。&lt;br /&gt;五流：新手&lt;br /&gt;四流：未完成&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;三流：完成&lt;/span&gt;&lt;br /&gt;二流：很快&lt;br /&gt;一流：因为没有开放L2及专家车，所以官服内暂不对此等级进行划分。&lt;br /&gt;-----------------------------------------------------------------------------------------------&lt;br /&gt;介绍：&lt;br /&gt;-----------------------------------------------------------------------------------------------&lt;br /&gt;人物：undancer&lt;br /&gt;等级：三流车手&lt;br /&gt;助手：呃。。。暂时留空。看了就知道。&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;描述：[以下内容点击下载]&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://undancer.googlepages.com/rookie30640undancer.rar&quot;&gt;森林发夹 3&#39;06&#39;&#39;40&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://undancer.googlepages.com/rookie20098undancer.rar&quot;&gt;金字塔 2&#39;00&#39;&#39;98&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://undancer.googlepages.com/rookie15457undancer.rar&quot;&gt;神秘修道院 1&#39;54&#39;&#39;57&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://undancer.googlepages.com/rookie22689undancer.rar&quot;&gt;城镇高速公路 2&#39;26&#39;&#39;89&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;    &lt;li&gt;冰河&lt;ul&gt;   &lt;li&gt;冰封裂谷&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;tpc_content&quot;&gt;冰鲨墓地&lt;/span&gt;&lt;/li&gt;       &lt;li&gt;&lt;span class=&quot;tpc_content&quot;&gt;冰雪企鹅岛&lt;/span&gt;&lt;/li&gt;       &lt;li&gt;&lt;span class=&quot;tpc_content&quot;&gt;冰水晶洞穴&lt;/span&gt;&lt;/li&gt;       &lt;li&gt;&lt;span class=&quot;tpc_content&quot;&gt;冰山极速&lt;/span&gt;&lt;/li&gt;       &lt;li&gt;&lt;span class=&quot;tpc_content&quot;&gt;&lt;/span&gt;&lt;a href=&quot;http://game.muzone.cn/attachment.php?aid=18486&quot; target=&quot;_blank&quot;&gt;冰山滑雪场 2&#39;52&#39;&#39;10&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;&lt;/li&gt;  &lt;li&gt;沙漠&lt;/li&gt;   &lt;ul&gt;    &lt;li&gt;&lt;span class=&quot;tpc_content&quot;&gt;沙漠地狱沙丘&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;tpc_content&quot;&gt;&lt;/span&gt;&lt;a href=&quot;http://game.muzone.cn/attachment.php?aid=18485&quot; target=&quot;_blank&quot;&gt;沙漠金字塔 1&#39;52&#39;&#39;55&lt;/a&gt;&lt;/li&gt;     &lt;li&gt;&lt;span class=&quot;tpc_content&quot;&gt;沙漠绿洲&lt;/span&gt;&lt;/li&gt;     &lt;li&gt;&lt;span class=&quot;tpc_content&quot;&gt;沙漠市场&lt;/span&gt;&lt;/li&gt;     &lt;li&gt;&lt;span class=&quot;tpc_content&quot;&gt;沙漠水库&lt;/span&gt;&lt;/li&gt;     &lt;li&gt;&lt;span class=&quot;tpc_content&quot;&gt;&lt;/span&gt;&lt;a href=&quot;http://game.muzone.cn/attachment.php?aid=18488&quot; target=&quot;_blank&quot;&gt;沙漠旋转工地 2&#39;41&#39;&#39;00&lt;/a&gt;&lt;/li&gt;     &lt;/ul&gt;   &lt;li&gt;城镇&lt;/li&gt;&lt;ul&gt;   &lt;li&gt;&lt;span class=&quot;tpc_content&quot;&gt;城镇钟楼&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;tpc_content&quot;&gt;&lt;/span&gt;&lt;a href=&quot;http://game.muzone.cn/attachment.php?aid=18482&quot; target=&quot;_blank&quot;&gt;城镇手指 1&#39;47&#39;&#39;29&lt;/a&gt;&lt;/li&gt;     &lt;li&gt;&lt;span class=&quot;tpc_content&quot;&gt;城镇环道&lt;/span&gt;&lt;/li&gt;     &lt;li&gt;&lt;span class=&quot;tpc_content&quot;&gt;城镇运河&lt;/span&gt;&lt;/li&gt;     &lt;li&gt;&lt;span class=&quot;tpc_content&quot;&gt;&lt;a href=&quot;http://game.muzone.cn/attachment.php?aid=19177&quot; target=&quot;_blank&quot;&gt;城镇水路 1&#39;49&#39;&#39;91&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;     &lt;li&gt;&lt;span class=&quot;tpc_content&quot;&gt;&lt;/span&gt;&lt;a href=&quot;http://game.muzone.cn/attachment.php?aid=18487&quot; target=&quot;_blank&quot;&gt;城镇高速公路 2&#39;18&#39;&#39;14&lt;/a&gt;&lt;/li&gt;     &lt;li&gt;&lt;span class=&quot;tpc_content&quot;&gt;城镇公路&lt;/span&gt;&lt;/li&gt;  &lt;/ul&gt;    &lt;li&gt;森林&lt;/li&gt;&lt;ul&gt;   &lt;li&gt;&lt;span class=&quot;tpc_content&quot;&gt;森林木桶&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;tpc_content&quot;&gt;森林蘑菇洞穴&lt;/span&gt;&lt;/li&gt;     &lt;li&gt;&lt;span class=&quot;tpc_content&quot;&gt;森林山谷&lt;/span&gt;&lt;/li&gt;     &lt;li&gt;&lt;span class=&quot;tpc_content&quot;&gt;森林奇石&lt;/span&gt;&lt;/li&gt;     &lt;li&gt;&lt;span class=&quot;tpc_content&quot;&gt;&lt;a href=&quot;http://game.muzone.cn/attachment.php?aid=19090&quot; target=&quot;_blank&quot;&gt;森林发夹 2&#39;56&#39;&#39;02&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;  &lt;/ul&gt;    &lt;li&gt;墓地&lt;/li&gt;&lt;ul&gt;   &lt;li&gt;&lt;span class=&quot;tpc_content&quot;&gt;墓地幽灵峡谷&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;tpc_content&quot;&gt;墓地骷髅手指&lt;/span&gt;&lt;/li&gt;     &lt;li&gt;&lt;span class=&quot;tpc_content&quot;&gt;&lt;/span&gt;&lt;a href=&quot;http://game.muzone.cn/attachment.php?aid=18484&quot; target=&quot;_blank&quot;&gt;神秘修道院 1&#39;46&#39;&#39;63&lt;/a&gt;&lt;/li&gt;  &lt;/ul&gt;    &lt;li&gt;矿山&lt;/li&gt;&lt;ul&gt;   &lt;li&gt;&lt;span class=&quot;tpc_content&quot;&gt;矿山宝石开采场&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;tpc_content&quot;&gt;矿山曲折滑坡&lt;/span&gt;&lt;/li&gt;     &lt;li&gt;&lt;span class=&quot;tpc_content&quot;&gt;矿山熔岩&lt;/span&gt;&lt;/li&gt;  &lt;/ul&gt;    &lt;li&gt;太空&lt;/li&gt;  &lt;ul&gt;   &lt;li&gt;阿&lt;span class=&quot;tpc_content&quot;&gt;太空立交桥&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class=&quot;tpc_content&quot;&gt;太空险道&lt;/span&gt;&lt;/li&gt;     &lt;li&gt;&lt;span class=&quot;tpc_content&quot;&gt;太空岔道&lt;/span&gt;&lt;/li&gt;     &lt;li&gt;&lt;span class=&quot;tpc_content&quot;&gt;太空宇宙船入侵&lt;/span&gt;&lt;/li&gt;     &lt;li&gt;&lt;span class=&quot;tpc_content&quot;&gt;太空曲折路&lt;/span&gt;&lt;/li&gt;  &lt;/ul&gt;   &lt;li&gt;工场&lt;/li&gt; &lt;ul&gt;   &lt;li&gt;留空编辑 &lt;/li&gt; &lt;/ul&gt;   &lt;li&gt;海盗&lt;/li&gt; &lt;ul&gt;   &lt;li&gt;留空编辑 &lt;/li&gt; &lt;/ul&gt;   &lt;li&gt;魔法&lt;/li&gt; &lt;ul&gt;   &lt;li&gt;留空编辑 &lt;/li&gt; &lt;/ul&gt;  &lt;/ul&gt;  &lt;span style=&quot;;font-family:arial;font-size:100%;&quot;  &gt;----------------------------------------------------------------------------------------------&lt;br /&gt;提醒：&lt;br /&gt;----------------------------------------------------------------------------------------------&lt;br /&gt;&lt;/span&gt; &lt;ul&gt;   &lt;li&gt;&lt;span class=&quot;tpc_content&quot;&gt; 影子文件需要复制到&lt;span style=&quot;color: rgb(255, 0, 0);&quot;&gt;我的文档\跑跑卡丁车\玩家资料&lt;/span&gt;&lt;br /&gt;然后在计时赛选择与影子相同的驾照既可以比赛练习了。&lt;br /&gt;只要不过终点线，可以无限按ESC选择重新比赛的。&lt;br /&gt;这样可以节省大量金币。&lt;br /&gt;   &lt;/span&gt;&lt;/li&gt;   &lt;li&gt;&lt;span style=&quot;;font-family:arial;font-size:100%;&quot;  &gt;录像文件需要解压复制到&lt;/span&gt;&lt;span style=&quot;color: rgb(255, 0, 0);font-family:arial;font-size:100%;&quot;  &gt;我的文档\跑跑卡丁车\玩家资料&lt;/span&gt;&lt;span style=&quot;;font-family:arial;font-size:100%;&quot;  &gt;&lt;br /&gt;然后在主菜单选择回放，即可看到全部录像，点击可以查看或虚拟比赛。&lt;br /&gt;比赛时，只要不过终点线，可以无限按ESC选择重新比赛的。&lt;br /&gt;这样可以节省大量金币。&lt;/span&gt;&lt;/li&gt; &lt;/ul&gt; &lt;span style=&quot;;font-family:arial;font-size:100%;&quot;  &gt;&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='https://undancer.blogspot.com/feeds/6737169853398122695/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1102790865060223847/6737169853398122695' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/6737169853398122695'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/6737169853398122695'/><link rel='alternate' type='text/html' href='https://undancer.blogspot.com/2007/01/blog-post.html' title='跑跑卡丁车'/><author><name>undancer</name><uri>http://www.blogger.com/profile/05800974944226224562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1102790865060223847.post-7495165442852653982</id><published>2007-01-23T03:08:00.000+08:00</published><updated>2007-01-23T03:09:44.545+08:00</updated><title type='text'>java版的kore[转]</title><content type='html'>public void run (){ &lt;br /&gt;buf = ByteBuffer.allocate(RobotConst.MAX_LENGTH);&lt;br /&gt;while ( true ) { &lt;br /&gt;try { &lt;br /&gt;&lt;br /&gt;if ( (socket != null &amp;&amp; socket.isConnected() == true) &amp;&amp; (msgLength = socket.read(buf)) != 0 ) { &lt;br /&gt;&lt;br /&gt;System.out.println(&quot;A&quot;);&lt;br /&gt;&lt;br /&gt;if (msgLength != 0){ &lt;br /&gt;getMessage = new byte [msgLength]; &lt;br /&gt;buf.flip();&lt;br /&gt;buf.get(getMessage);&lt;br /&gt;System.out.println(msgLength);&lt;br /&gt;&lt;br /&gt;recvMessage = MsgDeal.filterByte(getMessage ,msgLength);&lt;br /&gt;System.out.println(&quot;C&quot;);&lt;br /&gt;if ( lastMessage != null ){ &lt;br /&gt;recvMessage = MsgDeal.byteArrayCat(lastMessage ,recvMessage);&lt;br /&gt;System.out.println(&quot;D&quot;);&lt;br /&gt;} //if end&lt;br /&gt;while ( true ){ &lt;br /&gt;System.out.println(MsgDeal.getMsgHead( recvMessage , 0 , 2 ));&lt;br /&gt;dataLength = MsgDeal.getMsgLength(MsgDeal.getMsgHead( recvMessage , 0 , 2 ));&lt;br /&gt;System.out.println(&quot;dataLength:&quot;+dataLength);&lt;br /&gt;&lt;br /&gt;if ( dataLength == 0 ){ &lt;br /&gt;//translate the length of unfixed message &lt;br /&gt;dataLength = Integer.parseInt(&lt;br /&gt;MsgDeal.toHexMsg(MsgDeal.getInfoFromMsg( recvMessage , 2 , 2 )) , 16);&lt;br /&gt;System.out.println(&quot;true dataLength:&quot;+dataLength);&lt;br /&gt;} else if( dataLength == -1 ){ &lt;br /&gt;recvMessage = null ;&lt;br /&gt;break ;&lt;br /&gt;}//if end&lt;br /&gt;System.out.println(recvMessage.length);&lt;br /&gt;//if date is not integrity ,then break &lt;br /&gt;if ( dataLength &gt; recvMessage.length ){ &lt;br /&gt;System.out.println(&quot;break&quot;);&lt;br /&gt;lastMessage = recvMessage ;&lt;br /&gt;break ;&lt;br /&gt;} // if end&lt;br /&gt;fullMessage = MsgDeal.getInfoFromMsg( recvMessage , 0 , dataLength );&lt;br /&gt;System.out.println(MsgDeal.displayMsg(fullMessage));&lt;br /&gt;ParseMsg.translateTcpData(fullMessage);&lt;br /&gt;System.out.println(&quot;3&quot;);&lt;br /&gt;//get the left meesage&lt;br /&gt;recvMessage = MsgDeal.getInfoFromMsg( recvMessage , dataLength , recvMessage.length - dataLength);&lt;br /&gt;System.out.println(&quot;4&quot;);&lt;br /&gt;if ( recvMessage == null ){ &lt;br /&gt;lastMessage = null ;&lt;br /&gt;System.out.println(&quot;5&quot;);&lt;br /&gt;break ;&lt;br /&gt;} // if end&lt;br /&gt;lastMessage = recvMessage ;&lt;br /&gt;System.out.println(&quot;6&quot;);&lt;br /&gt;} //while end&lt;br /&gt;} // if end&lt;br /&gt;buf = ByteBuffer.allocate(RobotConst.MAX_LENGTH);&lt;br /&gt;} // if end&lt;br /&gt;&lt;br /&gt;} catch (ClosedChannelException e) { &lt;br /&gt;System.out.println(e.toString());&lt;br /&gt;lastMessage = null ;&lt;br /&gt;e.printStackTrace();&lt;br /&gt;} catch (IOException e) { &lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;try{ &lt;br /&gt;if ( (socket != null &amp;&amp; socket.isConnected() == true) &lt;br /&gt;&amp;&amp; RoBot.srvInfo.getSendMsgList().isEmpty() != true){ &lt;br /&gt;if ( RoBot.srvInfo.getConState() == RobotConst.LoginSuccess ){ &lt;br /&gt;if(false){ &lt;br /&gt;sendMessage = MsgDeal.getTickCount();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;sendMessage = (byte[])RoBot.srvInfo.getSendMsgList().get(0);&lt;br /&gt;System.out.println(MsgDeal.displayMsg(sendMessage));&lt;br /&gt;ByteBuffer bb = ByteBuffer.wrap(sendMessage);&lt;br /&gt;&lt;br /&gt;socket.write(bb);&lt;br /&gt;RoBot.srvInfo.getSendMsgList().remove(0);&lt;br /&gt;}//if end&lt;br /&gt;}catch (IOException e){ &lt;br /&gt;e.printStackTrace();&lt;br /&gt;sendMessage = null;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;try { &lt;br /&gt;checkConnection();&lt;br /&gt;} catch (IOException e1) { &lt;br /&gt;e1.printStackTrace();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;checkTimeOut();&lt;br /&gt;&lt;br /&gt;try { &lt;br /&gt;Thread.sleep(50);&lt;br /&gt;} catch (InterruptedException e2) { &lt;br /&gt;e2.printStackTrace();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;} // while end &lt;br /&gt;} //class end&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* server socket&lt;br /&gt;*/&lt;br /&gt;private SocketChannel socket ;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* ip address&lt;br /&gt;*/&lt;br /&gt;private InetSocketAddress inetSocketAddress ;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* buffered the byteArray&lt;br /&gt;*/&lt;br /&gt;private ByteBuffer buf ;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* the message what will send to server&lt;br /&gt;*/&lt;br /&gt;private byte[] sendMessage ;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* the meesage get from the socket in a tcp package whick has be filtered&lt;br /&gt;*/&lt;br /&gt;private byte[] recvMessage ;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* the message which has not parsed is set in it &lt;br /&gt;*/&lt;br /&gt;private byte[] lastMessage ;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* the package is all data in it &lt;br /&gt;*/&lt;br /&gt;private byte[] fullMessage ;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* the meesage get from the socket in a tcp package&lt;br /&gt;*/&lt;br /&gt;private byte[] getMessage ;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* the length of a tcp package&lt;br /&gt;*/&lt;br /&gt;private int msgLength ;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* a data package&#39;s true length&lt;br /&gt;*/&lt;br /&gt;private int dataLength ;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;kore 主结构的改写&lt;br /&gt;&lt;br /&gt;分析发送封包主要靠这个线程</content><link rel='replies' type='application/atom+xml' href='https://undancer.blogspot.com/feeds/7495165442852653982/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1102790865060223847/7495165442852653982' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/7495165442852653982'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/7495165442852653982'/><link rel='alternate' type='text/html' href='https://undancer.blogspot.com/2007/01/javakore.html' title='java版的kore[转]'/><author><name>undancer</name><uri>http://www.blogger.com/profile/05800974944226224562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1102790865060223847.post-8307973859531244988</id><published>2006-12-24T12:26:00.000+08:00</published><updated>2006-12-24T12:40:11.240+08:00</updated><title type='text'>从windows 2003到windows XP</title><content type='html'>原本准备使用IIS6.0的，所以才安装了windows 2003。&lt;br /&gt;可是不知道是不是驱动选择错误的缘故。计算机显得非常老态龙钟。&lt;br /&gt;&lt;br /&gt;无奈下，重新装回了windows XP。使用相同的驱动。。。。。&lt;br /&gt;计算机又返老还童了。并且3D加速也可以使用了。（2003下无法使用。）&lt;br /&gt;&lt;br /&gt;在系统安装的时候，我发现了一个有趣的事情。&lt;br /&gt;在（开始安装）时，使用SHIFT+F10可以打开一个COMMAND。反复按，可以打开多个。&lt;br /&gt;&lt;br /&gt;然后在配置网络后，去IE的路径下，可以通过COMMAND打开IE。&lt;br /&gt;即使计算机没有完成安装，也可以上一会儿网了。至少收个邮件挺不错。&lt;br /&gt;&lt;br /&gt;而我是忘记抄盗版系统的CD-KEY了，于是用这种方法打开的光驱，并TYPE了一下。&lt;br /&gt;哈哈哈。很好用的。</content><link rel='replies' type='application/atom+xml' href='https://undancer.blogspot.com/feeds/8307973859531244988/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1102790865060223847/8307973859531244988' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/8307973859531244988'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/8307973859531244988'/><link rel='alternate' type='text/html' href='https://undancer.blogspot.com/2006/12/windows-2003windows-xp.html' title='从windows 2003到windows XP'/><author><name>undancer</name><uri>http://www.blogger.com/profile/05800974944226224562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1102790865060223847.post-5558385450019093191</id><published>2006-12-22T10:50:00.000+08:00</published><updated>2006-12-22T11:02:02.595+08:00</updated><title type='text'>blogger.com和AdSense</title><content type='html'>&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDt3yn5Q3BSUwoQnmCoWVLzq2KPuuptMcIltq0_4pUZuYmYwFyfRjx3VhCjlMlIJDgcLSxGDtqSG4jiXkoT4ZtlODEfT8xfDj55nTTdroaS1rFKR8ir30SR-9csEtRllO8pub8cIU-P8nR/s1600-h/logo40_nobeta.gif&quot;&gt;&lt;img id=&quot;BLOGGER_PHOTO_ID_5011180955420038114&quot; style=&quot;FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand&quot; alt=&quot;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDt3yn5Q3BSUwoQnmCoWVLzq2KPuuptMcIltq0_4pUZuYmYwFyfRjx3VhCjlMlIJDgcLSxGDtqSG4jiXkoT4ZtlODEfT8xfDj55nTTdroaS1rFKR8ir30SR-9csEtRllO8pub8cIU-P8nR/s320/logo40_nobeta.gif&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;blogger.com的测试版终于变成了新版。控制台上显示的logo非常个性了。&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;但是我却很难登陆。 &lt;/div&gt;&lt;div&gt;&lt;br /&gt;今天终于登陆上了，登陆过程中还出现了两次脚本错误。。。。&lt;br /&gt;&lt;br /&gt;AdSense终于通过认证了。不知道是因为我使用的是blogger的缘故还是认证组实在让我烦不过来，就不得而知了。&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='https://undancer.blogspot.com/feeds/5558385450019093191/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1102790865060223847/5558385450019093191' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/5558385450019093191'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/5558385450019093191'/><link rel='alternate' type='text/html' href='https://undancer.blogspot.com/2006/12/bloggercomadsense.html' title='blogger.com和AdSense'/><author><name>undancer</name><uri>http://www.blogger.com/profile/05800974944226224562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDt3yn5Q3BSUwoQnmCoWVLzq2KPuuptMcIltq0_4pUZuYmYwFyfRjx3VhCjlMlIJDgcLSxGDtqSG4jiXkoT4ZtlODEfT8xfDj55nTTdroaS1rFKR8ir30SR-9csEtRllO8pub8cIU-P8nR/s72-c/logo40_nobeta.gif" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1102790865060223847.post-5000060471837169554</id><published>2006-12-19T02:40:00.000+08:00</published><updated>2006-12-19T02:42:49.215+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="设计模式"/><title type='text'>GOF模式</title><content type='html'>创建模式&lt;br /&gt;&lt;br /&gt;     Factory(工厂模式)   ：工厂模式就象使用new一样频繁。&lt;br /&gt;   Prototype(原型模式)  ：用原型实例指定创建对象的种类，并且通过拷贝这些原型创建新的对象。&lt;br /&gt;   Builder(建造模式)     ：汽车由车轮 方向盘 发动机很多部件组成，同时，将这些部件组装成汽车也是一件复杂的工作，Builder模式就是将这两种情况分开进行。&lt;br /&gt;    Singleton(单例模式)   ：保证一个类只有一个实例,并提供一个访问它的全局访问点。&lt;br /&gt;&lt;br /&gt;结构模式&lt;br /&gt;&lt;br /&gt;     Facade(门面模式) ：可扩展的使用JDBC针对不同的数据库编程,Facade提供了一种灵活的实现。&lt;br /&gt;   Proxy(代理模式)  ：   以Jive为例,剖析代理模式在用户级别授权机制上的应用。&lt;br /&gt;   Adapter(适配器模式) ： 使用类再生的两个方式:组合(new)和继承(extends),这个已经在&quot;thinking in java&quot;中提到过。&lt;br /&gt;   Composite(合成模式) ：就是将类用树形结构组合成一个单位.你向别人介绍你是某单位，你是单位中的一个元素，别人和你做买卖，相当于和单位做买卖。文章中还对Jive再进行了剖析。&lt;br /&gt;    Decorator(装饰模式) ：Decorator是个油漆工,给你的东东的外表刷上美丽的颜色。&lt;br /&gt;   Bridge(桥接模式)  ：将&quot;牛郎织女&quot;分开(本应在一起,分开他们,形成两个接口),在他们之间搭建一个桥(动态的结合) 。&lt;br /&gt;   Flyweight(享元模式) ： 提供Java运行性能,降低小而大量重复的类的开销。&lt;br /&gt;&lt;br /&gt;行为模式&lt;br /&gt;&lt;br /&gt;     Template(模板方法模式) ： 实际上向你介绍了为什么要使用Java 抽象类,该模式原理简单,使用很普遍。&lt;br /&gt;    Memento(备忘录模式) ： 很简单一个模式,就是在内存中保留原来数据的拷贝。&lt;br /&gt;     Observer(观察者模式) ：  介绍如何使用Java API提供的现成Observer。&lt;br /&gt;   Chain of Responsibility(责任链模式) ：各司其职的类串成一串,好象击鼓传花,当然如果自己能完成,就不要推委给下一个。&lt;br /&gt;    Command(命令模式) ：什么是将行为封装,Command是最好的说明。&lt;br /&gt;    State(状态模式) ： 状态是编程中经常碰到的实例,将状态对象化,设立状态变换器,便可在状态中轻松切换。&lt;br /&gt;    Strategy(策略模式) ：不同算法各自封装,用户端可随意挑选需要的算法。&lt;br /&gt;    Mediator(调停者模式) ：很象十字路口的红绿灯,每个车辆只需和红绿灯交互就可以。&lt;br /&gt;    Interpreter(解释器模式) ：主要用来对语言的分析,应用机会不多。&lt;br /&gt;    Visitor(访问者模式) ： 访问者在进行访问时,完成一系列实质性操作,而且还可以扩展。&lt;br /&gt;    Iterator(迭代模式) ： 这个模式已经被整合入Java的Collection在大多数场合下无需自己制造一个Iterator,只要将对象装入Collection中，直接使用Iterator进行对象遍历。&lt;br /&gt;&lt;br /&gt;Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=591898</content><link rel='replies' type='application/atom+xml' href='https://undancer.blogspot.com/feeds/5000060471837169554/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1102790865060223847/5000060471837169554' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/5000060471837169554'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/5000060471837169554'/><link rel='alternate' type='text/html' href='https://undancer.blogspot.com/2006/12/gof.html' title='GOF模式'/><author><name>undancer</name><uri>http://www.blogger.com/profile/05800974944226224562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1102790865060223847.post-6086848396507111928</id><published>2006-12-19T02:26:00.000+08:00</published><updated>2006-12-19T02:35:44.718+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="设计模式"/><title type='text'>关于23种设计模式的有趣见解(转)</title><content type='html'>好东西不得不转在网上看见了这篇文章，作者以轻松的语言比喻了java的32种模式，有很好的启发作用。&lt;br /&gt;&lt;br /&gt;创建型模式&lt;br /&gt;&lt;br /&gt;1、FACTORY—追MM少不了请吃饭了，麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西，虽然口味有所不同，但不管你带MM去麦当劳或肯德基，只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory&lt;br /&gt;&lt;br /&gt;工厂模式：客户类和工厂类分开。消费者任何时候需要某种产品，只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时，工厂类也要做相应的修改。如：如何创建及如何向客户端提供。&lt;br /&gt;&lt;br /&gt;2、BUILDER—MM最爱听的就是“我爱你”这句话了，见到不同地方的MM,要能够用她们的方言跟她说这句话哦，我有一个多种语言翻译机，上面每种语言都有一个按键，见到MM我只要按对应的键，它就能够用相应的语言说出“我爱你”这句话了，国外的MM也可以轻松搞掂，这就是我的“我爱你”builder。（这一定比美军在伊拉克用的翻译机好卖）&lt;br /&gt;&lt;br /&gt;建造模式：将产品的内部表象和产品的生成过程分割开来，从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化，客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。&lt;br /&gt;&lt;br /&gt;3、FACTORY METHOD—请MM去麦当劳吃汉堡，不同的MM有不同的口味，要每个都记住是一件烦人的事情，我一般采用Factory Method模式，带着MM到服务员那儿，说“要一个汉堡”，具体要什么样的汉堡呢，让MM直接跟服务员说就行了。&lt;br /&gt;&lt;br /&gt;工厂方法模式：核心工厂类不再负责所有产品的创建，而是将具体创建的工作交给子类去做，成为一个抽象工厂角色，仅负责给出具体工厂类必须实现的接口，而不接触哪一个产品类应当被实例化这种细节。&lt;br /&gt;&lt;br /&gt;4、PROTOTYPE—跟MM用QQ聊天，一定要说些深情的话语了，我搜集了好多肉麻的情话，需要时只要copy出来放到QQ里面就行了，这就是我的情话prototype了。（100块钱一份，你要不要）&lt;br /&gt;&lt;br /&gt;原始模型模式：通过给出一个原型对象来指明所要创建的对象的类型，然后用复制这个原型对象的方法创建出更多同类型的对象。原始模型模式允许动态的增加或减少产品类，产品类不需要非得有任何事先确定的等级结构，原始模型模式适用于任何的等级结构。缺点是每一个类都必须配备一个克隆方法。&lt;br /&gt;&lt;br /&gt;5、SINGLETON—俺有6个漂亮的老婆，她们的老公都是我，我就是我们家里的老公Sigleton，她们只要说道“老公”，都是指的同一个人，那就是我(刚才做了个梦啦，哪有这么好的事)&lt;br /&gt;&lt;br /&gt;单例模式：单例模式确保某一个类只有一个实例，而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的“单一实例”的需求时才可使用。&lt;br /&gt;&lt;br /&gt;结构型模式&lt;br /&gt;&lt;br /&gt;6、ADAPTER—在朋友聚会上碰到了一个美女Sarah，从香港来的，可我不会说粤语，她不会说普通话，只好求助于我的朋友kent了，他作为我和Sarah之间的Adapter，让我和Sarah可以相互交谈了(也不知道他会不会耍我)&lt;br /&gt;&lt;br /&gt;适配器（变压器）模式：把一个类的接口变换成客户端所期待的另一种接口，从而使原本因接口原因不匹配而无法一起工作的两个类能够一起工作。适配类可以根据参数返还一个合适的实例给客户端。&lt;br /&gt;&lt;br /&gt;7、BRIDGE—早上碰到MM，要说早上好，晚上碰到MM，要说晚上好；碰到MM穿了件新衣服，要说你的衣服好漂亮哦，碰到MM新做的发型，要说你的头发好漂亮哦。不要问我“早上碰到MM新做了个发型怎么说”这种问题，自己用BRIDGE组合一下不就行了&lt;br /&gt;&lt;br /&gt;桥梁模式：将抽象化与实现化脱耦，使得二者可以独立的变化，也就是说将他们之间的强关联变成弱关联，也就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系，从而使两者可以独立的变化。&lt;br /&gt;&lt;br /&gt;8、COMPOSITE—Mary今天过生日。“我过生日，你要送我一件礼物。”“嗯，好吧，去商店，你自己挑。”“这件T恤挺漂亮，买，这条裙子好看，买，这个包也不错，买。”“喂，买了三件了呀，我只答应送一件礼物的哦。”“什么呀，T恤加裙子加包包，正好配成一套呀，小姐，麻烦你包起来。”“……”，MM都会用Composite模式了，你会了没有？&lt;br /&gt;&lt;br /&gt;合成模式：合成模式将对象组织到树结构中，可以用来描述整体与部分的关系。合成模式就是一个处理对象的树结构的模式。合成模式把部分与整体的关系用树结构表示出来。合成模式使得客户端把一个个单独的成分对象和由他们复合而成的合成对象同等看待。&lt;br /&gt;&lt;br /&gt;9、DECORATOR—Mary过完轮到Sarly过生日，还是不要叫她自己挑了，不然这个月伙食费肯定玩完，拿出我去年在华山顶上照的照片，在背面写上“最好的的礼物，就是爱你的Fita”，再到街上礼品店买了个像框（卖礼品的MM也很漂亮哦），再找隔壁搞美术设计的Mike设计了一个漂亮的盒子装起来……，我们都是Decorator，最终都在修饰我这个人呀，怎么样，看懂了吗？&lt;br /&gt;&lt;br /&gt;装饰模式：装饰模式以对客户端透明的方式扩展对象的功能，是继承关系的一个替代方案，提供比继承更多的灵活性。动态给一个对象增加功能，这些功能可以再动态的撤消。增加由一些基本功能的排列组合而产生的非常大量的功能。&lt;br /&gt;&lt;br /&gt;10、FACADE—我有一个专业的Nikon相机，我就喜欢自己手动调光圈、快门，这样照出来的照片才专业，但MM可不懂这些，教了半天也不会。幸好相机有Facade设计模式，把相机调整到自动档，只要对准目标按快门就行了，一切由相机自动调整，这样MM也可以用这个相机给我拍张照片了。&lt;br /&gt;&lt;br /&gt;门面模式：外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口，使得子系统更易于使用。每一个子系统只有一个门面类，而且此门面类只有一个实例，也就是说它是一个单例模式。但整个系统可以有多个门面类。&lt;br /&gt;&lt;br /&gt;11、FLYWEIGHT—每天跟MM发短信，手指都累死了，最近买了个新手机，可以把一些常用的句子存在手机里，要用的时候，直接拿出来，在前面加上MM的名字就可以发送了，再不用一个字一个字敲了。共享的句子就是Flyweight，MM的名字就是提取出来的外部特征，根据上下文情况使用。&lt;br /&gt;&lt;br /&gt;享元模式：FLYWEIGHT在拳击比赛中指最轻量级。享元模式以共享的方式高效的支持大量的细粒度对象。享元模式能做到共享的关键是区分内蕴状态和外蕴状态。内蕴状态存储在享元内部，不会随环境的改变而有所不同。外蕴状态是随环境的改变而改变的。外蕴状态不能影响内蕴状态，它们是相互独立的。将可以共享的状态和不可以共享的状态从常规类中区分开来，将不可以共享的状态从类里剔除出去。客户端不可以直接创建被共享的对象，而应当使用一个工厂对象负责创建被共享的对象。享元模式大幅度的降低内存中对象的数量。&lt;br /&gt;&lt;br /&gt;12、PROXY—跟MM在网上聊天，一开头总是“hi,你好”,“你从哪儿来呀？”“你多大了？”“身高多少呀？”这些话，真烦人，写个程序做为我的Proxy吧，凡是接收到这些话都设置好了自动的回答，接收到其他的话时再通知我回答，怎么样，酷吧。&lt;br /&gt;&lt;br /&gt;代理模式：代理模式给某一个对象提供一个代理对象，并由代理对象控制对源对象的引用。代理就是一个人或一个机构代表另一个人或者一个机构采取行动。某些情况下，客户不想或者不能够直接引用一个对象，代理对象可以在客户和目标对象直接起到中介的作用。客户端分辨不出代理主题对象与真实主题对象。代理模式可以并不知道真正的被代理对象，而仅仅持有一个被代理对象的接口，这时候代理对象不能够创建被代理对象，被代理对象必须有系统的其他角色代为创建并传入。&lt;br /&gt;&lt;br /&gt;行为模式&lt;br /&gt;&lt;br /&gt;13、CHAIN OF RESPONSIBLEITY—晚上去上英语课，为了好开溜坐到了最后一排，哇，前面坐了好几个漂亮的MM哎，找张纸条，写上“Hi,可以做我的女朋友吗？如果不愿意请向前传”，纸条就一个接一个的传上去了，糟糕，传到第一排的MM把纸条传给老师了，听说是个老处女呀，快跑!&lt;br /&gt;&lt;br /&gt;责任链模式：在责任链模式中，很多对象由每一个对象对其下家的引用而接 起来形成一条链。请求在这个链上传递，直到链上的某一个对象决定处理此请求。客户并不知道链上的哪一个对象最终处理这个请求，系统可以在不影响客户端的情况下动态的重新组织链和分配责任。处理者有两个选择：承担责任或者把责任推给下家。一个请求可以最终不被任何接收端对象所接受。&lt;br /&gt;&lt;br /&gt;14、COMMAND—俺有一个MM家里管得特别严，没法见面，只好借助于她弟弟在我们俩之间传送信息，她对我有什么指示，就写一张纸条让她弟弟带给我。这不，她弟弟又传送过来一个COMMAND，为了感谢他，我请他吃了碗杂酱面，哪知道他说：“我同时给我姐姐三个男朋友送COMMAND，就数你最小气，才请我吃面。”，:-(&lt;br /&gt;&lt;br /&gt;命令模式：命令模式把一个请求或者操作封装到一个对象中。命令模式把发出命令的责任和执行命令的责任分割开，委派给不同的对象。命令模式允许请求的一方和发送的一方独立开来，使得请求的一方不必知道接收请求的一方的接口，更不必知道请求是怎么被接收，以及操作是否执行，何时被执行以及是怎么被执行的。系统支持命令的撤消。&lt;br /&gt;&lt;br /&gt;15、INTERPRETER—俺有一个《泡MM真经》，上面有各种泡MM的攻略，比如说去吃西餐的步骤、去看电影的方法等等，跟MM约会时，只要做一个Interpreter，照着上面的脚本执行就可以了。&lt;br /&gt;&lt;br /&gt;解释器模式：给定一个语言后，解释器模式可以定义出其文法的一种表示，并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。解释器模式将描述怎样在有了一个简单的文法后，使用模式设计解释这些语句。在解释器模式里面提到的语言是指任何解释器对象能够解释的任何组合。在解释器模式中需要定义一个代表文法的命令类的等级结构，也就是一系列的组合规则。每一个命令对象都有一个解释方法，代表对命令对象的解释。命令对象的等级结构中的对象的任何排列组合都是一个语言。&lt;br /&gt;&lt;br /&gt;16、ITERATOR—我爱上了Mary，不顾一切的向她求婚。&lt;br /&gt;Mary：“想要我跟你结婚，得答应我的条件”&lt;br /&gt;我：“什么条件我都答应，你说吧”&lt;br /&gt;Mary：“我看上了那个一克拉的钻石”&lt;br /&gt;我：“我买，我买，还有吗？”&lt;br /&gt;Mary：“我看上了湖边的那栋别墅”&lt;br /&gt;我：“我买，我买，还有吗？”&lt;br /&gt;Mary：“你的小弟弟必须要有50cm长”&lt;br /&gt;我脑袋嗡的一声，坐在椅子上，一咬牙：“我剪，我剪，还有吗？” ……&lt;br /&gt;&lt;br /&gt;迭代子模式：迭代子模式可以顺序访问一个聚集中的元素而不必暴露聚集的内部表象。多个对象聚在一起形成的总体称之为聚集，聚集对象是能够包容一组对象的容器对象。迭代子模式将迭代逻辑封装到一个独立的子对象中，从而与聚集本身隔开。迭代子模式简化了聚集的界面。每一个聚集对象都可以有一个或一个以上的迭代子对象，每一个迭代子的迭代状态可以是彼此独立的。迭代算法可以独立于聚集角色变化。&lt;br /&gt;&lt;br /&gt;17、MEDIATOR—四个MM打麻将，相互之间谁应该给谁多少钱算不清楚了，幸亏当时我在旁边，按照各自的筹码数算钱，赚了钱的从我这里拿，赔了钱的也付给我，一切就OK啦，俺得到了四个MM的电话。&lt;br /&gt;&lt;br /&gt;调停者模式：调停者模式包装了一系列对象相互作用的方式，使得这些对象不必相互明显作用。从而使他们可以松散偶合。当某些对象之间的作用发生改变时，不会立即影响其他的一些对象之间的作用。保证这些作用可以彼此独立的变化。调停者模式将多对多的相互作用转化为一对多的相互作用。调停者模式将对象的行为和协作抽象化，把对象在小尺度的行为上与其他对象的相互作用分开处理。&lt;br /&gt;&lt;br /&gt;18、MEMENTO—同时跟几个MM聊天时，一定要记清楚刚才跟MM说了些什么话，不然MM发现了会不高兴的哦，幸亏我有个备忘录，刚才与哪个MM说了什么话我都拷贝一份放到备忘录里面保存，这样可以随时察看以前的记录啦。&lt;br /&gt;&lt;br /&gt;备忘录模式：备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下，将一个对象的状态捉住，并外部化，存储起来，从而可以在将来合适的时候把这个对象还原到存储起来的状态。&lt;br /&gt;&lt;br /&gt;19、OBSERVER—想知道咱们公司最新MM情报吗？加入公司的MM情报邮件组就行了，tom负责搜集情报，他发现的新情报不用一个一个通知我们，直接发布给邮件组，我们作为订阅者（观察者）就可以及时收到情报啦&lt;br /&gt;&lt;br /&gt;观察者模式：观察者模式定义了一种一队多的依赖关系，让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时，会通知所有观察者对象，使他们能够自动更新自己。&lt;br /&gt;&lt;br /&gt;20、STATE—跟MM交往时，一定要注意她的状态哦，在不同的状态时她的行为会有不同，比如你约她今天晚上去看电影，对你没兴趣的MM就会说“有事情啦”，对你不讨厌但还没喜欢上的MM就会说“好啊，不过可以带上我同事么？”，已经喜欢上你的MM就会说“几点钟？看完电影再去泡吧怎么样？”，当然你看电影过程中表现良好的话，也可以把MM的状态从不讨厌不喜欢变成喜欢哦。&lt;br /&gt;&lt;br /&gt;状态模式：状态模式允许一个对象在其内部状态改变的时候改变行为。这个对象看上去象是改变了它的类一样。状态模式把所研究的对象的行为包装在不同的状态对象里，每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是让一个对象在其内部状态改变的时候，其行为也随之改变。状态模式需要对每一个系统可能取得的状态创立一个状态类的子类。当系统的状态变化时，系统便改变所选的子类。&lt;br /&gt;&lt;br /&gt;21、STRATEGY—跟不同类型的MM约会，要用不同的策略，有的请电影比较好，有的则去吃小吃效果不错，有的去海边浪漫最合适，单目的都是为了得到MM的芳心，我的追MM锦囊中有好多Strategy哦。&lt;br /&gt;&lt;br /&gt;策略模式：策略模式针对一组算法，将每一个算法封装到具有共同接口的独立的类中，从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。策略模式把行为和环境分开。环境类负责维持和查询行为类，各种算法在具体的策略类中提供。由于算法和环境独立开来，算法的增减，修改都不会影响到环境和客户端。&lt;br /&gt;&lt;br /&gt;22、TEMPLATE METHOD——看过《如何说服女生上床》这部经典文章吗？女生从认识到上床的不变的步骤分为巧遇、打破僵局、展开追求、接吻、前戏、动手、爱抚、进去八大步骤(Template method)，但每个步骤针对不同的情况，都有不一样的做法，这就要看你随机应变啦(具体实现)；&lt;br /&gt;&lt;br /&gt;模板方法模式：模板方法模式准备一个抽象类，将部分逻辑以具体方法以及具体构造子的形式实现，然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法，从而对剩余的逻辑有不同的实现。先制定一个顶级逻辑框架，而将逻辑的细节留给具体的子类去实现。&lt;br /&gt;&lt;br /&gt;23、VISITOR—情人节到了，要给每个MM送一束鲜花和一张卡片，可是每个MM送的花都要针对她个人的特点，每张卡片也要根据个人的特点来挑，我一个人哪搞得清楚，还是找花店老板和礼品店老板做一下Visitor，让花店老板根据MM的特点选一束花，让礼品店老板也根据每个人特点选一张卡，这样就轻松多了；&lt;br /&gt;&lt;br /&gt;访问者模式：访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话，接受这个操作的数据结构可以保持不变。访问者模式适用于数据结构相对未定的系统，它把数据结构和作用于结构上的操作之间的耦合解脱开，使得操作集合可以相对自由的演化。访问者模式使得增加新的操作变的很容易，就是增加一个新的访问者类。访问者模式将有关的行为集中到一个访问者对象中，而不是分散到一个个的节点类中。当使用访问者模式时，要将尽可能多的对象浏览逻辑放在访问者类中，而不是放到它的子类中。访问者模式可以跨过几个类的等级结构访问属于不同的等级结构的成员类。&lt;br /&gt;Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=284763</content><link rel='replies' type='application/atom+xml' href='https://undancer.blogspot.com/feeds/6086848396507111928/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1102790865060223847/6086848396507111928' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/6086848396507111928'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/6086848396507111928'/><link rel='alternate' type='text/html' href='https://undancer.blogspot.com/2006/12/23.html' title='关于23种设计模式的有趣见解(转)'/><author><name>undancer</name><uri>http://www.blogger.com/profile/05800974944226224562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1102790865060223847.post-7166656854428326219</id><published>2006-12-18T11:49:00.000+08:00</published><updated>2006-12-18T11:49:59.342+08:00</updated><title type='text'></title><content type='html'>&lt;a href=&quot;http://photos1.blogger.com/x/blogger2/7015/134618025520046/1600/631571/1135993030615.jpg&quot;&gt;&lt;img style=&quot;CLEAR: both; FLOAT: left&quot; alt=&quot;&quot; src=&quot;http://photos1.blogger.com/x/blogger2/7015/134618025520046/320/543593/1135993030615.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&amp;nbsp;&lt;a href=&#39;http://picasa.google.com/blogger/&#39; target=&#39;ext&#39;&gt;&lt;img src=&#39;http://photos1.blogger.com/pbp.gif&#39; alt=&#39;Posted by Picasa&#39; style=&#39;border: 0px none ; padding: 0px; background: transparent none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial;&#39; align=&#39;middle&#39; border=&#39;0&#39; /&gt;&lt;/a&gt; </content><link rel='replies' type='application/atom+xml' href='https://undancer.blogspot.com/feeds/7166656854428326219/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1102790865060223847/7166656854428326219' title='1 条评论'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/7166656854428326219'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/7166656854428326219'/><link rel='alternate' type='text/html' href='https://undancer.blogspot.com/2006/12/blog-post_4421.html' title=''/><author><name>undancer</name><uri>http://www.blogger.com/profile/05800974944226224562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1102790865060223847.post-6140772545191422250</id><published>2006-12-18T11:41:00.000+08:00</published><updated>2006-12-18T11:41:56.028+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="仙境传说"/><title type='text'></title><content type='html'>&lt;a href=&quot;http://photos1.blogger.com/x/blogger2/7015/134618025520046/1600/514020/bgi_temp.jpg&quot;&gt;&lt;img style=&quot;CLEAR: both; FLOAT: left&quot; alt=&quot;&quot; src=&quot;http://photos1.blogger.com/x/blogger2/7015/134618025520046/320/51152/bgi_temp.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&amp;nbsp;&lt;a href=&#39;http://picasa.google.com/blogger/&#39; target=&#39;ext&#39;&gt;&lt;img src=&#39;http://photos1.blogger.com/pbp.gif&#39; alt=&#39;Posted by Picasa&#39; style=&#39;border: 0px none ; padding: 0px; background: transparent none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial;&#39; align=&#39;middle&#39; border=&#39;0&#39; /&gt;&lt;/a&gt; </content><link rel='replies' type='application/atom+xml' href='https://undancer.blogspot.com/feeds/6140772545191422250/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1102790865060223847/6140772545191422250' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/6140772545191422250'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/6140772545191422250'/><link rel='alternate' type='text/html' href='https://undancer.blogspot.com/2006/12/blog-post_7884.html' title=''/><author><name>undancer</name><uri>http://www.blogger.com/profile/05800974944226224562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1102790865060223847.post-3546366810126017144</id><published>2006-12-18T11:40:00.002+08:00</published><updated>2006-12-18T11:40:42.285+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="仙境传说"/><title type='text'></title><content type='html'>&lt;a href=&quot;http://photos1.blogger.com/x/blogger2/7015/134618025520046/1600/264788/loading10.jpg&quot;&gt;&lt;img style=&quot;CLEAR: both; FLOAT: left&quot; alt=&quot;&quot; src=&quot;http://photos1.blogger.com/x/blogger2/7015/134618025520046/320/373434/loading10.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&amp;nbsp;&lt;a href=&#39;http://picasa.google.com/blogger/&#39; target=&#39;ext&#39;&gt;&lt;img src=&#39;http://photos1.blogger.com/pbp.gif&#39; alt=&#39;Posted by Picasa&#39; style=&#39;border: 0px none ; padding: 0px; background: transparent none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial;&#39; align=&#39;middle&#39; border=&#39;0&#39; /&gt;&lt;/a&gt; </content><link rel='replies' type='application/atom+xml' href='https://undancer.blogspot.com/feeds/3546366810126017144/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1102790865060223847/3546366810126017144' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/3546366810126017144'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/3546366810126017144'/><link rel='alternate' type='text/html' href='https://undancer.blogspot.com/2006/12/blog-post_6652.html' title=''/><author><name>undancer</name><uri>http://www.blogger.com/profile/05800974944226224562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1102790865060223847.post-2057181722472612333</id><published>2006-12-18T11:40:00.001+08:00</published><updated>2006-12-18T11:40:14.396+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="仙境传说"/><title type='text'></title><content type='html'>&lt;a href=&quot;http://photos1.blogger.com/x/blogger2/7015/134618025520046/1600/48626/loading09.jpg&quot;&gt;&lt;img style=&quot;CLEAR: both; FLOAT: left&quot; alt=&quot;&quot; src=&quot;http://photos1.blogger.com/x/blogger2/7015/134618025520046/320/54056/loading09.jpg&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&amp;nbsp;&lt;a href=&#39;http://picasa.google.com/blogger/&#39; target=&#39;ext&#39;&gt;&lt;img src=&#39;http://photos1.blogger.com/pbp.gif&#39; alt=&#39;Posted by Picasa&#39; style=&#39;border: 0px none ; padding: 0px; background: transparent none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial;&#39; align=&#39;middle&#39; border=&#39;0&#39; /&gt;&lt;/a&gt; </content><link rel='replies' type='application/atom+xml' href='https://undancer.blogspot.com/feeds/2057181722472612333/comments/default' title='博文评论'/><link rel='replies' type='text/html' href='https://www.blogger.com/comment/fullpage/post/1102790865060223847/2057181722472612333' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/2057181722472612333'/><link rel='self' type='application/atom+xml' href='https://www.blogger.com/feeds/1102790865060223847/posts/default/2057181722472612333'/><link rel='alternate' type='text/html' href='https://undancer.blogspot.com/2006/12/blog-post_5011.html' title=''/><author><name>undancer</name><uri>http://www.blogger.com/profile/05800974944226224562</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>