??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲 无码 在线 专区,中文字幕久久亚洲一区 ,亚洲午夜电影在线观看高清 http://www.tkk7.com/xixidabao/category/24797.htmlGROW WITH JAVAzh-cnSat, 26 Jan 2008 10:57:53 GMTSat, 26 Jan 2008 10:57:53 GMT60职场Ch必看Q如何在三个月掌握三q的l验Q{?http://www.tkk7.com/xixidabao/archive/2008/01/26/177926.htmlJAVA之\JAVA之\Sat, 26 Jan 2008 08:17:00 GMThttp://www.tkk7.com/xixidabao/archive/2008/01/26/177926.html
  我一直有个感觉,?#8220;模仿中成长,在创C成功”Q其实在真正的职业工作中Q大多数的工作都是模仉K复,的是工作效率Q而不是创新。对于企业而言Q过度的创新必然Dq多的失败,以及效率的低下?

  以下方式是我的成长中曄做过的,也是我用来训l新员工的方案。你们也可以试试?

  看到很多谈应聘技巧的帖子Q其实ƈ不实用,有菜谱ƈ不代表能做出好菜Q能不能做出好菜仍要看你天天炒,日日炒,炒出来的本事?

  所以,我这里要的一Ҏ(gu)Q你攉到的M资料都不能只是看看,而必自己手把手Q动手去整理、去归类Q去建立新的l构Q这个信息收集与处理的过E甚x你最后ȝ成文的文字更重要?

  何谓“学习”Q学习学习,学而习Q习而成习惯。光学不习,那知识还只是书上的,老师教的Q不是你自己的,只有你重复练习了Q经q量变,才会有质变,当你形成条g反射Ӟ你就真正掌握q个东西了?

  q个q程需要维持两至三个月的时_一定要坚持下去Q你会看到自q变化的。否则,你会用你最青春的两三年来慢慢沉淀(wn)些你两三个月p掌握的东ѝ?

  一切一切,其实Q你们比的不是其它的东西Q只是比的速度?

  q也是ؓ什么我那么基本功的原因?
    
    
    1. 职业分析Q?
    A. 分析性格——分析长处和短处——分析大安有的长处——确定自己最l发展的专业
    B. 定兴趣——分析竞争的Ȁ烈程度和发展的空间大——寻扄对优劎쀔确定自己最l进入的行业
    C. 定行业内自q专业方向Ql保持自w的专业优势?
     /* 性格军_专业Q兴决定行业,行业>专业Q某个行业会包括很多专业?*/

    2. ~写行业报告——着重对行业全面性的把握?
    A. 通过上网查询和购买行业报刊,攉不少于三十万字的行业、重点企业的有效资料Q在?sh)脑中进行资料分析、分cR汇怅R?
    B. 参考同c行业书c,定写作提纲Q确定文章结构和逻辑方向Q培L字表达能力和逻辑能力Q以及熟l的?sh)脑使用技能?
    C. 三十万字资料浓~成十至十五万字Q写成一本符合出版行文格式要求的行业报告。如果选题好,q真的有出版的可能性。如果有一定的独特见解Q也可以写成文章争取在专业刊物上发表Q树立个Z业Ş象?
    
    3. ~写讲报告——着重对专业pȝ性的把握?
    A. Ҏ(gu)你希望从事的专业岗位Q从报告中选择两到三个重点Q将书稿压羃成两万字的讲座稿Q按每分?50字的演讲速度Q即两个时Q?
    B. 演讲稿再浓~成两千字的提纲和重要内容,使用PPT软g~成演讲用演C文Ӟq根据相兛_定w以精彩图片?
    C. 培养职业化的公众表达能力和表达方式,l习普通话Q用讲座稿q行互动讲和演讲练习,只到脱口而出?
    

  告诉大家两个名h是这么成长的Q?
  
  一个是教英语的李阳Q他d学时成W不好Q英语不及格Q然后他做什么去了?他跑到没人的地方大声喊英语去了.
  
  一个是做广告的叶茂中,他卖q告卖不出去了,他跑回家写书Q别人看到的和他自己说的是拿着书出版出了名Q发达了Q其实做q这个事的h才会知道Q当他把q本书写出来Ӟ能不能出版已l不重要的,因ؓ他知道他变化了.
  
  我当时也是没办法了,把所有的׃了台?sh)脑Q在安做了三个月这个事Q三个月后的变化是惊人的Q我的父母、我D的公司的老总,最重要的是我自己,都感觉到了自q变化?
  
  完全不同了?

  其实我写的已l不是理ZQ其实什么都没有技巧的Q只是多看书Q然后多做,磕Q坚持下去,刚开始觉得没变化Q没感觉Q很累,坚持不下去,然后做着做着Q就来快了,然后慢慢的有变化Q?

  而且有意思的是,我在家呆了三个月Q做的事其实Ҏ(gu)与我所从事的工作没有一点关p.只是q三个月的训l,对于我的逻辑、结构、全局性、文字表达能力、口头表达能力有了极大的提升?

  至于收入5,当年一个月也就八百块钱Q然后做完这个训l后整个人的状态都变了Q有自信了,然后写了一个方案去应聘Q结果进了一家大公司Q当Ӟ开始我q不惛_Q因为对方只l我800/月,q要自己U房子,吃饭Q觉得不好,但是Ҏ(gu)q箋四个月三ơ打?sh)话找我Q于是我MQ结果去了就后?zhn)了,真正好的公司?gu)不在乎工资的Q重要的是你自己的能力。第一个月Q我挣了八千块Q我以前想都不敢想的。然后两个月p{了正Q而有一个有关系的同事,呆了一q还没能转正。然后每个月的收入超q工资几倍,q有q终奖两万,出国旅游Q其实也不篏Q我到这个家公司的同Ӟq到另一家广告公司兼职,呵呵Q很回忆的过厅R?

  现在看到太多的h谈工资,我确实不喜欢Q我q几q都不和老板谈工资的Q因出来好笑Q帐面工资高了,q要多扣E.

  我只在意公司的分配方式,怎么L提成和奖金,q薪Q?
  
  上个月有一个和我同龄的名牌大学MBA来我现在所在的公司应?不愿意和Z姐?老板不在,我就来谈?我说好呀,以你的资历我不能和你谈给谁做副手的问题了,我跟你谈谈公司的分配方式?其实我们公司普通员工的收入都不高的,长沙q_水^,只是不忙,周末休两?工作满一q还有一个星期的q休?
  
  但是公司几个部门负责是有q,象我三十?一q?8万左右的q薪,其它的我׃清楚?有几个我一个星期才见一ơ的,比我q小,只怕拿得比我还?你应该也是这L?
  
  他要?千一个月的月?我说q倒不重要,重要的是公司不会l你安排业务?你自己找业务回来,公司l你q_,l你配团?能挣多少钱是你的本事.
  
  我说完了,?你有什么想法吗?他说没想?赯nCh.
  
  太有意思了,你在长沙x六千一个月,你等别h找事l你?你ؓ什么不能自己找到项目呀?六千是底薪呀,差不??千的底薪,如果是这L,那我自己我应该拿到二十五万以上的年薪了.
  
  从来拿底薪和拿年薪的人就是不一L.
  
  如果你不敢拿q薪,你就不要想着谈什么老板l你了.
  
  企业是要盈利?资本家是要剥削的.问题?如果你是一个真正能创造h(hun)值的?你自己所创造的价g是可以拿到手?
  
  大学毕业?如果什么经验也没有,只有知识,没有技?能找C个给你几癑֝?让你在这里呆着学东西的企业应该感谢了,如果你觉得这U企业不是你所向往?你在上大学时p老实实努力学,玩,多练.
  
  我工作有一个ȝ,钱永q不会是目标,但是它会是结?

  谈到职业规划Q有q职业可以规划的Q我也相信未来可以计划的Q问题是Q你是不是这个能不能计划Z未来的hQ以及,你nҎ(gu)没有熟?zhn)你的???点,如果没有Q那你自己都不会明白你自q未来是什么的Q就象象你去做所谓的性向试Q说不定是你自己在自ƺ欺ZQ这U事多了Q没Z把自q成一个坏人的?

  所以重要的q是那一句话Q复杂的生活单过Q简单的事情重复做?
  
  你是中文pȝQ如果你的年U还不是很大Q徏议你凭你自己的能力,哪怕是工资点Q你都要q最好的q告公司Q去呆上一q半载,按我说的Ҏ(gu)偷师Q基本能力提升了Q慢慢的你会遇到一些贵人的Q还有你会涉及一些行业,慢慢的,你会发觉你内心深处喜Ƣ的行业?
  
  呵呵Q特别是哦,奛_子,只有努力才能q大公司Q只有进了大公司才能遇到优秀的男生。好L都关在写字楼里上班下班加班的Q呵c生zd子都的Q你选择的工作圈在你努力的阶D就是你的生zd?

  在你的成长过E中Q有五个人非帔R要?
    
  W一个,导师Q教l?
  他教l你实用的技巧、一定的工作l验Q而不是知识。他可以l你指明方向?
  q个人可能是你的上司、前辈、学ѝ?
    
  W二个,陪练Q同路h?
  M人的成长都不是学出来的,而是学而习Q习而成习惯Q练出来的。在q个l的q程中,是一件很苦的q程Q是一pd单动作的重复重复再重复,由量变到质变的过E,在这个过E中Q一个h很难坚持下来Q这时你需要一个同路h?
  他可以是和你共同兴趣Q共同目标的朋友Q最好是你生命中所q人?
    
  W三个,榜样Q他是你人生的标杆?
  在你一生中Q在不同阶段Q会有不同的标杆Q你向他学习Q受他鼓舞,一步一步向他靠扰?
  最重要的是那个你看得到摸得着的hQ你知道Q不需要通过机遇Q只需要通过努力可以达到的榜样?
    
  W四个,敌hQ看不v你的人,拒绝q你的h?
  Z到绝境是不会有斗志的Q你要证明他是错的,他会l你真正的动力?
    
  W五个,最重要的是W五个,你们觉得W五个h是你自己?
  世界上没有救世主QQ何希望当别h救世ȝZ是疯子就是傻子,只有自己才可以救自己?
  q个世界上,p|的h除了天分太差之外Q只有以下几点,懒,方向不对Q方法不对,没有坚持?
  如果你自己做不到Q你不要怪别人?

  基本功是你自qQ细节所U篏下来的,能让你迅速融入新环境Q?
  /* 人和人最l的差距是在基本功上面Q是否迅速?*/
  
  不知道怎么跟大家谈基本功这个问题.

  很多东西大家都没把它当基本功了.

  比如_我想要的人,他打字很快,他很很写错别字,有丰富的词汇量,逻辑很清晎ͼ用词很准,q些看上去难不难Q?
  
  但是在我q两q见q的应聘的策划文案来看,只有两个人做CQ一个是做了三年文案的女孩子Q慢慢磨的.一个是中文士生,q没毕业Q?
  
  其实大学到底教给大家什么了Q?
  知识Q?
  
  大学阶段必须打好你的基本功,q些军_了你׃后的学习能力Q阶层简单工作的工作效率Q?
  
  如果谁还说打字、排版是文员做的事,那只能说他是真正不明白真正的职场需要?
  
  你们在大学所学到的知识,都是同质化的了,如果知识变为通用的、标准化的技能才是重要的?
  
  既然学的东西没用Q那在大学还要不要认真学习呢Q?
  
  当然要,因ؓq些东西是系l性的Q这个学习过E能培养你的学习能力?
  
  知识不能改变你的命运了,但是它可以改变你的气质?
  
  如果你读个四q大学出来,你的气质q不能好一点,那你的大学就真的白读了?
  
  l常有h在问面试I什么衣服呀Q?
  
  I什么衣服重要吗Q?
  
  重要的是什么h在穿q些衣服?
  
  重要的是你的_气,你的气质?
  
  有一天有一个应聘文案的来了Q我叫设计ȝ先和他聊聊?
  
  聊完了,我说q个Z行吧Q设计ȝ说ؓ什么?
  
  我说我们调性不W,我们多少都有点书hQ而他是一脸的江湖气?
  
  果然Q呵c?
  
  招聘方当然是要看应聘者的外Ş条g的,但ƈ不是丑的׃招,重要的是能力和你的气质,是不是符合公司要求的?

  重要的是兴趣?
  
  然后是狂l基本功Q简单重复积累?
  
  学打拻I你先站三个月桩再说?
  
  面对ChQ我说很多东西,你会发现Q每个字你都认识Q每句话你都看得懂,但是你理解吗Q?
  
  领?zhn)Q是教不了的?
  
  自己努力吧,自己重复做,再会明白自己最惌的是什么?
  
  你考公员员如果L考不上,那你应该L惻Iq种机械性的考试你都q不了,那是不是学习Ҏ(gu)Q或者兴不对呀Q?
  
  做销售,同样的,从基阶做起吧?
  
  你的财政学对你有没有帮助Q?
  
  当然有,你对销售的认识会不同的?
  
  象十q前我卖保险Qh人都跟银行比Q算利息Q都得没有银行高,只能说死了h有赔了?
  
  而我是怎么呢Q我用递增Q还是增减年金公式算Q呵呵,比银行高呢?
  
  另外Q别M人有赔,最多是说得婉{炏V?
  
  我可没把它当Mh卖呀Q我把它当礼物卖Q当成父母送给孩子的礼物卖Q卖得可好了Q呵c?
  
  现在哪个做h寉K的h敢说他一q做两百多单Q?
  
  呵呵Q我好象一q做了二癑֛十单左右Q全是年~哦?

  q个世界上最IL和最富的人都在做销售.
  
  做销售的人底薪很低的Q大多数人拼的只是体力Ş了,如果你想做好Q你多花心思就可以了.多想多跑Q还是在一个行业里多坚持,扑ֈ高手做师父带你.

  我说说当q我h子的时候怎么q来的.
  
  那年头电(sh)脑还紧俏Q我只要一有机会就到别人电(sh)脑上l东西,l于l成了今天的?sh)脑基本功,一斚w要多学,一斚w要多用心Q?
  
  然后Q我每天做记录,C工作的流E,C别h说过的工作中重要的话Q其实什么叫行业l验Q很多老手随便说的话,都是行话了,有它的意思的Q听了就要想Q就要去查,很多东西q道了Q?
  
  Z么要记录Q因Z么叫职业化?职业化就是标准化、流E化Q模式化Q你多看多记多想p明白了,q些东西在很多地斚w是通用的?
  /* 职业_ */

  有一点,如果q里收入q可以的话,你好好学吧,M工作都要呆一两年Q你才会有认识的Q蟩来蟩ȝ对你不好Q真的,你还在磨性情的时候,只要你保持学习的能力Q别下班玩去了就可以了,有压力才有动力,好好留心心A的公司招聘的要求Q按那个要求d一个一q的训练与学习计划,一q后Q那个公司在{你?

JAVA之\ 2008-01-26 16:17 发表评论
]]>
面向对象设计模式与原?/title><link>http://www.tkk7.com/xixidabao/archive/2007/04/29/114505.html</link><dc:creator>JAVA之\</dc:creator><author>JAVA之\</author><pubDate>Sun, 29 Apr 2007 02:26:00 GMT</pubDate><guid>http://www.tkk7.com/xixidabao/archive/2007/04/29/114505.html</guid><description><![CDATA[<table cellSpacing=0 cellPadding=0 width=760 align=center border=0> <tbody> <tr> <td class=title vAlign=center align=middle height=56><strong><font color=#ff0000 size=3>面向对象设计模式与原?br><!-- #EndEditable --></font></strong></td> </tr> <tr> <td class=formtitle align=middle height=40><!-- #BeginEditable "2" --><!-- #EndEditable --></td> </tr> </tbody> </table> <table height=65 cellSpacing=0 cellPadding=0 width=760 align=center border=0> <tbody> <tr> <td class=content height=65><!-- #BeginEditable "3" --> <table width=760 align=center> <tbody> <tr> <td class=content><strong>设计模式?/strong> <p>每一个模式描qC一个在我们周围不断重复发生的问题,以及该问题的解决Ҏ(gu)的核心?br>-- Christopher Alexander</p> <p>设计模式描述了Y件设计过E中某一cd见问题的一般性的解决Ҏ(gu)。面向对象设计模式描qC面向对象设计q程中、特定场景下、类与相互通信的对象之间常见的l织关系?/p> <p><strong>GoF23 U设计模?/strong></p> <p>历史性著作《设计模式:可复用面向对象Y件的基础》一书中描述?3U经兔R向对象设计模式,创立了模式在软g设计中的C。该?br>四位作者被Zq称为Gang of Four QGoFQ,“四hl?#8221;Q该书描q的23U经典设计模式又被h们称为GoF23 U设计模式?/p> <p>׃《设计模式:可复用面向对象Y件的基础》一书确定了设计模式的地位,Z通常所说的设计模式隐含地表C?#8220;面向对象设计模式”?br>但这q不意味“设计模式”q?#8220;面向对象设计模式”Q也不意味着GoF23U模式就表示了所有的“面向对象设计模式”。除?#8220;面向对象设计模式”外,q有其他设计模式。除了GoF23 U设计模式外Q还有更多的面向对象设计模式?/p> <p>GoF23 U设计模式是学习面向对象设计模式的v点,而非l点Q本培训评的目标是让学员在建立在有效方法的基础上,掌握GoF23U设计模式?/p> <p><strong>设计模式与面向对?/strong></p> <p>面向对象设计模式解决的是“cM怺通信的对象之间的l织关系Q包括它们的角色、职责、协作方式几个方面?/p> <p>面向对象设计模式?#8220;好的面向对象设计”Q所?#8220;好的面向对象设计”是那些可以满?#8220;应对变化Q提高复?#8221;的设计?/p> <p>面向对象设计模式描述的是软g设计Q因此它是独立于~程语言的,但是面向对象设计模式的最l实C然要使用面向对象~程语言来表达,本课E基于C#语言Q但实际上它适用于支?NET框架的所?NET语言Q如Visual Basic.NET、C++/CLI{?/p> <p>面向对象设计模式不像法技巧,可以照搬照用Q它是徏立在?#8220;面向对象”U熟、深入的理解的基上的l验性认识。掌握面向对象设计模式的前提是首先掌?#8220;面向对象”Q?</p> <p><strong>从编E语a直观了解面向对象</strong></p> <p>各种面向对象~程语言怺有别Q但都能看到它们寚w向对象三大机制的支持Q即Q?“装、ѝ多?#8221;</p> <blockquote>– 装Q隐藏内部实?br>– l承Q复用现有代?br>– 多态,改写对象行ؓ</blockquote> <p>使用面向对象~程语言Q如C#Q,可以推动E序员以面向对象的思维来思考Y件设计结构,从而强化面向对象的~程范式?/p> <p>C#是一门支持面向对象编E的优秀语言Q包括:各种U别的封装支持;单实现?多接口实玎ͼ抽象Ҏ(gu)与虚Ҏ(gu)重写?/p> <p><strong>但OOPLq面向对象的全?/strong></p> <p>通过面向对象~程语言QOOPLQ认识到的面向对象,q不是面向对象的全部Q甚臛_是浅陋的面向对象?/p> <p>OOPL的三大机?#8220;装、ѝ多?#8221; 可以表达面向对象的所有概念,但这三大机制本nq没有刻d面向对象的核心精。换a之,既可以用q三大机制做?#8220;好的面向对象设计”Q也可以用这三大机制 做出“差的面向对象设计”。不是用了面向对象的语aQ例如C#Q,实C面向对象的设计与开发!因此我们不能依赖~程语言的面向对象机Ӟ来掌握面向对象?/p> <p>OOPL没有回答面向对象的根本性问题——我们ؓ什么要使用面向对象Q我们应该怎样使用三大机制来实?#8220;好的面向对象”Q?我们应该遵@什么样的面向对象原则?</p> <p>M一个严肃的面向对象E序员(例如C#E序员)Q都需要系l地学习面向对象的知识,单纯从编E语a上获得的面向对象知识Q不能够胜Q面向对象设计与开发?/p> <p><strong>从一个示例谈?/strong></p> <p>CZ场景Q?/p> <p>我们需要设计一个h事管理系l,其中的一个功能是对各U不同类型的员工Q计其当月的工资——不同类型的员工Q拥有不同的薪金计算制度?/p> <p>l构化做?/p> <p>1.获得Zpȝ中所有可能的员工cd<br>2.Ҏ(gu)不同的员工类型所对应的不同的薪金制度Q计其工资<br>enumEmployeeType<br>{<br>Engineer;<br>Sales;<br>Manager;<br>…<br>}<br>// 计算工资E序<br>if ( type == EmployeeType.Engineer) <br>{<br>……<br>}<br>else if (type == Employeetype.Sales) <br>{<br>……<br>}</p> <p>面向对象设计</p> <p>1.Ҏ(gu)不同的员工类型设计不同的c,qɘq些cȝ承自一个Employee抽象c,其中有一个抽象方法GetSalary?br>2.在各个不同的员工cMQ根据自q薪金制度Q重写(overrideQGetSalaryҎ(gu)?br>abstract class Employee<br>{<br>…<br>public abstract int GetSalary();<br>}<br>class Engineer: Employee<br>{<br>…<br>public override int GetSalary() <br>{<br>…<br>}<br>}<br>class Sales: Employee<br>{<br>…<br>public override int GetSalary() <br>{<br>…<br>}<br>}<br>// 昄工资E序<br>Employee e = emFactory.GetEmployee(id);<br>MessageBox.Show( e.GetSalary());</p> <p>CZ场景Q?/p> <p>现在需求改变了……随着客户公司业务规模的拓展,又出C更多cd的员工,比如钟点工、计件工……{等Q这对h事管理系l提Z挑战——原有的E序必须改变?/p> <p>l构化做?/p> <p>几乎所有涉及到员工cd的地方(当然包括“计算工资E序”Q都需要做改变……q些代码都需要重新编译,重新部v…….</p> <p>面向对象做法</p> <p>只需要在新的文g里增L的员工类Q让其承自Employee抽象c,q写GetSalary()Ҏ(gu)Q然后在EmployeeFactory.GetEmployeeҎ(gu)中根据相xӞ产生新的员工cd可以了。其他地方(昄工资E序、EngineercRSalescȝQ则不需要做M改变?/p> <p><strong>重新认识面向对象</strong></p> <p>对于前面的例子,从宏观层面来看,面向对象的构建方式更能适应软g的变化,能将变化所带来的媄响减为最?/p> <p>从微观层面来看,面向对象的方式更各个cȝ“责Q”Q新增员工类型不会媄响原来员工类型的实现代码——这更符合真实的世界Q也<br>更能控制变化所影响的范_毕竟EngineercM应该为新增的“钟点?#8221;来买?#8230;…</p> <p>对象是什么? </p> <blockquote>– 从概念层面讲Q对象是某种拥有责Q的抽象?br>– 从规格层面讲Q对象是一pd可以被其他对象用的公共接口?br>– 从语a实现层面来看Q对象封装了代码和数据?/blockquote> <p>有了q些认识之后Q怎样才能设计“好的面向对象”Q?/p> <blockquote>– 遵@一定的面向对象设计原则<br>– 熟?zhn)一些典型的面向对象设计模式</blockquote> <p><strong>从设计原则到设计模式</strong></p> <p>针对接口~程Q而不是针对实现编E?/p> <p>– 客户无需知道所使用对象的特定类型,只需要知道对象拥有客h期望的接口?/p> <p>优先使用对象l合Q而不是类l承</p> <p>– cȝ扉K常?#8220;白箱复用”Q对象组合通常?#8220;黑箱复用”。承在某种E度上破坏了装性,子类父类耦合度高Q而对象组合则只要求被l合的对象具有良好定义的接口Q耦合度低?/p> <p>装变化?/p> <p>– 使用装来创建对象之间的分界层,让设计者可以在分界层的一侧进行修改,而不会对另一侧生不良的影响Q从而实现层ơ间的松耦合?/p> <p>使用重构得到模式——设计模式的应用不宜先入ZQ一上来׃用设计模式是对设计模式的最大误用。没有一步到位的设计模式。敏捯Y件开发实跉|倡的“Refactoring to Patterns ”是目前普遍公认的最好的使用设计模式的方法?/p> <p><strong>几条更具体的设计原则</strong></p> <p>单一职责原则QSRPQ:</p> <p>– 一个类应该仅有一个引起它变化的原因?/p> <p>开攑ְ闭原则(OCPQ:</p> <p>– cL块应该是可扩展的Q但是不可修改(Ҏ(gu)展开放,Ҏ(gu)改封闭)</p> <p>Liskov 替换原则QLSPQ?<br>– 子类必须能够替换它们的基c?/p> <p>. 依赖倒置原则QDIPQ:</p> <p>– 高层模块不应该依赖于低层模块Q二者都应该依赖于抽象?/p> <p>– 抽象不应该依赖于实现l节Q实现细节应该依赖于抽象?/p> <p>接口隔离原则QISPQ:</p> <p>– 不应该强q客L序依赖于它们不用的方法?/p> <p><strong>ȝ</strong></p> <p>设计模式描述了Y件设计过E中某一cd见问题的一般性的解决?案。面向对象设计模式描qC面向对象设计q程中、特定场景下、类与相互通信的对象之间常见的l织关系?/p> <p>深刻理解面向对象是学好设计模式的基础Q掌握一定的面向对象设计原则才能把握面向对象设计模式的精髓,从而实现灵z运用设计模<br>式?/p> <p>三大基本面向对象设计原则</p> <blockquote>– 针对接口~程Q而不是针对实现编E?br>– 优先使用对象l合Q而不是类l承<br>– 装变化?/blockquote></td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <img src ="http://www.tkk7.com/xixidabao/aggbug/114505.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/xixidabao/" target="_blank">JAVA之\</a> 2007-04-29 10:26 <a href="http://www.tkk7.com/xixidabao/archive/2007/04/29/114505.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式之Observer http://www.tkk7.com/xixidabao/archive/2007/04/18/111546.htmlJAVA之\JAVA之\Wed, 18 Apr 2007 03:14:00 GMThttp://www.tkk7.com/xixidabao/archive/2007/04/18/111546.html设计模式之Observer

