﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-sky_team</title><link>http://www.blogjava.net/sky_team/</link><description /><language>zh-cn</language><lastBuildDate>Sun, 12 Apr 2026 10:55:31 GMT</lastBuildDate><pubDate>Sun, 12 Apr 2026 10:55:31 GMT</pubDate><ttl>60</ttl><item><title>模板模式</title><link>http://www.blogjava.net/sky_team/archive/2005/08/19/10550.html</link><dc:creator>sky</dc:creator><author>sky</author><pubDate>Fri, 19 Aug 2005 13:15:00 GMT</pubDate><guid>http://www.blogjava.net/sky_team/archive/2005/08/19/10550.html</guid><wfw:comment>http://www.blogjava.net/sky_team/comments/10550.html</wfw:comment><comments>http://www.blogjava.net/sky_team/archive/2005/08/19/10550.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sky_team/comments/commentRss/10550.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sky_team/services/trackbacks/10550.html</trackback:ping><description><![CDATA[模板模式：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 模板方法中分两种方法：一种是模板方法，另一种是基本方法。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;模板方法：就是把基本方法组合在一起形成一个总算法或则总行为，这个模板方法一般会在抽象定义并且在子类种不加以修改的继承下来。一个抽象类可以有任意多个模板方法。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;基本方法：它又分为抽象方法，具体方法，钩子方法。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;抽象方法由抽象类申明，由子类具体实现；具体方法由抽象类申明并实现，而子类并不实现或则置换，这里面也可以有工厂方法；钩子方法，由抽象类申明并实现，但是它是一个空的实现，一般都是由子类进行扩张实现。<img src ="http://www.blogjava.net/sky_team/aggbug/10550.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sky_team/" target="_blank">sky</a> 2005-08-19 21:15 <a href="http://www.blogjava.net/sky_team/archive/2005/08/19/10550.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FileRead</title><link>http://www.blogjava.net/sky_team/archive/2005/08/19/10547.html</link><dc:creator>sky</dc:creator><author>sky</author><pubDate>Fri, 19 Aug 2005 12:20:00 GMT</pubDate><guid>http://www.blogjava.net/sky_team/archive/2005/08/19/10547.html</guid><wfw:comment>http://www.blogjava.net/sky_team/comments/10547.html</wfw:comment><comments>http://www.blogjava.net/sky_team/archive/2005/08/19/10547.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sky_team/comments/commentRss/10547.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sky_team/services/trackbacks/10547.html</trackback:ping><description><![CDATA[<P><BR>import java.io.*;</P>
<P>public class FileRead{<BR>&nbsp;private static double totalFile = 0;<BR>&nbsp;private static double totalDirectory = 0;</P>
<P>&nbsp;public String replace(String value){<BR>&nbsp;&nbsp;&nbsp;&nbsp; StringBuffer replace = new StringBuffer(value);<BR>&nbsp;&nbsp;&nbsp;&nbsp; int i = 0;<BR>&nbsp;&nbsp;&nbsp;&nbsp; int last = replace.lastIndexOf("──");<BR>&nbsp;&nbsp;&nbsp;&nbsp; i = replace.indexOf("──");<BR>&nbsp;&nbsp;&nbsp;&nbsp; while((i != last)&amp;&amp;(i != -1)){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; replace.replace(i,i+"──".length(),"&nbsp;&nbsp; ");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i = replace.indexOf("──");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; last = replace.lastIndexOf("──");<BR>&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp; return replace.toString();<BR>&nbsp;}</P>
<P>&nbsp;public void searchFile(File f,String value,boolean b)throws IOException{<BR>&nbsp;&nbsp;&nbsp;&nbsp; StringBuffer string = new StringBuffer(value);<BR>&nbsp;&nbsp;&nbsp;&nbsp; string.append("──");<BR>&nbsp;&nbsp;&nbsp;&nbsp; boolean bool = b;<BR>&nbsp;&nbsp;String path = f.getAbsolutePath();<BR>&nbsp;&nbsp;File currentFile = new File(path); //取得当前路径的文件<BR>&nbsp;&nbsp;File[] file = currentFile.listFiles();</P>
<P>&nbsp;&nbsp;for(int i=0;i&lt;file.length;i++){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringBuffer s = null;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String lastDirectory = null;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 判断文件夹是否为该目录下的最后一个文件夹，如果是的话，则取消打印"│"符号<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int k=0;k&lt;file.length;k++){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;if(file[k].isDirectory())<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;lastDirectory = new String(file[k].getName());&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(file[i].getName().equals(lastDirectory)){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;if(string.indexOf("│") != -1){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; string.delete(string.lastIndexOf("│"),string.lastIndexOf("│")+1);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 格式化打印，将符号最后的"──"变为"├──"（当最后的符号不为"│──"时）<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!((string.lastIndexOf("──")-1) == string.lastIndexOf("│──"))){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s = new StringBuffer(string.substring(0,string.lastIndexOf("──")));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;s.append("├──");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;if(string.indexOf("│──")!=-1){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;s = new StringBuffer(string.substring(0,string.lastIndexOf("│──")));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;s.append("├──");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(file[i].getName().equals(file[file.length-1].getName()))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;if(s != null)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;if(s.lastIndexOf("├") != -1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;s.replace(s.lastIndexOf("├"),s.lastIndexOf("├")+1,"└");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 如果s不为空，则将s传入方法replace中进行格式化<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;if(s != null)&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;System.out.println(replace(s.toString()) + file[i].getName());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;if(file[i].isDirectory()){&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; totalDirectory&nbsp; += 1;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 如果该文件夹的子目录下还有两个以上的文件和文件夹，则打印一个"│"符号，并标记bool为true<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String pathstring = file[i].getAbsolutePath();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File current = new File(pathstring); //取得当前路径的文件<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File[] fp = current.listFiles();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(fp.length &gt;1){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bool = true;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(bool)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;string.append("│");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; searchFile(file[i],string.toString(),bool);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 如果bool已经被标记过，则将上一次的"│"符号删除<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(bool)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;if(string.indexOf("│") != -1)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; string.delete(string.lastIndexOf("│"),string.length());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bool = false;&nbsp;<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;totalFile += 1;&nbsp;<BR>&nbsp;&nbsp;}<BR>&nbsp;}&nbsp;<BR>&nbsp;public static void main(String args[])throws IOException{<BR>&nbsp;&nbsp;String path = null;<BR>&nbsp;&nbsp;if(args.length&lt;1)<BR>&nbsp;&nbsp;&nbsp;path =".";<BR>&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;path = args[0];<BR>&nbsp;&nbsp;FileRead read = new FileRead();<BR>&nbsp;&nbsp;File file = new File(path);<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;if(!file.exists()){<BR>&nbsp;&nbsp;&nbsp;System.err.print("the path is error");<BR>&nbsp;&nbsp;&nbsp;System.exit(1);<BR>&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;read.searchFile(file,"│",false);<BR>&nbsp;&nbsp;System.out.println("the file is :" + (totalFile-totalDirectory));<BR>&nbsp;&nbsp;System.out.println("thd directory is : " + totalDirectory);<BR>&nbsp;}<BR>}<BR><BR><FONT color=#ff1493>该程序存在一个问题，也就是当jdk中的File类无法判断目录下的一些目录是文件夹或则是文件时？</FONT></P><img src ="http://www.blogjava.net/sky_team/aggbug/10547.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sky_team/" target="_blank">sky</a> 2005-08-19 20:20 <a href="http://www.blogjava.net/sky_team/archive/2005/08/19/10547.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Strategy 策略模式</title><link>http://www.blogjava.net/sky_team/archive/2005/08/14/10099.html</link><dc:creator>sky</dc:creator><author>sky</author><pubDate>Sun, 14 Aug 2005 15:51:00 GMT</pubDate><guid>http://www.blogjava.net/sky_team/archive/2005/08/14/10099.html</guid><wfw:comment>http://www.blogjava.net/sky_team/comments/10099.html</wfw:comment><comments>http://www.blogjava.net/sky_team/archive/2005/08/14/10099.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sky_team/comments/commentRss/10099.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sky_team/services/trackbacks/10099.html</trackback:ping><description><![CDATA[策略模式：<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 策略模式的对算法的包装，是把使用算法的责任和算法本生分开，委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面，作为一个抽象策略类的子类。<BR>使用条件：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果在一个系统种有许多类，他们之间的区别仅仅在于他们的行为，并且这个系统需要动态的在几种算法种选择一种。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src ="http://www.blogjava.net/sky_team/aggbug/10099.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sky_team/" target="_blank">sky</a> 2005-08-14 23:51 <a href="http://www.blogjava.net/sky_team/archive/2005/08/14/10099.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Immutable 不变模式</title><link>http://www.blogjava.net/sky_team/archive/2005/08/14/10097.html</link><dc:creator>sky</dc:creator><author>sky</author><pubDate>Sun, 14 Aug 2005 15:39:00 GMT</pubDate><guid>http://www.blogjava.net/sky_team/archive/2005/08/14/10097.html</guid><wfw:comment>http://www.blogjava.net/sky_team/comments/10097.html</wfw:comment><comments>http://www.blogjava.net/sky_team/archive/2005/08/14/10097.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/sky_team/comments/commentRss/10097.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sky_team/services/trackbacks/10097.html</trackback:ping><description><![CDATA[不变模式：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不变模式可以增强对象的强壮性，不变模式准许多个对象共享一个对象，这降低了对该对象进行并发访问时的同步化开销。如果要修改一个不变对象的状态，则需要创建一个新的对象，并将其存入新的对象里。不变模式只涉及到一个类，一个类的内部状态一旦被创建以后，在整个期间都不会发生变化。他有两种一种是强不变模式和弱不变模式。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 弱不变模式：<BR>首先满足没有方法可以改变对象的状态，则对象一旦被创建之后，对象的状态就不会改变。二该对象的所有的属性都是私有的，并且不准许声明任何公有的方法来改变他们。三这个对象所引用的对象也应该是不变的对象，如果在初始化时应用了一个可变的对象，则应该对该可变对象进行复制一份，而不要使用原来的拷贝。这种模式的缺点是他可以用子类，并且子类可以是可变的对象。可变的子类可能一修改父类对象的状态，从而可能会允许外界修改父对象的状态。<BR><BR><FONT color=#ff1493>问题：</FONT><BR><FONT style="BACKGROUND-COLOR: #ffffff" color=#ff1493>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为什么说可变的对象可以修该父类对象的状态呢？怎样做？<BR><FONT color=#000000><BR>强不变模式首先要满足弱不变模式，然后将这个类声明成final类，则它变不可能有子类了，并且也将该对象所考虑到的所有方法声明为final。<BR>不变模式与享元模式有很大的相同处，他们的对象状态都有要求不随环境的变化而变化，不过享元模式的内涵状态在不影响享元对象的共享时，可以为可变的。不变模式对对象的要求要比享元模式对对象的要求更严格。<BR></FONT><BR></FONT><BR><img src ="http://www.blogjava.net/sky_team/aggbug/10097.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sky_team/" target="_blank">sky</a> 2005-08-14 23:39 <a href="http://www.blogjava.net/sky_team/archive/2005/08/14/10097.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Brige 桥梁模式</title><link>http://www.blogjava.net/sky_team/archive/2005/08/12/9992.html</link><dc:creator>sky</dc:creator><author>sky</author><pubDate>Fri, 12 Aug 2005 15:28:00 GMT</pubDate><guid>http://www.blogjava.net/sky_team/archive/2005/08/12/9992.html</guid><wfw:comment>http://www.blogjava.net/sky_team/comments/9992.html</wfw:comment><comments>http://www.blogjava.net/sky_team/archive/2005/08/12/9992.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sky_team/comments/commentRss/9992.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sky_team/services/trackbacks/9992.html</trackback:ping><description><![CDATA[桥梁模式：<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 桥梁模式就是抽象化和实现化脱藕，使得两者可以独立地变法。例子如java中的peer架构。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 桥梁模式与适配器模式的区别是，<img src ="http://www.blogjava.net/sky_team/aggbug/9992.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sky_team/" target="_blank">sky</a> 2005-08-12 23:28 <a href="http://www.blogjava.net/sky_team/archive/2005/08/12/9992.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Facade 门面模式</title><link>http://www.blogjava.net/sky_team/archive/2005/08/12/9987.html</link><dc:creator>sky</dc:creator><author>sky</author><pubDate>Fri, 12 Aug 2005 11:38:00 GMT</pubDate><guid>http://www.blogjava.net/sky_team/archive/2005/08/12/9987.html</guid><wfw:comment>http://www.blogjava.net/sky_team/comments/9987.html</wfw:comment><comments>http://www.blogjava.net/sky_team/archive/2005/08/12/9987.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sky_team/comments/commentRss/9987.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sky_team/services/trackbacks/9987.html</trackback:ping><description><![CDATA[门面模式：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在外界访问要访问多个内部系统时，并且他与这些内部系统有着复杂的关系时，我们则可以用门面模式来解决这样的问题。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 门面模式他只是提供一个可以共外界方便访问内部子系统的一个接口，他并不会对子系统进行扩展，他只提供子系统所具有的方法。对外界来说，他是一个子系统，但是内部的子系统并不知道有这么一个类。例如：一个学生要去图书馆借书，这里有3个表，rule是记录不同的读者的借书规则（如研究生可以借7而本科生只能借4本），publish表是记录过期未还书的学生，passwork是记录图书馆所颁发过的借书证。如果一个学生要借书，则他必须要有一个在passwork中存在的借书证，并且没有在publish中的情况，则可以保证向该学生提供借阅，但是借阅的书则要按rule中的规则来进行。所以一个学生client借书必须访问这些类，为了便于管理，我们提供一个&nbsp;&nbsp;FacadeFactory类来处理，这个类提供了所有client向子系统访问的方法。这样对于client来说就轻松多了，也便于我们维护代码了。但是FacadeFactory不能够向client提供内部子系统不存在的方法。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由于一个系统中所需要的只需要一个实例，则我们可以把门面类设置为单例类，如上面的FacadeFactory，他应该设置为一个单例类，这样就不会发生多个人同时借一本书了。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src ="http://www.blogjava.net/sky_team/aggbug/9987.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sky_team/" target="_blank">sky</a> 2005-08-12 19:38 <a href="http://www.blogjava.net/sky_team/archive/2005/08/12/9987.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>flyweight pattern</title><link>http://www.blogjava.net/sky_team/archive/2005/08/11/9848.html</link><dc:creator>sky</dc:creator><author>sky</author><pubDate>Thu, 11 Aug 2005 14:37:00 GMT</pubDate><guid>http://www.blogjava.net/sky_team/archive/2005/08/11/9848.html</guid><wfw:comment>http://www.blogjava.net/sky_team/comments/9848.html</wfw:comment><comments>http://www.blogjava.net/sky_team/archive/2005/08/11/9848.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sky_team/comments/commentRss/9848.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sky_team/services/trackbacks/9848.html</trackback:ping><description><![CDATA[<P class=MsoBodyText style="MARGIN: 0cm 0cm 0pt; tab-stops: 309.75pt"><SPAN style="COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">享元模式：</SPAN><SPAN lang=EN-US style="COLOR: windowtext">flyweight pattern<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></P>
<P class=MsoBodyText style="MARGIN: 0cm 0cm 0pt; tab-stops: 309.75pt"><SPAN lang=EN-US style="COLOR: windowtext"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">享元模式包括两种状态，内蕴状态和外蕴状态。他的种类有单纯享元模式和复合享元模式，结构图如下：</SPAN><SPAN lang=EN-US style="COLOR: windowtext"><o:p></o:p></SPAN></P>
<P class=MsoBodyText style="MARGIN: 0cm 0cm 0pt; tab-stops: 309.75pt"><SPAN lang=EN-US style="COLOR: windowtext"><?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><v:shapetype id=_x0000_t75 coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></v:path><o:lock v:ext="edit" aspectratio="t"></o:lock></v:shapetype><v:shape id=_x0000_i1025 style="WIDTH: 275.25pt; HEIGHT: 116.25pt" type="#_x0000_t75"><v:imagedata o:title="" src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\03\clip_image001.emz"></v:imagedata></v:shape><v:shape id=_x0000_i1026 style="WIDTH: 245.25pt; HEIGHT: 69pt" type="#_x0000_t75"><v:imagedata o:title="" src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\03\clip_image003.emz"></v:imagedata></v:shape><o:p></o:p></SPAN></P>
<P class=MsoBodyText style="MARGIN: 0cm 0cm 0pt; tab-stops: 309.75pt"><SPAN style="COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我们从结构种可以看出，复合享元模式是由单纯享元模式和合成模式组合而成的。</SPAN><SPAN lang=EN-US style="COLOR: windowtext"><o:p></o:p></SPAN></P>
<P class=MsoBodyText style="MARGIN: 0cm 0cm 0pt; tab-stops: 309.75pt"><SPAN style="COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">享元模式有四种角色：抽象享元角色，具体享元角色，享元工厂角色，和客户角色。享元模式中的享元工厂角色可以通过单例模式来实现。</SPAN><SPAN lang=EN-US style="COLOR: windowtext"><o:p></o:p></SPAN></P>
<P class=MsoBodyText style="MARGIN: 0cm 0cm 0pt; tab-stops: 309.75pt"><SPAN style="COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用条件：</SPAN><SPAN lang=EN-US style="COLOR: windowtext"><o:p></o:p></SPAN></P><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt; mso-ansi-language: EN-US; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">一个系统中有大量的对象，这些对象消耗大量的内存，这些对象大部份是可以外部化的，这些对象可以按照内蕴状态分成很多的组，当把外蕴对象从对象中踢除时，每一个组都可以仅用一个对象代替，软件系统不依赖这些对象的身份，换言之，这些对象可以是不可分辨的。不过他要使用一个维护记录了系统已有的所以享元的表，而这需要消耗资源。因此应当在有足够多的享元的实例可提供共享实才值得使用享元模式。</SPAN><img src ="http://www.blogjava.net/sky_team/aggbug/9848.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sky_team/" target="_blank">sky</a> 2005-08-11 22:37 <a href="http://www.blogjava.net/sky_team/archive/2005/08/11/9848.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>装饰模式</title><link>http://www.blogjava.net/sky_team/archive/2005/08/11/9847.html</link><dc:creator>sky</dc:creator><author>sky</author><pubDate>Thu, 11 Aug 2005 14:36:00 GMT</pubDate><guid>http://www.blogjava.net/sky_team/archive/2005/08/11/9847.html</guid><wfw:comment>http://www.blogjava.net/sky_team/comments/9847.html</wfw:comment><comments>http://www.blogjava.net/sky_team/archive/2005/08/11/9847.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sky_team/comments/commentRss/9847.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sky_team/services/trackbacks/9847.html</trackback:ping><description><![CDATA[<P class=MsoBodyText style="MARGIN: 0cm 0cm 0pt; tab-stops: 309.75pt"><SPAN lang=EN-US style="COLOR: windowtext"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; <SPAN style="COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">装饰模式</SPAN></SPAN></SPAN><SPAN style="COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：</SPAN><SPAN lang=EN-US style="COLOR: windowtext"><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></P>
<P class=MsoBodyText style="MARGIN: 0cm 0cm 0pt; tab-stops: 304.5pt"><SPAN lang=EN-US style="COLOR: windowtext"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">他的各个角色的作用为：抽象角色：给出一个抽象的接口，以规范准备接收附加责任的对象。</SPAN><SPAN lang=EN-US style="COLOR: windowtext"><o:p></o:p></SPAN></P>
<P class=MsoBodyText style="MARGIN: 0cm 0cm 0pt; tab-stops: 304.5pt"><SPAN lang=EN-US style="COLOR: windowtext"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">具体角色：定义一个将要接收附加责任的类。</SPAN><SPAN lang=EN-US style="COLOR: windowtext"><o:p></o:p></SPAN></P>
<P class=MsoBodyText style="MARGIN: 0cm 0cm 0pt; tab-stops: 10.0cm"><SPAN lang=EN-US style="COLOR: windowtext"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">装饰角色：持有一个构件对象的实例，并定义一个雨抽象接口一致的接口。</SPAN><SPAN lang=EN-US style="COLOR: windowtext"><o:p></o:p></SPAN></P>
<P class=MsoBodyText style="MARGIN: 0cm 0cm 0pt; tab-stops: 278.25pt"><SPAN lang=EN-US style="COLOR: windowtext"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">具体装饰角色：负责给构件对象“贴上”附加责任。</SPAN><SPAN lang=EN-US style="COLOR: windowtext"><o:p></o:p></SPAN></P>
<P class=MsoBodyText style="MARGIN: 0cm 0cm 0pt; tab-stops: 278.25pt"><SPAN style="COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">装饰类一般在以下情况使用：</SPAN><SPAN lang=EN-US style="COLOR: windowtext"><o:p></o:p></SPAN></P>
<P class=MsoBodyText style="MARGIN: 0cm 0cm 0pt 39.75pt; TEXT-INDENT: -18pt; tab-stops: list 39.75pt left 278.25pt; mso-list: l0 level1 lfo1"><SPAN lang=EN-US style="COLOR: windowtext; mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">1、<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp; </SPAN></SPAN></SPAN><SPAN style="COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">需要扩展一个类的功能，或给一个类增加附加责任。</SPAN><SPAN lang=EN-US style="COLOR: windowtext"><o:p></o:p></SPAN></P>
<P class=MsoBodyText style="MARGIN: 0cm 0cm 0pt 39.75pt; TEXT-INDENT: -18pt; tab-stops: list 39.75pt left 278.25pt; mso-list: l0 level1 lfo1"><SPAN lang=EN-US style="COLOR: windowtext; mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">2、<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp; </SPAN></SPAN></SPAN><SPAN style="COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">需要动态的给一个对象增加功能，这些功能可以再动态的测销。</SPAN><SPAN lang=EN-US style="COLOR: windowtext"><o:p></o:p></SPAN></P>
<P class=MsoBodyText style="MARGIN: 0cm 0cm 0pt 39.75pt; TEXT-INDENT: -18pt; tab-stops: list 39.75pt left 278.25pt; mso-list: l0 level1 lfo1"><SPAN lang=EN-US style="COLOR: windowtext; mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">3、<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp; </SPAN></SPAN></SPAN><SPAN style="COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">需要增加由一些基本的排列组合产生非常大量的功能，从而使继承关系变得不现实。</SPAN><SPAN lang=EN-US style="COLOR: windowtext"><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><o:p></o:p></SPAN></P>
<P class=MsoBodyText style="MARGIN: 0cm 0cm 0pt; tab-stops: 304.5pt"><SPAN lang=EN-US style="COLOR: windowtext"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><o:p></o:p></SPAN></P><SPAN style="COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"></SPAN><SPAN lang=EN-US style="COLOR: windowtext"><o:p>
<P class=MsoBodyText style="MARGIN: 0cm 0cm 0pt; tab-stops: 309.75pt"><SPAN style="COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">他有很多特点：</SPAN><SPAN lang=EN-US style="COLOR: windowtext"><o:p></o:p></SPAN></P>
<P class=MsoBodyText style="MARGIN: 0cm 0cm 0pt 45pt; TEXT-INDENT: -18pt; tab-stops: list 45.0pt left 309.75pt; mso-list: l0 level1 lfo1"><SPAN lang=EN-US style="COLOR: windowtext; mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">1、<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp; </SPAN></SPAN></SPAN><SPAN style="COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">装饰模式雨继承关系的目的都是要扩展对象的功能，但是装饰模式可以提供比继承更多的灵活性。装饰模式准系统动态的决定“贴上”一个需要的“装饰”，或者除掉一个不需要的装饰。而继承则不同，继承关系是静态的，他在系统运行前就决定了。</SPAN><SPAN lang=EN-US style="COLOR: windowtext"><o:p></o:p></SPAN></P>
<P class=MsoBodyText style="MARGIN: 0cm 0cm 0pt 45pt; TEXT-INDENT: -18pt; tab-stops: list 45.0pt left 309.75pt; mso-list: l0 level1 lfo1"><SPAN lang=EN-US style="COLOR: windowtext; mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">2、<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp; </SPAN></SPAN></SPAN><SPAN style="COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">他可以通过使用不同的具体修饰类以及这些装饰类的排例组合，设计可以创造更多不同行为的组合。</SPAN><SPAN lang=EN-US style="COLOR: windowtext"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><o:p></o:p></SPAN></P>
<P class=MsoBodyText style="MARGIN: 0cm 0cm 0pt 45pt; TEXT-INDENT: -18pt; tab-stops: list 45.0pt left 309.75pt; mso-list: l0 level1 lfo1"><SPAN lang=EN-US style="COLOR: windowtext; mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">3、<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp; </SPAN></SPAN></SPAN><SPAN style="COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">他虽然比继承性要灵活，这意味着他比继承更容易出错。</SPAN><SPAN lang=EN-US style="COLOR: windowtext"><o:p></o:p></SPAN></P>
<P class=MsoBodyText style="MARGIN: 0cm 0cm 0pt; tab-stops: 309.75pt"><SPAN style="COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">缺点：由于使用装饰模式可以比使用继承关系需要较少数目的类，但是在另一方面，使用装饰模式会产生比使用继承方式更多的对象。这在使用时进行错误查询变得更困难了，特别是这些对象看上去都很像。</SPAN><SPAN lang=EN-US style="COLOR: windowtext"><o:p></o:p></SPAN></P>
<P class=MsoBodyText style="MARGIN: 0cm 0cm 0pt; tab-stops: 309.75pt"></o:p></SPAN>&nbsp;</P>
<P class=MsoBodyText style="MARGIN: 0cm 0cm 0pt; tab-stops: 309.75pt"><SPAN lang=EN-US style="COLOR: windowtext"><?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><v:shapetype id=_x0000_t75 coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></v:path><o:lock v:ext="edit" aspectratio="t"></o:lock></v:shapetype><o:p></o:p></SPAN></P>
<P class=MsoBodyText style="MARGIN: 0cm 0cm 0pt; tab-stops: 309.75pt"><SPAN lang=EN-US style="COLOR: windowtext"><v:shape id=_x0000_i1027 style="WIDTH: 134.25pt; HEIGHT: 15pt" type="#_x0000_t75"><v:imagedata o:title="" src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image003.emz"></v:imagedata></v:shape><o:p></o:p></SPAN></P>
<P class=MsoBodyText style="MARGIN: 0cm 0cm 0pt; tab-stops: 309.75pt"><SPAN lang=EN-US style="COLOR: windowtext"><o:p></o:p></SPAN></P>
<P class=MsoBodyText style="MARGIN: 0cm 0cm 0pt; tab-stops: 309.75pt"><SPAN lang=EN-US style="COLOR: windowtext"><o:p></o:p></SPAN></P>
<P class=MsoBodyText style="MARGIN: 0cm 0cm 0pt; tab-stops: 309.75pt"><SPAN lang=EN-US style="COLOR: windowtext"><o:p></o:p></SPAN></P><img src ="http://www.blogjava.net/sky_team/aggbug/9847.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sky_team/" target="_blank">sky</a> 2005-08-11 22:36 <a href="http://www.blogjava.net/sky_team/archive/2005/08/11/9847.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2005-8-8</title><link>http://www.blogjava.net/sky_team/archive/2005/08/09/9652.html</link><dc:creator>sky</dc:creator><author>sky</author><pubDate>Tue, 09 Aug 2005 05:03:00 GMT</pubDate><guid>http://www.blogjava.net/sky_team/archive/2005/08/09/9652.html</guid><wfw:comment>http://www.blogjava.net/sky_team/comments/9652.html</wfw:comment><comments>http://www.blogjava.net/sky_team/archive/2005/08/09/9652.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sky_team/comments/commentRss/9652.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sky_team/services/trackbacks/9652.html</trackback:ping><description><![CDATA[<P>import java.util.*;</P>
<P>class BookName{<BR>&nbsp;String name;<BR>&nbsp;int number;<BR>}<BR>abstract class Note{<BR>&nbsp;BookName name = new BookName();<BR>&nbsp;abstract public void setName(String value);<BR>&nbsp;abstract public int getNumber();<BR>&nbsp;abstract public void setNumber(int value);<BR>&nbsp;abstract public String getName();<BR>}&nbsp;<BR>class StudentNote extends Note implements Cloneable{<BR>&nbsp;BookName name = new BookName();<BR>&nbsp;int isbn;<BR>&nbsp;public void setName(String value){<BR>&nbsp;&nbsp;name.name = value;<BR>&nbsp;}<BR>&nbsp;public void setNumber(int i){<BR>&nbsp;&nbsp;name.number = i;<BR>&nbsp;}<BR>&nbsp;public int getNumber(){<BR>&nbsp;&nbsp;return name.number;<BR>&nbsp;}<BR>&nbsp;public String getName(){<BR>&nbsp;&nbsp;return name.name;<BR>&nbsp;}<BR>&nbsp;public Object clone() throws CloneNotSupportedException{<BR>&nbsp;&nbsp;StudentNote st = new StudentNote();<BR>&nbsp;&nbsp;st = (StudentNote)super.clone();<BR>&nbsp;&nbsp;st.name = new BookName();<BR>&nbsp;&nbsp;st.name.name = name.name;<BR>&nbsp;&nbsp;st.name.number = name.number;<BR>&nbsp;&nbsp;return st;<BR>&nbsp;}<BR>&nbsp;public void setIsbn(int i){<BR>&nbsp;&nbsp;isbn = i;<BR>&nbsp;}<BR>&nbsp;public int getIsbn(){return isbn;}<BR>}<BR>class Manager{<BR>&nbsp;private Vector v = new Vector();<BR>&nbsp;<BR>&nbsp;public void add(Note note){<BR>&nbsp;&nbsp;v.addElement(note);<BR>&nbsp;}<BR>&nbsp;public Note get(int i){<BR>&nbsp;&nbsp;return (Note)v.get(i);<BR>&nbsp;}<BR>&nbsp;public int size(){<BR>&nbsp;&nbsp;return v.size();<BR>&nbsp;}<BR>}</P>
<P>class Client{<BR>&nbsp;private StudentNote student;<BR>&nbsp;private static Manager client = new Manager();<BR>&nbsp;public void register()throws CloneNotSupportedException{<BR>&nbsp;&nbsp;student = new StudentNote();<BR>&nbsp;&nbsp;StudentNote st = (StudentNote)student.clone();<BR>&nbsp;&nbsp;client.add(st);<BR>&nbsp;}<BR>&nbsp;public static Manager getInstance(){<BR>&nbsp;&nbsp;return client;<BR>&nbsp;}</P>
<P>}</P>
<P>class test{&nbsp;<BR>&nbsp;public static void main(String[] args)throws CloneNotSupportedException {<BR>&nbsp;&nbsp;Client c = new Client();<BR>&nbsp;&nbsp;c.register();&nbsp;<BR>&nbsp;&nbsp;c.register();<BR>&nbsp;&nbsp;Manager manager = c.getInstance();<BR>&nbsp;&nbsp;StudentNote student = (StudentNote)manager.get(0);<BR>&nbsp;&nbsp;StudentNote st = (StudentNote)manager.get(1);<BR>&nbsp;&nbsp;student.setName("sky");<BR>&nbsp;&nbsp;student.setNumber(101);<BR>&nbsp;&nbsp;student.setIsbn(10001);<BR>&nbsp;&nbsp;st.setName("fly");<BR>&nbsp;&nbsp;st.setNumber(102);<BR>&nbsp;&nbsp;st.setIsbn(10002);<BR>&nbsp;&nbsp;System.out.println(student.getName() + "\t" + student.getNumber() + "\t" + student.getIsbn());<BR>&nbsp;&nbsp;System.out.println(st.getName() + "\t" + st.getNumber() + "\t" + st.getIsbn());<BR>&nbsp;}<BR>}<BR></P><img src ="http://www.blogjava.net/sky_team/aggbug/9652.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sky_team/" target="_blank">sky</a> 2005-08-09 13:03 <a href="http://www.blogjava.net/sky_team/archive/2005/08/09/9652.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2005-8-2</title><link>http://www.blogjava.net/sky_team/archive/2005/08/03/9083.html</link><dc:creator>sky</dc:creator><author>sky</author><pubDate>Tue, 02 Aug 2005 16:00:00 GMT</pubDate><guid>http://www.blogjava.net/sky_team/archive/2005/08/03/9083.html</guid><wfw:comment>http://www.blogjava.net/sky_team/comments/9083.html</wfw:comment><comments>http://www.blogjava.net/sky_team/archive/2005/08/03/9083.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sky_team/comments/commentRss/9083.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sky_team/services/trackbacks/9083.html</trackback:ping><description><![CDATA[<P class=MsoBodyText style="MARGIN: 0cm 0cm 0pt; tab-stops: 309.75pt"><SPAN lang=EN-US style="COLOR: aqua"><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>&lt;java</SPAN><SPAN style="COLOR: aqua; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">与模式</SPAN><SPAN lang=EN-US style="COLOR: aqua">&gt; ---</SPAN><SPAN style="COLOR: aqua; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">电子书</SPAN><SPAN lang=EN-US style="COLOR: aqua"> page 425<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></P>
<P class=MsoBodyText style="MARGIN: 0cm 0cm 0pt; tab-stops: 309.75pt"><SPAN lang=EN-US style="COLOR: aqua"><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoBodyText style="MARGIN: 0cm 0cm 0pt; tab-stops: 309.75pt"><SPAN style="COLOR: aqua; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">装饰模式—</SPAN><SPAN lang=EN-US style="COLOR: aqua">Decorator<o:p></o:p></SPAN></P>
<P class=MsoBodyText style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; tab-stops: 309.75pt"><SPAN style="COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">装饰模式有名包装模式，装饰模式以对客户端透明的方式来扩展对象的功能，是继承关系的一个替代的方案。</SPAN><SPAN lang=EN-US style="COLOR: windowtext"><o:p></o:p></SPAN></P>
<P class=MsoBodyText style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; tab-stops: 309.75pt"><SPAN style="COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">客户端并不会觉得装饰模式在装饰前和装饰后有什么不同，他可以在不使用更多的子类的情况下来进行对对象的功能加以扩展。结构图如下：<BR><BR></SPAN><SPAN lang=EN-US style="COLOR: windowtext"><o:p></o:p></SPAN></P>
<P class=MsoBodyText style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt; tab-stops: 309.75pt"><SPAN lang=EN-US></SPAN></P>
<P class=MsoBodyText style="MARGIN: 0cm 0cm 0pt; tab-stops: 309.75pt"><SPAN style="COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">装饰模式原来被装饰类的一个子类的实例，把客户端的调用委派到被装饰类。他有以下组成：抽象构件，具体构件，装饰角色，具体装饰；他一般在下面这些情况使用他最好：</SPAN><SPAN lang=EN-US style="COLOR: windowtext"><o:p></o:p></SPAN></P>
<P class=MsoBodyText style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; tab-stops: list 18.0pt left 309.75pt; mso-list: l0 level1 lfo1"><SPAN lang=EN-US style="COLOR: windowtext; mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">1、<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp; </SPAN></SPAN></SPAN><SPAN style="COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">需要扩展一个类的功能，或给一个类增加附加责任。</SPAN><SPAN lang=EN-US style="COLOR: windowtext"><o:p></o:p></SPAN></P>
<P class=MsoBodyText style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; tab-stops: list 18.0pt left 309.75pt; mso-list: l0 level1 lfo1"><SPAN lang=EN-US style="COLOR: windowtext; mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">2、<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp; </SPAN></SPAN></SPAN><SPAN style="COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">需要动态的给一个对象增加功能，这些功能可能被动态的撤消。</SPAN><SPAN lang=EN-US style="COLOR: windowtext"><o:p></o:p></SPAN></P>
<P class=MsoBodyText style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; tab-stops: list 18.0pt left 309.75pt; mso-list: l0 level1 lfo1"><SPAN lang=EN-US style="COLOR: windowtext; mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">3、<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp; </SPAN></SPAN></SPAN><SPAN style="COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">需要增加一些基本功能的排例组合而产生的非常大量的功能，从而使继承关系变得不现实。</SPAN><SPAN lang=EN-US style="COLOR: windowtext"><o:p></o:p></SPAN></P>
<P class=MsoBodyText style="MARGIN: 0cm 0cm 0pt; tab-stops: 309.75pt"><SPAN style="COLOR: windowtext; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">优点：他可以灵活的增加一个类或对象的功能，也可以通过不同的具体装饰类的排例组合设计出更加复杂的，功能更强的类。</SPAN><SPAN lang=EN-US style="COLOR: windowtext"><o:p></o:p></SPAN></P><SPAN style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt; mso-ansi-language: EN-US; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">缺点：他虽然增加了一个类的灵活性，但同时他也给一个类的管理带来了复杂性。</SPAN><img src ="http://www.blogjava.net/sky_team/aggbug/9083.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sky_team/" target="_blank">sky</a> 2005-08-03 00:00 <a href="http://www.blogjava.net/sky_team/archive/2005/08/03/9083.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>