Java深入C定程?׃可避免的到设计模式(design pattern)q一概念,了解设计模式,自己对java中的接口或抽象类应用有更q理解.设计模式在java的中型系l中应用q泛,遵@一定的~程模式,才能使自q代码便于理解,易于交流,Observer(观察?模式是比较常用的一个模?其在界面设计中应用q泛,而本站所x的是Java在电(sh)子商务系l中应用,因此想从?sh)子商务实例中分析Observer的应?

虽然|上商店形式多样,每个站点有自q特色,但也有其一般的共?单就"商品的变?以便及时通知订户"q一?是很多网上商店共有的模式,q一模式cMObserver patern.

具体的说,如果|上商店中商品在名称 h{方面有变化,如果pȝ能自动通知会员,是|上商店区别传统商店的一大特?q就需要在商品product中加入Observerq样角色,以便productl节发生变化?Observer能自动观察到q种变化,q能q行及时的update或notify动作.

Java的APIqؓ为我们提供现成的Observer接口Java.util.Observer.我们只要直接使用它就可以.

我们必须extends Java.util.Observer才能真正使用?
1.提供Add/Delete observer的方?
2.提供通知(notisfy) 所有observer的方?

import java.util.Observable;

public class product extends Observable {

 private String name;

 private float price;
 public product(){
 }

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
  //讄变化?
  setChanged();
  notifyObservers(name);

 }

 public float getPrice() {
  return price;
 }

 public void setPrice(float price) {
  this.price = price;
  //讄变化?br>  setChanged();
  notifyObservers(new Float(price));

 }

 //以下可以是数据库更新 插入命o.
 public void saveToDb() {
  //  .....................

 }

 public static void main(String[] args) {
  product p=new product();
  p.addObserver(new NameObserver());
  p.addObserver(new PriceObserver());
  p.setPrice(100);
  p.setName("name");
 }
}


我们注意?在productcM 的setXXXҎ(gu)?我们讄?notify(通知)Ҏ(gu), 当调用setXXX,实际上就触发了notisfyObserversҎ(gu),q将通知相应观察者应该采取行动了.

下面看看q些观察者的代码,他们I竟采取了什么行?

//观察者NameObserver主要用来对品名U?name)q行观察?br>public class NameObserver implements Observer{

  private String name=null;

  public void update(Observable obj,Object arg){

    if (arg instanceof String){

     name=(String)arg;
     //产品名称改变值在name?br>     System.out.println("NameObserver :name changet to "+name);

    }

  }

}

//观察者PriceObserver主要用来对品h(hun)?price)q行观察?br>public class PriceObserver implements Observer{

  private float price=0;

  public void update(Observable obj,Object arg){

    if (arg instanceof Float){

     price=((Float)arg).floatValue();
  
     System.out.println("PriceObserver :price changet to "+price);

    }

  }

}

输出l果如下Q?br>PriceObserver :price changet to 100.0
NameObserver :name changet to name

转自Q?a href="http://www.tkk7.com/Sprite-bei/archive/2007/04/16/110976.html">http://www.tkk7.com/Sprite-bei/archive/2007/04/16/110976.html

JAVA之\ 2007-04-18 11:14 发表评论
]]>
设计模式Q用Java动态代理实现AOP http://www.tkk7.com/xixidabao/archive/2007/04/08/109208.htmlJAVA之\JAVA之\Sun, 08 Apr 2007 02:55:00 GMThttp://www.tkk7.com/xixidabao/archive/2007/04/08/109208.html 设计模式Q用Java动态代理实现AOP http://www.itisedu.com   2006-12-7 15:08:52   中科永联 [关键字]设计模式 Java 动?代理 AOP 目前整个开发社区对AOP(Aspect Oriented Programing)推崇备至Q也涌现出大量支持AOP的优UFramework,--Spring, JACJboss AOP {等。AOPg一时之间成了潮。Java初学者不要发出感慨Q?a target=_new>OOPq没有学通呢Q又来AOP。本文不是要在理Z具体阐述何ؓAOP, Z要进行AOP . 要详l了解学习AOP可以到它老家http://aosd.netȝ瞧。这里只是意N过一个简单的例子向初学者展CZ下如何来q行AOP.

  Z单v见,例子没有没有使用MW三方的AOP Framework, 而是利用Java语言本n自带的动态代理功能来实现AOP. 

  让我们先回到AOP本nQAOP主要应用于日志记录,性能l计Q安全控?事务处理{方面。它的主要意囑ְ要将日志记录Q性能l计Q安全控制等{代码从商业逻辑代码中清楚的划分出来Q我们可以把q些行ؓ一个一个单独看作系l所要解决的问题Q就是所谓的面向问题的编E?不知AOP译作面向问题的编E是否欠?。通过对这些行为的分离Q我们希望可以将它们独立地配|到商业Ҏ(gu)中,而要改变q些行ؓ也不需要媄响到商业Ҏ(gu)代码?nbsp;

  假设pȝ׃pd的BusinessObject所完成业务逻辑功能Q系l要求在每一ơ业务逻辑处理时要做日志记录。这里我们略d体的业务逻辑代码?nbsp;

public interface BusinessInterface { 
 public void processBusiness(); 


public class BusinessObject implements BusinessInterface { 
 private Logger logger = Logger.getLogger(this.getClass().getName()); 
 public void processBusiness(){ 
  try { 
   logger.info("start to processing..."); 
   //business logic here. 
   System.out.println(“here is business logic”); 
   logger.info("end processing..."); 
  } catch (Exception e){ 
   logger.info("exception happends..."); 
   //exception handling 
  } 
 } 


  q里处理商业逻辑的代码和日志记录代码混合在一Pq给日后的维护带来一定的困难Qƈ且也会造成大量的代码重复。完全相同的log代码出现在pȝ的每一个BusinessObject中?nbsp;

按照AOP的思想Q我们应该把日志记录代码分离出来。要这些代码分d涉及C个问题,我们必须知道商业逻辑代码何时被调用,q样我们好插入日志记录代码。一般来说要截获一个方法,我们可以采用回调Ҏ(gu)或者动态代理。动态代理一般要更加灉|一些,目前多数的AOP Framework也大都采用了动态代理来实现。这里我们也采用动态代理作Z子?nbsp;

  JDK1.2以后提供了动态代理的支持Q?a target=_new>E序员通过实现java.lang.reflect.InvocationHandler接口提供一个执行处理器Q然后通过java.lang.reflect.Proxy得到一个代?a target=_new>对象Q通过q个代理对象来执行商业方?在商业方法被调用的同Ӟ执行处理器会被自动调用?nbsp;

  有了JDK的这U支持,我们所要做的仅仅是提供一个日志处理器?nbsp;

public class LogHandler implements InvocationHandler { 

 private Logger logger Q?nbsp;Logger.getLogger(this.getClass().getName()); 
  private Object delegate; 
  public LogHandler(Object delegate){ 
   this.delegate = delegate; 
  } 

 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 
  Object o = null; 
  try { 
   logger.info("method stats..." Q?nbsp;method); 
   o = method.invoke(delegate,args); 
   logger.info("method ends..." + method); 
  } catch (Exception e){ 
   logger.info("Exception happends..."); 
   //excetpion handling. 
  } 
  return o; 
 } 


  现在我们可以把BusinessObject里面的所有日志处理代码全部去掉了?nbsp;

public class BusinessObject implements BusinessInterface { 

 private Logger logger = Logger.getLogger(this.getClass().getName()); 
 public void processBusiness(){ 
  //business processing 
  System.out.println(“here is business logic”); 
 } 


  客户?/font>调用商业Ҏ(gu)的代码如下:

BusinessInterface businessImp = new BusinessObject(); 

InvocationHandler handler = new LogHandler(businessImp); 

BusinessInterface proxy = (BusinessInterface) Proxy.newProxyInstance( 
 businessImp.getClass().getClassLoader(), 
 businessImp.getClass().getInterfaces(), 
 handler); 

proxy.processBusiness(); 

  E序输出如下Q?nbsp;

INFO: method stats... 
here is business logic 
INFO: method ends... 

  x我们的第一ơ小试是完成了。可以看刎ͼ采用AOP之后Q日志记录和业务逻辑代码完全分开了,以后要改变日志记录的话只需要修Ҏ(gu)志记录处理器p了,?a target=_new>业务对象本nQBusinessObjectQ无需做Q何修攏Vƈ且这个日志记录不会造成重复代码了,所有的商业处理对象都可以重用这个日志处理器?nbsp;

  当然在实际应用中Q这个例子就昑־太粗p了。由于JDK的动态代理ƈ没有直接支持一ơ注册多个InvocationHandlerQ那么我们对业务处理Ҏ(gu)既要日志记录又要性能l计Ӟ需要自己做一些变通了。一般我们可以自己定义一个Handler接口Q然后维护一个队列存放所有Handler, 当InvocationHandler被触发的时候我们依ơ调用自qHandler。所q的是目前几乎所有的AOP Framework都对q方面提供了很好的支?q里推荐大家使用Spring? 来源Q赛q网论坛 中科永联高技术培训中心本着技术交、共享精,部分信息资料为网上收集,如果本页内容늊了?zhn)的版权,L刻通知我们Q我们将?个工作日内作出妥善处理,q向(zhn)致以诚挚的歉意?

JAVA之\ 2007-04-08 10:55 发表评论
]]>
模式与J2EE http://www.tkk7.com/xixidabao/archive/2007/04/08/109205.htmlJAVA之\JAVA之\Sun, 08 Apr 2007 02:42:00 GMThttp://www.tkk7.com/xixidabao/archive/2007/04/08/109205.html 模式与J2EE http://www.itisedu.com   2006-5-12 15:56:28   中科永联 [关键字]模式 J2EE


信息工程是以当前数据pȝ为基Q在一个企业或企业的主要部门,关于信息pȝ的规 划、分析、设计和构成的一整套怺兌的正规化、自动化的技术应用?

 

--- JAMES Martin 

    正如上面信息工程的创始hJames MartinZ息工E的概念所做定?a target=_new>c?/font>|模式(patterns)的创始h建筑师ChriSTopher Alexander?lt;模式语言Q?977?979>一书中Ҏ(gu)式的概念q行了如下描q?附注Q书名后面的q䆾代表在各个不同时期的作品Q下面Ş式同?Q?br>每一个模式描qC一个在我们周围不断重复发生的问题,以及该问题的解决Ҏ(gu)的核心。这P你就能一ơ又一ơ的使用该解x案而不必做重复力_。每个模式是׃部分l成的一个规则,q个规则描述特定环境、问题和解决Ҏ(gu)之间的关pR简单的_没有一个模式是独立的实体,每个模式都存在着怺支持Q但支持的程度不同:大的模式可以内嵌的模式Q同{层ơ的模式q列存在Q而小的模式被嵌入到大的模式之中?
--- Christopher Alexander  
    模式的概念在软g行业被采用以后,得到的广泛的发展Q现在已l存在许多种cd的模式应用,其中比较有名的箸作有Q?a target=_new>GoF(Erich GAmma、Richard Helm、Ralph Johnson和John VlissIDEs四hQ简UͼGang of Four[GoF])?lt;设计模式Q?995>QMartin Fowler?lt;分析模式Q?997>QFrank Buschmann{h?lt;体系l构模式Q?996?000>、Jim O.Coplien、Niel Harrison{h?lt;~程模式Q?995?996?998?999>和Deepak Alur{h?lt;J2EE核心模式Q?001>{,其中最具媄响的是GoF?lt;设计模式>一书,书中详细讨论了三U类型,?3U模式。好的设计源于工作中l验的积累,当设计用标准的模板以模式的方式q行交流Ӟ模式成了交和重用的强大机Ӟq且可以改善设计和开发Y件的方式。模式可以帮助我们在一个特定的环境里整理ƈ记录已知的可重现的问题及解决Ҏ(gu)Qƈ且通过模式来与他h交流q些知识Q这些模式可以解军_不同环境中重复出现的问题。模式可以设计重复使用Q重复用已知的解决Ҏ(gu)可以~短设计和开发应用的周期Q有效的使用模式Q可以我们q离重复投资的怪圈。模式的关键在于单性和可重现性?br>    举一个模式应用的单示例。例如,在你的便携式?sh)?/font>上运行一个进E中?a target=_new>对象Qƈ且这些对象需要和q行在另一q程中的别的对象通信Q也许这一q程q不在你的便携式?sh)脑上,而在别的地方。你又不惌pȝ中的对象担心如何扑֯|上的其他对象或者执?a target=_new>q程q程调用。这Ӟ可以使用代理(Proxy模式Q详见GoF?lt;设计模式>一?模式来解册个问题,你能做的事就是ؓq个q程对象在你的本地过E中建立一个代理对象,该代理对象和q程对象h相同的接口。你的本地对象利用通常处理q程中的消息发送来和代理交谈。这时代理对象负责把消息传送给实在对象Q而不实在对象位于何处?br>    ׃下面要讲的Java 2q_的企业版(J2EE)应用模式中很多用C设计模式?a target=_new>重构(Refactoring)的概念,所以在此有必要再概要介l一下重构的概念。重构已l被证明可以L软g的腐朽和衰|Q关于重构方面的有名怽当然首推是Martin Fowler所写的<重构Q?999>一书了Q书中详l介l了重构的七大类型,?0余种具体的重构手法,同时也指出测试机制在重构中的重要性。书中Martin Fowler寚w构的概念q行了详l说明:
    重构是对软g内部l构的一U调_目地是在不改变[软g之可察行为]的前提下Q提高其可理解性,降低其修Ҏ(gu)本。重构是一U有U律的、经q训l的、有条不紊的E序整理Ҏ(gu)Q可以将整理q程中不心引入的错误的机率降到最低,本质上说Q重构就是在代码写好之后改进它的设计。重构之前,首先查自己是否有一套可靠的试机制Q这些测试必L我检验能力?/p>


--- Martin Fowler 

    建立于Java~程语言和Java技术基之上的J2EEq_是最适用于企业分布式环境的应用l构Q它被设计ؓ面向多层体系的结构。J2EE包含下面关键技术:Java服务器页?Java Service PageQJSP)?a target=_new>Servlet?a target=_new>Enterprise JavaBeans(EJB)lg?a target=_new>Java消息服务(Java Message ServiceQ?a target=_new>JMS)?a target=_new>JDBC和Java命名与目录接?Java Naming and DIrECtory InterfaceQJNDI)。由于J2EEq_?a target=_new>分层pȝQ所以我们将J2EE的层ơ模型化Q这个模型得我们将职责逻辑地分C同的层中Q共分了五个层次Q客户层、表C层、业务层、集成层和资源层。因为客户层和资源层q不是J2EEq_直接x的问题,所以后面介l的15个J2EE应用模式全部属于上面五层中的中间三层Q其中表C层模式包含与Servlet和JSP技术相关的模式、业务层模式包含与EJB技术有关的模式、集成层模式包含与JMS和JDBC有关的模式。具体模式可参看下面表格Q?/p>

表一Q表C层模式
模式?/strong> 单描q?/strong>
截取qo?Intercepting Filter) 促进h的预先处理和后处?/td>
前端控制?Front Controller) 提供h处理的集中控制器
视图助手(View Helper) 把与表示层格式化无关的逻辑装到助手组?/td>
复合视图(CompOSite View) 从原子的子组件创Z个聚集视?/td>
工作者服?Service To Worker) 合ƈ分发者组件、前端控制器和视囑֊手模?/td>
分发者视?Dispatcher View) 合ƈ分发者组件、前端控制器和视囑֊手模式,把许多动作推q到视图处理


表二Q业务层模式
模式?/strong> 单描q?/strong>
业务委托(Business Delegate) 把表C层和服务层分隔开Qƈ且提供服务的外观和代理接?/td>
值对?Value object) 通过减少|络对话Q以加速层之间的数据交?/td>
会话外观(Session Facade) 隐藏业务对象复性,集中?a target=_new>工作?/font>处理
复合实体(Composite Entity) 通过把参数相关的对象分组q单个实体beanQ表C计粗_度实体bean的最好经?/td>
值对象组装器(Value Object ASsembler) 把来自多个数据源的值对象组装成一个复合值对?/td>
值列表处理器(Value List Handler) 理查询执行、结果缓册Ӏ以及结果处?/td>
服务定位?Service Locator) 装业务服务查找和创建的复杂性,定位业务服务工厂


表三Q集成层模式
模式?/strong> 单描q?/strong>
数据讉K对象(Data Access Object) 抽象数据源,提供Ҏ(gu)据的透明讉K
服务Ȁ发器(Service Activator) 加速EJBlg的异步处?/td>

    ׃J2EE模式众多Q篇q有限,q里只概要介l其中的一U应用模?- 集成层的数据讉K对象(DAO)模式Q有兴趣的读者可以参看下面参考文献中的资料?br>数据讉K对象模式

 数据讉K对象模式

1、问?br>    Ҏ(gu)数据源不同,数据讉K也不同。根据存储的cd(关系数据?/font>?a target=_new>面向对象数据库等)和供应商不同Q持久性存?比如数据?的访问差别也很大。当业务lg(如会话bean)或表C组?如助手组?需要访问某数据源时Q它们可以用合适的API来获得连接性,以及操作该数据源。但是在q些lg中包含连接性和数据讉K代码会引入这些组件及数据源实C间的紧密耦合。组件中q类代码依赖性应用E序从某U数据源q移到其它种cȝ数据源将变得非常ȝ和困难,当数据源变化Ӟlg也需要改变,以便于能够处理新cd的数据源?/p>

2、解x?br>    使用数据讉K对象(DAO)来抽象和装所有对数据源的讉K。DAO理着与数据源的连接以便于索和存储数据QDAO实现了用来操作数据源的访问机制。依赖于DAO的业务组件ؓ?a target=_new>客户?/font>使用DAO提供了更单的接口QDAO完全向客L隐藏了数据源实现l节。由于当低层数据源实现变化时QDAO向客L提供的接口不会变化,所以该模式允许DAO调整C同的存储模式Q而不会媄响其客户端或业务lg。重要的是,DAO充当lg和数据源之间的适配器?/p>

3、实现策?br>    通过调整抽象工厂(Abstract Factory)模式和工厂方?Factory MethodQ这二个创徏型模式的实现详情可参看GoF?lt;设计模式>一?模式QDAO模式可以辑ֈ很高的灵zd?

当低层存储不会随着实现变化而变化时Q可以用工厂方法模式来实现该策略,以生应用程序需要的大量DAOQ如下面cd1所C?
当低层存储随着实现的变化而变化时Q策略可以通过使用抽象工厂模式而实现。抽象工厂可以基于工厂方法实现而创建,q可使用工厂Ҏ(gu)实现Q该{略提供一个DAO的抽象工厂对象,其中该对象可以构造多U类型的具体的DAO工厂Q每个工厂支持一U不同类型的持久性存储实现。一旦你获取某特定实现的具体DAO工厂Q你可以使用它来生成该实C所支持和实现的DAOQ如下面cd2所C?


 

4、应?br>    当数据访问代码被直接嵌入到有其他不相兌责的某类中时Q就会修改变的十分困难。这时可以采用分L据访问代码的解决Ҏ(gu)Q将数据讉K代码抽取C个新cMQƈ且把该新c逻辑或者物理地Ud到离数据源比较近的位|,q样可以增强模块性和可重用性,如下面图3所C。具体作法可以用提炼类(Extract ClassQ一U重构手法,l节可参看Martin?lt;重构>一?Ҏ(gu)创徏一个新c,q将原来cM把数据访问代码移动到q个新的数据讉K对象(DAO)c,使用q个新的DAO对象从控制器cM讉K数据?br>    CZQ持久性逻辑被嵌入到一个用新DAO对象理的持久性的某企业新DAO对象中,把持久性代码和该企业新DAO对象代码l合h会创q、紧密耦合的代码。当持久性代码是该企业新DAO对象的一部分Ӟ对该持久性存储的M改动都要求更改该新DAO对象的持久性代码。这U耦合对企业新DAO对象代码l护会带来负面的影响。下面图4用分L据访问对象方法对其进行重构改q后的结果?/p>

    ?5个J2EE模式中,每个模式都作用于设计模式和构架模式之间的某些斚w。每个模式不是孤立存在的Q需要其它模式的支持才能更加体现其含义和用处Qؓ了最大限度的用好模式Q还需要充分理解模式之间的关系?

 参考文?

pȝ分析员教E?--- |晓沛等?
设计模式Q可复用面向对象软g的元?--- 李英军等?
重构-改善既有代码的设?--- 侯捷{译
J2EE核心模式 --- 牛志奇等?
UML_a(W二? --- 徐家译



JAVA之\ 2007-04-08 10:42 发表评论
]]>
Java模式设计之单例模式(一Q?/title><link>http://www.tkk7.com/xixidabao/archive/2006/06/18/53651.html</link><dc:creator>JAVA之\</dc:creator><author>JAVA之\</author><pubDate>Sun, 18 Jun 2006 14:15:00 GMT</pubDate><guid>http://www.tkk7.com/xixidabao/archive/2006/06/18/53651.html</guid><description><![CDATA[<table height=105 cellSpacing=0 cellPadding=0 width=760 align=center border=0> <tbody> <tr> <td class=title vAlign=center align=middle height=55>Java模式设计之单例模式(一Q?font color=#ff0000 size=3><strong><!-- #EndEditable --></strong></font></td> </tr> <tr> <td class=formtitle align=middle height=50><!-- #BeginEditable "2" --><font color=#000080><span style="FONT-FAMILY: 新細明體; mso-bidi-font-family: SimSun; mso-font-kerning: 0pt; mso-ascii-font-family: Comic Sans MS; mso-hansi-font-family: Comic Sans MS">阎宏 作者授?/span> </font><span lang=EN-US style="COLOR: black; FONT-FAMILY: 'Comic Sans MS'; mso-bidi-font-family: SimSun; mso-font-kerning: 0pt"><o:p></o:p></span><!-- #EndEditable --></td> </tr> </tbody> </table> <table height=65 cellSpacing=0 cellPadding=0 width=760 align=center border=0> <tbody> <tr> <td class=content height=65><!-- #BeginEditable "3" --> <table width="85%" align=center border=0> <tbody> <tr> <td class=content> <p class=MsoNormal style="MARGIN: 6pt 0cm 6pt 24pt; mso-para-margin-top: .5gd; mso-para-margin-right: 0cm; mso-para-margin-bottom: .5gd; mso-para-margin-left: 2.0gd; mso-layout-grid-align: none"><span lang=EN-US style="COLOR: black; FONT-FAMILY: 'Comic Sans MS'; mso-bidi-font-family: TimesNewRomanPSMT; mso-font-kerning: 0pt"><span id="tjd9779" class=f14>  作ؓ对象的创建模式[GOF95]Q?单例模式保某一个类只有一个实例,而且自行实例化ƈ向整个系l提供这个实例。这个类UCؓ单例cR?br><br>  注:本文乃阎宏博士的《Java与模式》一书的W十五章?br><br>  <strong><font color=#ac000>引言</font></strong><br><br>  <strong>单例模式的要?/strong><br><br>  单例单例<br><br>  昄单例模式的要Ҏ(gu)三个Q一是某各类只能有一个实例;二是它必自行创个事例;三是它必自行向整个pȝ提供q个实例。在下面的对象图中,有一?单例对象"Q?客户??客户? ?客户?是单例对象的三个客户对象。可以看刎ͼ所有的客户对象׃n一个单例对象。而且从单例对象到自n的连接线可以看出Q单例对象持有对自己的引用?br><br><img onerror="this.src='http://www.yesky.com/image20010518/60558.jpg';" hspace=3 src="http://www.yesky.com/image20010518/60558.jpg" align=center vspace=1 border=1><br><br>  <strong>资源理</strong><br><br>  一些资源管理器常常设计成单例模式?br><br>  在计机pȝ中,需要管理的资源包括软g外部资源Q譬如每台计机可以有若q个打印机,但只能有一个Printer SpoolerQ?以避免两个打C业同时输出到打印Z。每台计机可以有若q传真卡Q但是只应该有一个Y件负责管理传真卡Q以避免出现两䆾传真作业同时传到传真卡中的情c每台计机可以有若q通信端口Q系l应当集中管理这些通信端口Q以避免一个通信端口同时被两个请求同时调用?br><br>  需要管理的资源包括软g内部资源Q譬如,大多数的软g都有一个(甚至多个Q属性(propertiesQ文件存攄l配|。这Lpȝ应当׃个对象来理一个属性文件?br><br>  需要管理的软g内部资源也包括譬如负责记录网站来访h数的部gQ记录Y件系l内部事件、出错信息的部gQ或是对pȝ的表现进行检查的部g{。这些部仉必须集中理Q不可政出多头?br><br>  q些资源理器构件必d有一个实例,q是其一Q它们必自行初始化Q这是其二;允许整个pȝ讉K自己q是其三。因此,它们都满_例模式的条gQ是单例模式的应用?br><br>  <strong>一个例子:Windows 回收?/strong><br><br>  Windows 9x 以后的视H系l中都有一个回收站Q下囑ְ昄了Windows 2000 的回收站?br><br><img onerror="this.src='http://www.yesky.com/image20010518/60560.jpg';" hspace=3 src="http://www.yesky.com/image20010518/60560.jpg" align=center vspace=1 border=1><br><br>  在整个视H系l中Q回收站只能有一个实例,整个pȝ都用这个惟一的实例,而且回收站自行提供自q实例。因此,回收站是单例模式的应用?br><br>  <strong>双重查成?/strong><br><br>  在本章最后的附录里研I了双重查成例。双重检查成例与单例模式q无直接的关p,但是׃很多C 语言设计师在单例模式里面使用双重查成例,所以这一做法也被很多Java 设计师所模仿。因此,本书在附录里提醒读者,双重查成例在Java 语言里ƈ不能成立Q详情请见本章的附录?br><br>单例模式的结?br><br>  单例模式有以下的特点Q?br><br>   .. 单例cd可有一个实例?br><br>   .. 单例cd自己创p惟一的实例?br><br>   .. 单例cdȝ所有其他对象提供这一实例?br><br>  虽然单例模式中的单例c被限定只能有一个实例,但是单例模式和单例类可以很容易被推广CQ意且有限多个实例的情况,q时候称它ؓ多例模式QMultiton PatternQ?和多例类QMultiton ClassQ,误"专题Q多例(Multiton Q模式与多语a支持"一章。单例类的简略类囑֦下所C?br><br><br><br>  ׃Java 语言的特点,使得单例模式在Java 语言的实C有自q特点。这些特点主要表现在单例cd何将自己实例化上?br><br>  饿汉式单例类饿汉式单例类是在Java 语言里实现得最为简便的单例c,下面所C的cd描述了一个饿汉式单例cȝ典型实现?br><br><br><br>  从图中可以看出,此类已经自已自己实例化?br><br>  代码清单1Q饿汉式单例c?br><br>public class EagerSingleton <br>{ <br>private static final EagerSingleton m_instance = <br>new EagerSingleton(); <br>/** <br>* U有的默认构造子 <br>*/ <br>private EagerSingleton() { } <br>/** <br>* 静态工厂方?nbsp;<br>*/ <br>public static EagerSingleton getInstance() <br>{<br><br>·224·Java 与模?nbsp;<br>return m_instance; <br>}<br>} <br><br>  读者可以看出,在这个类被加载时Q静态变量m_instance 会被初始化,此时cȝU有构造子会被调用。这时候,单例cȝ惟一实例p创徏出来了?br><br>  Java 语言中单例类的一个最重要的特Ҏ(gu)cȝ构造子是私有的Q从而避免外界利用构造子直接创徏ZQ意多的实例。值得指出的是Q由于构造子是私有的Q因此,此类不能被ѝ?br></span></span></p> <p><span id="dvl1j79" class=f14>  <strong>懒汉式单例类</strong><br><br>  与饿汉式单例cȝ同之处是Q类的构造子是私有的。与饿汉式单例类不同的是Q懒汉式单例cdW一ơ被引用时将自己实例化。如果加载器是静态的Q那么在懒汉式单例类被加载时不会自己实例化。如下图所C,cd中给Z一个典型的饿汉式单例类实现?br><br><img onerror="this.src='http://www.yesky.com/image20010518/60565.jpg';" hspace=3 src="http://www.yesky.com/image20010518/60565.jpg" align=center vspace=1 border=1><br><br>  代码清单2Q懒汉式单例c?br><br>package com.javapatterns.singleton.demos;<br>public class LazySingleton<br>{<br>private static LazySingleton<br>m_instance = null;<br>/**<br>* U有的默认构造子Q保证外界无法直接实例化<br>*/<br>private LazySingleton() { }<br>/**<br>* 静态工厂方法,q还此类的惟一实例<br>*/<br>synchronized public static LazySingleton<br>getInstance()<br>{<br>if (m_instance == null)<br>{<br>m_instance = new LazySingleton();<br>}<br>return m_instance;<br>}<br>} <p><br>  读者可能会注意刎ͼ在上面给出懒汉式单例cd现里寚w态工厂方法用了同步化,以处理多U程环境。有些设计师在这里徏议用所谓的"双重查成?。必L出的是,"双重查成?不可以在Java 语言中用。不十分熟?zhn)的读者,可以看看后面l出的小节?br><br>  同样Q由于构造子是私有的Q因此,此类不能被ѝ饿汉式单例cd自己被加载时将自己实例化。即便加载器是静态的Q在饿汉式单例类被加载时仍会自己实例化。单从资源利用效率角度来Ԍq个比懒汉式单例cȝ差些?br><br>  从速度和反应时间角度来Ԍ则比懒汉式单例类E好些。然而,懒汉式单例类在实例化Ӟ 必须处理好在多个U程同时首次引用此类时的讉K限制问题Q特别是当单例类作ؓ资源控制器,在实例化时必然涉及资源初始化Q而资源初始化很有可能耗费旉。这意味着出现多线E同旉ơ引用此cȝ机率变得较大?br><br>  饿汉式单例类可以在Java 语言内实玎ͼ 但不易在C++ 内实玎ͼ因ؓ静态初始化在C++ 里没有固定的序Q因而静态的m_instance 变量的初始化与类的加载顺序没有保证,可能会出问题。这是Z么GoF 在提出单例类的概忉|QD的例子是懒汉式的。他们的书媄响之大,以致Java 语言中单例类的例子也大多是懒汉式的。实际上Q本书认为饿汉式单例cLW合Java 语言本n的特炏V?br><br></p> </span><br> <p> </p> <p> </p> <p><span id="fn99zbr" class=f14>  <strong>登记式单例类</strong><br><br>  登记式单例类是GoF Z克服饿汉式单例类及懒汉式单例cd不可l承的缺点而设计的。本书把他们的例子翻译ؓJava 语言Qƈ它自己实例化的方式从懒汉式改ؓ饿汉式。只是它的子cd例化的方式只能是懒汉式的Q?q是无法改变的。如下图所C是登记式单例类的一个例子,图中的关pȝ表明Q此cd自己实例化?br><br><img onerror="this.src='http://www.yesky.com/image20010518/60566.jpg';" hspace=3 src="http://www.yesky.com/image20010518/60566.jpg" align=center vspace=1 border=1><br><br>  代码清单3Q登记式单例c?br><br>import java.util.HashMap;<br>public class RegSingleton<br>{<br>static private HashMap m_registry = new HashMap();<br>static<br>{<br>RegSingleton x = new RegSingleton();<br>m_registry.put( x.getClass().getName() Q?x);<br>}<br>/**<br>* 保护的默认构造子<br>*/<br>protected RegSingleton() {}<br>/**<br>* 静态工厂方法,q还此类惟一的实?br>*/<br>static public RegSingleton getInstance(String name)<br>{<br>if (name == null)<br>{<br>name = "com.javapatterns.singleton.demos.RegSingleton";<br>}<br>if (m_registry.get(name) == null)<br>{<br>try<br>{<br>m_registry.put( nameQ?br>Class.forName(name).newInstance() ) ;<br>}<br>catch(Exception e)<br>{<br>System.out.println("Error happened.");<br>}<br>}<br>return (RegSingleton) (m_registry.get(name) );<br>}<br>/**<br>* 一个示意性的商业Ҏ(gu)<br>*/<br>public String about()<br>{<br>return "HelloQ?I am RegSingleton.";<br>}<br>}<br>  它的子类RegSingletonChild 需要父cȝ帮助才能实例化。下图所C是登记式单例类子类的一个例子。图中的关系表明Q此cLqcd子类实例化的?br><br><img onerror="this.src='http://www.yesky.com/image20010518/60568.jpg';" hspace=3 src="http://www.yesky.com/image20010518/60568.jpg" align=center vspace=1 border=1><br><br>  下面是子cȝ源代码?br><br>  代码清单4Q登记式单例cȝ子类<br><br><span id="nf799n9" class=f14>import java.util.HashMap;<br>public class RegSingletonChild extends RegSingleton<br>{<br>public RegSingletonChild() {}<br>/**<br>* 静态工厂方?br>*/<br>static public RegSingletonChild getInstance()<br>{<br>return (RegSingletonChild)<br>RegSingleton.getInstance(<br>"com.javapatterns.singleton.demos.RegSingletonChild" );<br>}<br>/**<br>* 一个示意性的商业Ҏ(gu)<br>*/<br>public String about()<br>{<br>return "HelloQ?I am RegSingletonChild.";<br>}<br>}</span> <p><br>  在GoF 原始的例子中Qƈ没有getInstance() Ҏ(gu)Q这样得到子cd调用的getInstance(String name)Ҏ(gu)q传入子cȝ名字Q因此很不方ѝ本章在登记式单例类子类的例子里Q加入了getInstance() Ҏ(gu)Q这样做的好处是RegSingletonChild 可以通过q个Ҏ(gu)Q返q自已的实例。而这样做的缺Ҏ(gu)Q由于数据类型不同,无法在RegSingleton 提供q样一个方法。由于子cdd许父cM构造子调用产生实例Q因此,它的构造子必须是公开的。这样一来,q于允怺以这h式生实例而不在父cȝ登记中。这是登记式单例cȝ一个缺炏V?br><br>  GoF 曾指出,׃父类的实例必d在才可能有子cȝ实例Q这在有些情况下是一个浪贏V这是登记式单例cȝ另一个缺炏V?/p> </span> <p> </p> <p> </p> </td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <img src ="http://www.tkk7.com/xixidabao/aggbug/53651.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/xixidabao/" target="_blank">JAVA之\</a> 2006-06-18 22:15 <a href="http://www.tkk7.com/xixidabao/archive/2006/06/18/53651.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://181xx.com" target="_blank">˾Ʒ</a>| <a href="http://kmrghj.com" target="_blank">޹˾þþƷ99</a>| <a href="http://manghuo365.com" target="_blank">Ƭѿ</a>| <a href="http://hs718.com" target="_blank">ѹۿվ</a>| <a href="http://x5k9.com" target="_blank">ĻۺϾþۺ</a>| <a href="http://zhaosaohuo.com" target="_blank">þþþþëƬѲ</a>| <a href="http://927ff.com" target="_blank">޳</a>| <a href="http://xmmn77.com" target="_blank">պƷϵר</a>| <a href="http://yes5555.com" target="_blank">޿һ</a>| <a href="http://szzrjk.com" target="_blank">Ů˾޸</a>| <a href="http://126cm.com" target="_blank">һ߹ۿ</a>| <a href="http://z88d.com" target="_blank">þþƷѹۿ97</a>| <a href="http://www-36664.com" target="_blank"></a>| <a href="http://jl910.com" target="_blank">պƷ侫</a>| <a href="http://bixnu.com" target="_blank">ѿƸվƵ</a>| <a href="http://whlnrsqsie.com" target="_blank">Ƶ</a>| <a href="http://wuaiav.com" target="_blank">޹Һ2020</a>| <a href="http://wwwseselu.com" target="_blank">޾ƷĻӰԺ</a>| <a href="http://w6626.com" target="_blank">ŷ޺ڴ</a>| <a href="http://wwwfac37.com" target="_blank">¾þƵ</a>| <a href="http://dzyong.com" target="_blank">С˵</a>| <a href="http://wwwkk2347.com" target="_blank">޹רһ</a>| <a href="http://bearsou.com" target="_blank">99reѾƷƵۿ</a>| <a href="http://acccx.com" target="_blank">AVӰ˵</a>| <a href="http://kypbuy.com" target="_blank">պߵһҳ</a>| <a href="http://wwwk47.com" target="_blank">x8</a>| <a href="http://by6635.com" target="_blank">91ֻƬ</a>| <a href="http://linanhotel.com" target="_blank">Ʒþþþþù</a>| <a href="http://qianmiu.com" target="_blank">޹Ʒۺɫ</a>| <a href="http://445645.com" target="_blank">޾ƷŮþþþ</a>| <a href="http://eddiekidd.com" target="_blank">һ㽶</a>| <a href="http://ri9999.com" target="_blank">ĻӰѹۿַ </a>| <a href="http://15831883389.com" target="_blank">57paoƵ</a>| <a href="http://xjtuykw.com" target="_blank">Ƶ߹ۿѲӰԺ </a>| <a href="http://www-959kj.com" target="_blank">Ļav</a>| <a href="http://tj-zhongfa.com" target="_blank">av뾫Ʒ</a>| <a href="http://33338x.com" target="_blank">ƷһVR </a>| <a href="http://pjwys.com" target="_blank">ȫƵѸ </a>| <a href="http://18yinren.com" target="_blank">ִֻˬƵ</a>| <a href="http://tvnxl.com" target="_blank">ѵӰ߹ۿվ</a>| <a href="http://05942688.com" target="_blank">þ99׾Ʒ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>