﻿<?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-欢迎来到小小家院</title><link>http://www.blogjava.net/wangxq/</link><description>共同努力,共造辉煌!</description><language>zh-cn</language><lastBuildDate>Wed, 22 Apr 2026 09:36:12 GMT</lastBuildDate><pubDate>Wed, 22 Apr 2026 09:36:12 GMT</pubDate><ttl>60</ttl><item><title>命令模式学习笔记</title><link>http://www.blogjava.net/wangxq/archive/2008/05/05/198311.html</link><dc:creator>扭转乾坤</dc:creator><author>扭转乾坤</author><pubDate>Mon, 05 May 2008 01:28:00 GMT</pubDate><guid>http://www.blogjava.net/wangxq/archive/2008/05/05/198311.html</guid><wfw:comment>http://www.blogjava.net/wangxq/comments/198311.html</wfw:comment><comments>http://www.blogjava.net/wangxq/archive/2008/05/05/198311.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxq/comments/commentRss/198311.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxq/services/trackbacks/198311.html</trackback:ping><description><![CDATA[命令模式：将&#8220;请求&#8221;封装成对象，以便使用不同得请求，队列或者日志来参数化其他对象，命令模式也支持可撤销得操作！（Head First Design Patterns ）<br />
优点：解耦了发送者和接受者之间联系。 发送者调用一个操作，接受者接受请求执行相应的动作，因为使用Command模式解耦，发送者无需知道接受者任何接口。<br />
1. 简单的命令模式<br />
命令接口：<br />
<font style="background-color: #c7edcc">
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_25_54_Open_Image" onclick="this.style.display='none'; Codehighlighter1_25_54_Open_Text.style.display='none'; Codehighlighter1_25_54_Closed_Image.style.display='inline'; Codehighlighter1_25_54_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_25_54_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_25_54_Closed_Text.style.display='none'; Codehighlighter1_25_54_Open_Image.style.display='inline'; Codehighlighter1_25_54_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;Command&nbsp;</span><span id="Codehighlighter1_25_54_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_25_54_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;execute();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
关闭灯命令：
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_48_175_Open_Image" onclick="this.style.display='none'; Codehighlighter1_48_175_Open_Text.style.display='none'; Codehighlighter1_48_175_Closed_Image.style.display='inline'; Codehighlighter1_48_175_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_48_175_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_48_175_Closed_Text.style.display='none'; Codehighlighter1_48_175_Open_Image.style.display='inline'; Codehighlighter1_48_175_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;LightOffCommand&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Command&nbsp;</span><span id="Codehighlighter1_48_175_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_48_175_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;Light&nbsp;light;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;<br />
<img id="Codehighlighter1_103_128_Open_Image" onclick="this.style.display='none'; Codehighlighter1_103_128_Open_Text.style.display='none'; Codehighlighter1_103_128_Closed_Image.style.display='inline'; Codehighlighter1_103_128_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_103_128_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_103_128_Closed_Text.style.display='none'; Codehighlighter1_103_128_Open_Image.style.display='inline'; Codehighlighter1_103_128_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;LightOffCommand(Light&nbsp;light)&nbsp;</span><span id="Codehighlighter1_103_128_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_103_128_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.light&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;light;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;<br />
<img id="Codehighlighter1_155_173_Open_Image" onclick="this.style.display='none'; Codehighlighter1_155_173_Open_Text.style.display='none'; Codehighlighter1_155_173_Closed_Image.style.display='inline'; Codehighlighter1_155_173_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_155_173_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_155_173_Closed_Text.style.display='none'; Codehighlighter1_155_173_Open_Image.style.display='inline'; Codehighlighter1_155_173_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;execute()&nbsp;</span><span id="Codehighlighter1_155_173_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_155_173_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;light.off();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
打开灯命令：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_47_173_Open_Image" onclick="this.style.display='none'; Codehighlighter1_47_173_Open_Text.style.display='none'; Codehighlighter1_47_173_Closed_Image.style.display='inline'; Codehighlighter1_47_173_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_47_173_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_47_173_Closed_Text.style.display='none'; Codehighlighter1_47_173_Open_Image.style.display='inline'; Codehighlighter1_47_173_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;LightOnCommand&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Command&nbsp;</span><span id="Codehighlighter1_47_173_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_47_173_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;Light&nbsp;light;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;<br />
<img id="Codehighlighter1_102_127_Open_Image" onclick="this.style.display='none'; Codehighlighter1_102_127_Open_Text.style.display='none'; Codehighlighter1_102_127_Closed_Image.style.display='inline'; Codehighlighter1_102_127_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_102_127_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_102_127_Closed_Text.style.display='none'; Codehighlighter1_102_127_Open_Image.style.display='inline'; Codehighlighter1_102_127_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;LightOnCommand(Light&nbsp;light)&nbsp;</span><span id="Codehighlighter1_102_127_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_102_127_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.light&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;light;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;<br />
<img id="Codehighlighter1_154_171_Open_Image" onclick="this.style.display='none'; Codehighlighter1_154_171_Open_Text.style.display='none'; Codehighlighter1_154_171_Closed_Image.style.display='inline'; Codehighlighter1_154_171_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_154_171_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_154_171_Closed_Text.style.display='none'; Codehighlighter1_154_171_Open_Image.style.display='inline'; Codehighlighter1_154_171_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;execute()&nbsp;</span><span id="Codehighlighter1_154_171_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_154_171_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;light.on();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
灯：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_19_167_Open_Image" onclick="this.style.display='none'; Codehighlighter1_19_167_Open_Text.style.display='none'; Codehighlighter1_19_167_Closed_Image.style.display='inline'; Codehighlighter1_19_167_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_19_167_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_19_167_Closed_Text.style.display='none'; Codehighlighter1_19_167_Open_Image.style.display='inline'; Codehighlighter1_19_167_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Light&nbsp;</span><span id="Codehighlighter1_19_167_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_19_167_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_38_41_Open_Image" onclick="this.style.display='none'; Codehighlighter1_38_41_Open_Text.style.display='none'; Codehighlighter1_38_41_Closed_Image.style.display='inline'; Codehighlighter1_38_41_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_38_41_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_38_41_Closed_Text.style.display='none'; Codehighlighter1_38_41_Open_Image.style.display='inline'; Codehighlighter1_38_41_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Light()&nbsp;</span><span id="Codehighlighter1_38_41_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_38_41_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_62_102_Open_Image" onclick="this.style.display='none'; Codehighlighter1_62_102_Open_Text.style.display='none'; Codehighlighter1_62_102_Closed_Image.style.display='inline'; Codehighlighter1_62_102_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_62_102_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_62_102_Closed_Text.style.display='none'; Codehighlighter1_62_102_Open_Image.style.display='inline'; Codehighlighter1_62_102_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;on()&nbsp;</span><span id="Codehighlighter1_62_102_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_62_102_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">Light&nbsp;is&nbsp;on</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_124_165_Open_Image" onclick="this.style.display='none'; Codehighlighter1_124_165_Open_Text.style.display='none'; Codehighlighter1_124_165_Closed_Image.style.display='inline'; Codehighlighter1_124_165_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_124_165_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_124_165_Closed_Text.style.display='none'; Codehighlighter1_124_165_Open_Image.style.display='inline'; Codehighlighter1_124_165_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;off()&nbsp;</span><span id="Codehighlighter1_124_165_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_124_165_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">Light&nbsp;is&nbsp;off</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
命令调用者：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_33_208_Open_Image" onclick="this.style.display='none'; Codehighlighter1_33_208_Open_Text.style.display='none'; Codehighlighter1_33_208_Closed_Image.style.display='inline'; Codehighlighter1_33_208_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_33_208_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_33_208_Closed_Text.style.display='none'; Codehighlighter1_33_208_Open_Image.style.display='inline'; Codehighlighter1_33_208_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;SimpleRemoteControl&nbsp;</span><span id="Codehighlighter1_33_208_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_33_208_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;Command&nbsp;slot;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;<br />
<img id="Codehighlighter1_82_83_Open_Image" onclick="this.style.display='none'; Codehighlighter1_82_83_Open_Text.style.display='none'; Codehighlighter1_82_83_Closed_Image.style.display='inline'; Codehighlighter1_82_83_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_82_83_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_82_83_Closed_Text.style.display='none'; Codehighlighter1_82_83_Open_Image.style.display='inline'; Codehighlighter1_82_83_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;SimpleRemoteControl()&nbsp;</span><span id="Codehighlighter1_82_83_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_82_83_Open_Text"><span style="color: #000000">{}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;<br />
<img id="Codehighlighter1_128_149_Open_Image" onclick="this.style.display='none'; Codehighlighter1_128_149_Open_Text.style.display='none'; Codehighlighter1_128_149_Closed_Image.style.display='inline'; Codehighlighter1_128_149_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_128_149_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_128_149_Closed_Text.style.display='none'; Codehighlighter1_128_149_Open_Image.style.display='inline'; Codehighlighter1_128_149_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setCommand(Command&nbsp;command)&nbsp;</span><span id="Codehighlighter1_128_149_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_128_149_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;slot&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;command;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;<br />
<img id="Codehighlighter1_185_206_Open_Image" onclick="this.style.display='none'; Codehighlighter1_185_206_Open_Text.style.display='none'; Codehighlighter1_185_206_Closed_Image.style.display='inline'; Codehighlighter1_185_206_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_185_206_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_185_206_Closed_Text.style.display='none'; Codehighlighter1_185_206_Open_Image.style.display='inline'; Codehighlighter1_185_206_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;buttonWasPressed()&nbsp;</span><span id="Codehighlighter1_185_206_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_185_206_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;slot.execute();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
测试类：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_31_282_Open_Image" onclick="this.style.display='none'; Codehighlighter1_31_282_Open_Text.style.display='none'; Codehighlighter1_31_282_Closed_Image.style.display='inline'; Codehighlighter1_31_282_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_31_282_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_31_282_Closed_Text.style.display='none'; Codehighlighter1_31_282_Open_Image.style.display='inline'; Codehighlighter1_31_282_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;RemoteControlTest&nbsp;</span><span id="Codehighlighter1_31_282_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_31_282_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_73_280_Open_Image" onclick="this.style.display='none'; Codehighlighter1_73_280_Open_Text.style.display='none'; Codehighlighter1_73_280_Closed_Image.style.display='inline'; Codehighlighter1_73_280_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_73_280_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_73_280_Closed_Text.style.display='none'; Codehighlighter1_73_280_Open_Image.style.display='inline'; Codehighlighter1_73_280_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span id="Codehighlighter1_73_280_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_73_280_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;SimpleRemoteControl&nbsp;remote&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SimpleRemoteControl();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;Light&nbsp;light&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Light();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;LightOnCommand&nbsp;lightOn&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;LightOnCommand(light);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;remote.setCommand(lightOn);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;remote.buttonWasPressed();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
命令模式得特点：<br />
1》 分布登记统一执行：<br />
在作程序时，经常碰到一些需求，先注册一些操作，并不马上执行，等最终确定后统一执行。如一个具体的例子:用户定制自己的报表，可以订阅饼，柱，折线，曲线图，客户选择相应的报表组合，这样对应一个命令集合，在没确定之前用户可以增删这些报表（命令），等最终确定统一交给调用者根据命令执行，生成组合报表。实现了命令分布提出，确定后统一执行的功能。<br />
<br />
2》形如流水线操作：还是出书的例子<br />
//先是一本空白的书：<br />
Book book = new Book(); <br />
//找几个作者<br />
Author author1 ＝ new Author();<br />
Author author2 ＝ new Author();<br />
//把写1，2章的名类分别给这两个作者<br />
Command writeCommand = new Write1Command (author1，book);<br />
Command writeCommand = new Write2Command (author2，book);<br />
List commands ＝ new List ();<br />
Commands.add(writeCommand);<br />
//调用者<br />
Invoker invoker = new invoker();<br />
Invoker.setCommands(commands);<br />
//流水写书<br />
invoker.action()<br />
实际上在aciton这一方法中，invoker按照命令，让两个作者流水写作这本书。（类似一个书的流水线加工工厂）<br />
这样我们的书就被流水加工成功（当然这本书只有两章）<br />
<br />
这样就给了我们一种系统设计的框架，<br />
模型＋工具＋命令<br />
客户端产生命令，命令调用工具操作模型。<br />
Book 相当于模型<br />
Author 相当于和多工具类中的一个<br />
Command 命令<br />
<br />
3》系统需要支持命令的撤消(undo)。提供redo()方法【容易扩展】<br />
我们可以和容易的加入undo和redo，这个不难理解<br />
<br />
4》在Invoker中我们可以实现跟踪，和日志。<br />
<br />
5》当系统需要为某项复制增加形的功能的时候，命令模式使新的功能（表现为一种命令）很容易地被加入到服务种里。<br />
命令联系了工具类即执行类和系统逻辑，<br />
<br />
简化/变化的命令模式：<br />
命令模式的角色比较多，在实际应用种我们可以根据所需要的功能和不需要的功能加以简化。<br />
<br />
1》去掉 调用者<br />
产生命令集合后，我们可以直接在client中迭代执行执行操作<br />
2》 变化 调用者 成为 跟踪者<br />
//调用者<br />
public class Invoker{<br />
List commands; //已经执行完毕的命令集合<br />
public void addCommand (Command command,int i){<br />
commands.add(i,command);<br />
}<br />
public void action(Command command){<br />
//执行操作<br />
command. execute();<br />
//<br />
commands.add(command);<br />
}<br />
}<br />
&#8230;&#8230;&#8230;&#8230;&#8230;<br />
//还可以有丰富的redo和undo操作；(当然一些都给基于命令类提供的相应方法)<br />
}<br />
这样这个类就记录了所有执行过的操作。<br />
<br />
3》去掉 命令 用map替代<br />
我们完全可以用map代替命令，这样无需定义各种命令类<br />
我们改进例子<br />
Author author ＝ new Author();<br />
Publisher publisher ＝ new Publisher ();<br />
Map m = new HashMap;<br />
m.put(author, write);<br />
m.put(author, publisherBook);<br />
在Invoker的action方法：<br />
得代map<br />
运用java反射来调用方法；<br />
<br />
4》去掉执行者：<br />
直接在命令中（execute方法种）加业务逻辑。这样只适合于简单的小的系统.<br />
<br />
其他要说的内容<br />
1》 将某些参数传给某个方发的方式很多，除了当作方法的参数外还可以当作类的成员便俩变量传入：<br />
这就为命令的抽象带来了极大的方便<br />
abstract class Command <br />
{ <br />
abstract public void execute();<br />
}<br />
当我们已经有了执行者（类Test）方法execute（args1，args2 &#8230;.argsn）<br />
我们不必向Command加入execute（args1，args2 &#8230;.argsn）抽象方法，在说即使加了，在我们迭代的时候也无法判断或十分不容易判断哪个命令调用哪个execute方法。<br />
那么我们可以这样<br />
class ConcreteCommand : Command <br />
{ <br />
Test test;<br />
args1<br />
args2<br />
&#8230;..<br />
argsn<br />
public override void Execute() <br />
{ <br />
test. execute (args1，args2 &#8230;.argsn); <br />
} <br />
}<br />
2》 在想跟踪操作的时候，一般为每一个操作对象分配一个调用者，操作对象在调用者中设置。（可以抽象出一个总的调用者，来协调调用每一个具体的调用者）<br />
3》 命令的抽象粒度我觉得是要注意的。<br />
4》 理解思想，不要机械的照搬。消化成自己的，加以灵活的运用和创造在是根本出路。<br />
所谓命令模式的根本思想就是在 先形成命令，在根据命令执行。<br />
<br />
参考：<font style="background-color: #c7edcc"><a href="http://blog.csdn.net/baggio785/archive/2006/05/23/750513.aspx">http://blog.csdn.net/baggio785/archive/2006/05/23/750513.aspx</a></font><br />
</font>
<img src ="http://www.blogjava.net/wangxq/aggbug/198311.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxq/" target="_blank">扭转乾坤</a> 2008-05-05 09:28 <a href="http://www.blogjava.net/wangxq/archive/2008/05/05/198311.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>工厂模式学习笔记</title><link>http://www.blogjava.net/wangxq/archive/2008/05/04/198064.html</link><dc:creator>扭转乾坤</dc:creator><author>扭转乾坤</author><pubDate>Sun, 04 May 2008 06:13:00 GMT</pubDate><guid>http://www.blogjava.net/wangxq/archive/2008/05/04/198064.html</guid><wfw:comment>http://www.blogjava.net/wangxq/comments/198064.html</wfw:comment><comments>http://www.blogjava.net/wangxq/archive/2008/05/04/198064.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxq/comments/commentRss/198064.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxq/services/trackbacks/198064.html</trackback:ping><description><![CDATA[<p><font style="background-color: #c7edcc">1. <span style="font-family: 宋体"><font size="3">简单工厂模式又称静态工厂方法模式。从命名上就可以看出这个模式一定很简单。它存在的目的很简单：定义一个用于创建对象的接口。</font> </span><span lang="EN-US" style="font-family: Tahoma"><br />
</span></font><font style="background-color: #c7edcc"><br />
1.public class CarFactory{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static Car getCar(int type){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-family: Verdana"><strong><span style="color: red"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-family: Verdana"><strong>if(type == 1){<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new Car1();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></span></span><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-family: Verdana"><strong>} else {<br />
</strong></span></span></span></span></span></span></strong></span></span></span></span></span><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-family: Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return new Car2();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
}<br />
<br />
2. public class CarFactory{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static Car getCar(String carClass){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String className = carClass;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></span></span><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-family: Verdana"><strong style="color: red">Class c = Class.forName(className);<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></span></span><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-family: Verdana"><strong style="color: red">Car car = (Car)c.newInstance();<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;car;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
}<br />
<br />
3. public class CarFactory{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static Car getCar(String carJNDIName){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InitialContext ic = new InitialContext();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span></span></span><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-family: Verdana"><strong><span style="color: red"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-family: Verdana"><strong>String className = ic.lookUp(carJNDIName);</strong></span></span></span></span></span></span><br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></span></span><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-family: Verdana"><strong style="color: red">Car car = (Car)Class.forName(className).newInstance();<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return car;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
}<br />
</span></span></span></span></span>方式1～3适合于工厂所产生的对象都是属于同一个父类型的，而从方式1～3来看，方式1无疑是最简单的，也是最容易理解和接受的，而方式2和方式3则相对来说要高级一点。高级在哪里呢？我们可以看到，方式1中对对象的创建是使用Hardcode的形式，也即是程序员需要事先知道系统里面存在多少个类型的对象及其对应的编号，一旦增加或删除、修改了对象的类型，则必然引起if-else块的改变，造成了维护的困难。<br />
<br />
而方式2则采用了动态类加载的方式，方式3在方式2的基础上使用了JNDI，更进了一步，其好处是不用出现HardCode的方式，即便你后面的应用增加、删除了对象的类型，我的程序还是保持现在的样子，跟进一步来说：可以去掉那些讨厌的if-else语句。<br />
2. <span style="font-family: 宋体">工厂方法模式去掉了简单工厂模式中工厂方法的静态属性，使得它可以被子类继承。这样在简单工厂模式里集中在工厂方法上的压力可以由工厂方法模式里不同的工厂子类来分担。【<font style="background-color: #c7edcc">实质上它是让工厂实现了抽象的工厂接口，它把具体怎么生产一种东西，放在具体的工厂去实现了，所谓&#8221;延迟到子类中实现&#8220;</font>】</span> <br />
示例一：<br />
<font size="3">public interface Driver{<br />
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>public Car driverCar();<br />
}<br />
public class BenzDriver implements Driver{<br />
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>public Car driverCar(){<br />
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return new Benz();<br />
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<br />
}<br />
public class BmwDriver implements Driver{<br />
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>public Car driverCar()<span>&nbsp;&nbsp; </span>{ </font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: 42pt"><span lang="EN-US" style="font-family: Tahoma"><font size="3">return new Bmw(); <br />
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<br />
}</font> </span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt"><font size="3"><span lang="EN-US" style="font-family: Tahoma">//</span> <span style="font-family: 宋体">应该和具体产品形成对应关系</span> </font><font size="3"><span lang="EN-US" style="font-family: Tahoma">...<br />
//</span> <span style="font-family: 宋体">有请暴发户先生</span> </font><span lang="EN-US" style="font-family: Tahoma"><br />
<font size="3">&nbsp;public class Magnate </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span lang="EN-US" style="font-family: Tahoma"><font size="3">{ </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-family: Tahoma"><font size="3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>public static void main(String[] args) </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-family: Tahoma"><font size="3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{ </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-family: Tahoma"><font size="3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>try{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Driver driver = new BenzDriver(); </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-family: Tahoma"><font size="3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Car car = driver.driverCar(); </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-family: Tahoma"><font size="3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>car.drive(); </font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-family: Tahoma"><font size="3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</font> </span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-family: Tahoma"><font size="3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&#8230;&#8230;</font> </span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span lang="EN-US" style="font-family: Tahoma"><font size="3">} <br />
示例二：<br />
</p>
<p><font style="background-color: #c7edcc">public interface Creator<br />
{ <br />
&nbsp; public Prouct factory();<br />
}</font></p>
<p><font style="background-color: #c7edcc">public SubCreator1 implent Creator<br />
{ <br />
&nbsp;&nbsp; public Prouct factory()<br />
&nbsp; { <br />
&nbsp;&nbsp; return new ConcreteProduct1();<br />
&nbsp;&nbsp; }<br />
}</font></p>
<p><font style="background-color: #c7edcc">public SubCreator2 implent Creator<br />
{ <br />
&nbsp;&nbsp; public Prouct factory()<br />
&nbsp; { <br />
&nbsp;&nbsp;&nbsp; return new ConcreteProduct2();<br />
&nbsp;&nbsp; }<br />
}</font><br />
</font></span></p>
<p><font style="background-color: #c7edcc">请注意：返回类型是Product型的！！<br />
这样客户端调用是直接new 一个具体工厂的实例，然后命令它去生产，而对于具体工厂的父类（既工厂接口，接口完全可以改成子类继承父类来实现，只是这样不好，不符合OO的原则），它完全不知道什么产品被生产了，甚至它连那个具体工厂被实例化它都不知道！</font><br />
3. 抽象工厂<br />
public abstract class AbstractFactory{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-family: Verdana"><strong style="color: red">public&nbsp;abstract Car getCar(String carClass);<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></span></span><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-family: Verdana"><strong style="color: red">public abstract Plane getPlane(String planeClass);<br />
</strong>}<br />
<br />
public class Factory1 extends AbstractFactory{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Car getCar(String carClass){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;参考上面的方式1～3<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return car1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Plane getPlane(String planeClass){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;参考上面的方式1～3<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return plane1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
}<br />
<br />
public class Factory2 extends AbstractFactory{<br />
&nbsp;&nbsp;&nbsp;&nbsp; public Car getCar(String carClass){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;参考上面的方式1～3<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return car2;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; public Plane getPlane(String planeClass){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 参考上面的方式1～3<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return plane2;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
} </span></span></span></span></span><br />
</font></p>
<span style="background-color: #00ff00">方式4是最为复杂而且也是最为强大的一种，它在实现了对象工厂抽象的基础上，又集成了工厂方法。使到不同的工厂可以生产相同类型的产品，但产品的子类可能有所不同。</span>就像上面的工厂1和工厂2都可以生产汽车和飞机一样，他们各自之间可以生产不同系列的产品(抽象工厂)，而且每个系列下面可能有不同的型号(工厂方法)。<br />
<br />
参考资料：<font style="background-color: #c7edcc">http://www.blogjava.net/pengpenglin/archive/2008/01/02/172325.html</font><br />
<font style="background-color: #c7edcc">http://www.blogjava.net/killme2008/archive/2007/03/15/104031.html</font><br />
<font style="background-color: #c7edcc">http://www.blogjava.net/alex/archive/2006/08/29/66479.html</font>
<img src ="http://www.blogjava.net/wangxq/aggbug/198064.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxq/" target="_blank">扭转乾坤</a> 2008-05-04 14:13 <a href="http://www.blogjava.net/wangxq/archive/2008/05/04/198064.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>单实例模式学习笔记</title><link>http://www.blogjava.net/wangxq/archive/2008/05/04/197967.html</link><dc:creator>扭转乾坤</dc:creator><author>扭转乾坤</author><pubDate>Sun, 04 May 2008 00:38:00 GMT</pubDate><guid>http://www.blogjava.net/wangxq/archive/2008/05/04/197967.html</guid><wfw:comment>http://www.blogjava.net/wangxq/comments/197967.html</wfw:comment><comments>http://www.blogjava.net/wangxq/archive/2008/05/04/197967.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxq/comments/commentRss/197967.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxq/services/trackbacks/197967.html</trackback:ping><description><![CDATA[<p><br />
1. 经典的单实例模式例子（非线程安全）：<br />
<font style="background-color: #c7edcc">public class Singleton {<br />
&nbsp;&nbsp;&nbsp;&nbsp;private static Singleton uniqueInstance;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;// other useful instance variables here<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;private Singleton() {}<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;public static Singleton getInstance() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (uniqueInstance == null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uniqueInstance = new Singleton();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return uniqueInstance;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;// other useful methods here<br />
}<br />
本例是最经典的单实例模式例子，但是在多线程的情况下就会产生多个实例！<br />
</font></p>
2. 线程安全的例子：<br />
<font style="background-color: #c7edcc">public class Singleton {<br />
&nbsp;private static Singleton uniqueInstance;<br />
&nbsp;<br />
&nbsp;// other useful instance variables here<br />
&nbsp;<br />
&nbsp;private Singleton() {}<br />
&nbsp;<br />
&nbsp;public static synchronized Singleton getInstance() {<br />
&nbsp;&nbsp;if (uniqueInstance == null) {<br />
&nbsp;&nbsp;&nbsp;uniqueInstance = new Singleton();<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return uniqueInstance;<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;// other useful methods here<br />
}<br />
</font>增加synchronized，会让该方法是线程安全的，但是会引起每个线程在调用该方法时的等待，如果getInstance的性能对应用程序不是很关键（记住，同步方法可能会使getInstance方法得运行效率降低100倍），本方法是最好得方法！<br />
3. 提前实例化，不适用延迟实例化（使用于创建和运行时负担不太繁重或者应用程序总是创建并使用单件实例），它是线程安全得：<br />
<font style="background-color: #c7edcc">public class Singleton {<br />
&nbsp;&nbsp;&nbsp;&nbsp;private static Singleton uniqueInstance = new Singleton();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;// other useful instance variables here<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;private Singleton() {}<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;public static Singleton getInstance() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return uniqueInstance;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;// other useful methods here<br />
}<br />
采用这种方法，我们依赖JVM在加载这个类时候马上创建此唯一实例，JVM保证在任何线程访问它之前，一定先创建它!<br />
</font>4. 在java1.5及以后的版本，增加了volatile关键字，可以采用双重检查加锁！<br />
<font style="background-color: #c7edcc">public class Singleton {<br />
&nbsp;private <span style="color: red">volatile </span>static Singleton uniqueInstance;<br />
&nbsp;<br />
&nbsp;private Singleton() {}<br />
&nbsp;<br />
&nbsp;public static Singleton getInstance() {<br />
&nbsp;&nbsp;if (uniqueInstance == null) {<br />
&nbsp;&nbsp;&nbsp;synchronized (Singleton.class) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (uniqueInstance == null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uniqueInstance = new Singleton();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return uniqueInstance;<br />
&nbsp;}<br />
}<br />
<span style="color: red">volatile关键字确保：当unigueInstance变量在被初始化成实例时，多个线程能够正确的处理它！（对于关注性能的程序，这种做法可以大大减少时耗）<br />
</span><br />
</font><br />
<br />
<img src ="http://www.blogjava.net/wangxq/aggbug/197967.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxq/" target="_blank">扭转乾坤</a> 2008-05-04 08:38 <a href="http://www.blogjava.net/wangxq/archive/2008/05/04/197967.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>简单的oracle备份恢复批处理文件</title><link>http://www.blogjava.net/wangxq/archive/2007/01/26/96113.html</link><dc:creator>扭转乾坤</dc:creator><author>扭转乾坤</author><pubDate>Fri, 26 Jan 2007 03:54:00 GMT</pubDate><guid>http://www.blogjava.net/wangxq/archive/2007/01/26/96113.html</guid><wfw:comment>http://www.blogjava.net/wangxq/comments/96113.html</wfw:comment><comments>http://www.blogjava.net/wangxq/archive/2007/01/26/96113.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxq/comments/commentRss/96113.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxq/services/trackbacks/96113.html</trackback:ping><description><![CDATA[
		<p>写个简单的批处理文件备份恢复：<br />备份：<br />@echo off　　　　　　　　　　　             不显示命令行 <br />　　　　 <br />echo 开始备份表.....　　　　　　                 打印信息　　　　　　　　　　　　　　　<br />D:                                                                      DOS切换到D: 盘<br />cd oracle\ora92\bin　　　　　　                    切换到cd oracle\ora92\bin目录<br />exp <a href="mailto:enpuser/ABC12345@cms30">用户名/密码@</a>数据库 file=d:\config_bak.dmp tables=(table1,table2)      备份表一表二到d:\config_bak.dmp<br />echo 备份完毕！<br /><br />恢复：<br />@echo off　　　　　　　　　　　<br />　　　　<br />echo 开始恢复表.....　　　　　　　　　　　　　　　　　　　　　<br />D:<br />cd oracle\ora92\bin<br />imp <a href="mailto:enpuser/ABC12345@cms30">用户名/密码@</a>数据库 file=d:\config_bak.dmp tables=(table1,table2)  ignore=y   <br />sqlplus /nolog @oraStartup.sql&gt;&gt;oraStartup.log 调用sql文件<br />pause                                                                 执行完sql文件以后暂停，看信息<br />echo 恢复完毕！<br /><br />编写oraStartup.sql<br />conn <a href="mailto:enpuser/ABC12345@cms30">用户名/密码@</a>数据库 as sysdba<br />select * from table1；<br />quit；<br />　　　　　　 <br /></p>
		<p>　　　　　　 <br /><br /><br />　执行环境：可以在SQLPLUS.EXE或者DOS（命令行）中执行，<br />　　DOS中可以执行时由于 在oracle 8i 中  安装目录\ora81\BIN被设置为全局路径，<br />　　该目录下有EXP.EXE与IMP.EXE文件被用来执行导入导出。<br />　　oracle用java编写，我想SQLPLUS.EXE、EXP.EXE、IMP.EXE这俩个文件是被包装后的类文件。<br />　　SQLPLUS.EXE调用EXP.EXE、IMP.EXE他们所包裹的类，完成导入导出功能。 </p>
		<p>　　下面介绍的是导入导出的实例，向导入导出看实例基本上就可以完成，因为导入导出很简单。<br />　　数据导出：<br />　　1 将数据库TEST完全导出,用户名system 密码manager 导出到D:\daochu.dmp中<br />　　exp system/manager@TEST file=d:\daochu.dmp full=y<br />　　2 将数据库中system用户与sys用户的表导出<br />　　exp system/manager@TEST file=d:\daochu.dmp owner=(system,sys)<br />　　3 将数据库中的表table1 、table2导出<br />　　exp system/manager@TEST file=d:\daochu.dmp tables=(table1,table2) <br />　　4 将数据库中的表table1中的字段filed1以"00"打头的数据导出<br />　　exp system/manager@TEST file=d:\daochu.dmp tables=(table1) query=\" where filed1 like '00%'\"<br />　　<br />　　上面是常用的导出，对于压缩我不太在意，用winzip把dmp文件可以很好的压缩。<br />　　不过在上面命令后面 加上 compress=y  就可以了</p>
		<p>　　数据的导入<br />　　1 将D:\daochu.dmp 中的数据导入 TEST数据库中。<br />　　imp system/manager@TEST  file=d:\daochu.dmp<br />　　上面可能有点问题，因为有的表已经存在，然后它就报错，对该表就不进行导入。<br />　　在后面加上 ignore=y 就可以了。<br />　　2 将d:\daochu.dmp中的表table1 导入<br />　　imp system/manager@TEST  file=d:\daochu.dmp  tables=(table1) <br /></p>
		<p>        导入<br />　　基本上上面的导入导出够用了。不少情况我是将表彻底删除，然后导入。 <br /><br /><br /></p>
		<h1>Oracle数据库备份与恢复的三种方法</h1>
		<p style="TEXT-INDENT: 2em">Oracle数据库有三种标准的备份方法，它们分别是导出／导入（EXP/IMP）、热备份和冷备份。导出备件是一种逻辑备份，冷备份和热备份是物理备份。 </p>
		<p style="TEXT-INDENT: 2em">一、 导出／导入（Export／Import） </p>
		<p style="TEXT-INDENT: 2em">利用Export可将数据从数据库中提取出来，利用Import则可将提取出来的数据送回到Oracle数据库中去。 </p>
		<p style="TEXT-INDENT: 2em">１、 简单导出数据（Export）和导入数据（Import） </p>
		<p style="TEXT-INDENT: 2em">Oracle支持三种方式类型的输出： </p>
		<p style="TEXT-INDENT: 2em">（１）、表方式（T方式），将指定表的数据导出。 </p>
		<p style="TEXT-INDENT: 2em">（２）、用户方式（U方式），将指定用户的所有对象及数据导出。 </p>
		<p style="TEXT-INDENT: 2em">（３）、全库方式（Full方式），瘵数据库中的所有对象导出。 </p>
		<p style="TEXT-INDENT: 2em">数据导入（Import）的过程是数据导出（Export）的逆过程，分别将数据文件导入数据库和将数据库数据导出到数据文件。 </p>
		<p style="TEXT-INDENT: 2em">２、 增量导出／导入 </p>
		<p style="TEXT-INDENT: 2em">增量导出是一种常用的数据备份方法，它只能对整个数据库来实施，并且必须作为SYSTEM来导出。在进行此种导出时，系统不要求回答任何问题。导出文件名缺省为export.dmp，如果不希望自己的输出文件定名为export.dmp，必须在命令行中指出要用的文件名。 </p>
		<p style="TEXT-INDENT: 2em">增量导出包括三种类型： </p>
		<p style="TEXT-INDENT: 2em">（１）、“完全”增量导出（Complete） </p>
		<p style="TEXT-INDENT: 2em">即备份三个数据库，比如： </p>
		<p style="TEXT-INDENT: 2em">
		</p>
		<center>
				<ccid_nobr>
						<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
								<tbody>
										<tr>
												<td class="code" style="FONT-SIZE: 9pt" bgcolor="#e6e6e6">
														<pre>
																<ccid_code>exp system/manager inctype=complete file=040731.dmp</ccid_code>
														</pre>
												</td>
										</tr>
								</tbody>
						</table>
				</ccid_nobr>
		</center>
		<p style="TEXT-INDENT: 2em">（２）、“增量型”增量导出 </p>
		<p style="TEXT-INDENT: 2em">备份上一次备份后改变的数据，比如： </p>
		<p style="TEXT-INDENT: 2em">
		</p>
		<center>
				<ccid_nobr>
						<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
								<tbody>
										<tr>
												<td class="code" style="FONT-SIZE: 9pt" bgcolor="#e6e6e6">
														<pre>
																<ccid_code>exp system/manager inctype=incremental file=040731.dmp</ccid_code>
														</pre>
												</td>
										</tr>
								</tbody>
						</table>
				</ccid_nobr>
		</center>
		<p style="TEXT-INDENT: 2em">（３）、“累积型”增量导出 </p>
		<p style="TEXT-INDENT: 2em">累计型导出方式是导出自上次“完全”导出之后数据库中变化了的信息。比如： </p>
		<p style="TEXT-INDENT: 2em">
		</p>
		<center>
				<ccid_nobr>
						<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
								<tbody>
										<tr>
												<td class="code" style="FONT-SIZE: 9pt" bgcolor="#e6e6e6">
														<pre>
																<ccid_code>exp system/manager inctype=cumulative file=040731.dmp</ccid_code>
														</pre>
												</td>
										</tr>
								</tbody>
						</table>
				</ccid_nobr>
		</center>
		<p style="TEXT-INDENT: 2em">数据库管理员可以排定一个备份日程表，用数据导出的三个不同方式合理高效的完成。 </p>
		<p style="TEXT-INDENT: 2em">比如数据库的被封任务可以做如下安排： </p>
		<p style="TEXT-INDENT: 2em">星期一：完全备份（A） </p>
		<p style="TEXT-INDENT: 2em">星期二：增量导出（B） </p>
		<p style="TEXT-INDENT: 2em">星期三：增量导出（C） </p>
		<p style="TEXT-INDENT: 2em">星期四：增量导出（D） </p>
		<p style="TEXT-INDENT: 2em">星期五：累计导出（E） </p>
		<p style="TEXT-INDENT: 2em">星期六：增量导出（F） </p>
		<p style="TEXT-INDENT: 2em">星期日：增量导出（G） </p>
		<p style="TEXT-INDENT: 2em">如果在星期日，数据库遭到意外破坏，数据库管理员可按一下步骤来回复数据库： </p>
		<p style="TEXT-INDENT: 2em">第一步：用命令CREATE DATABASE重新生成数据库结构； </p>
		<p style="TEXT-INDENT: 2em">第二步：创建一个足够大的附加回滚。 </p>
		<p style="TEXT-INDENT: 2em">第三步：完全增量导入A： </p>
		<p style="TEXT-INDENT: 2em">
		</p>
		<center>
				<ccid_nobr>
						<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
								<tbody>
										<tr>
												<td class="code" style="FONT-SIZE: 9pt" bgcolor="#e6e6e6">
														<pre>
																<ccid_code>imp system/manager inctype=RESTORE FULL=y FILE=A</ccid_code>
														</pre>
												</td>
										</tr>
								</tbody>
						</table>
				</ccid_nobr>
		</center>
		<p style="TEXT-INDENT: 2em">第四步：累计增量导入E： </p>
		<p style="TEXT-INDENT: 2em">
		</p>
		<center>
				<ccid_nobr>
						<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
								<tbody>
										<tr>
												<td class="code" style="FONT-SIZE: 9pt" bgcolor="#e6e6e6">
														<pre>
																<ccid_code>imp system/manager inctype=RESTORE FULL=Y FILE=E</ccid_code>
														</pre>
												</td>
										</tr>
								</tbody>
						</table>
				</ccid_nobr>
		</center>
		<p style="TEXT-INDENT: 2em">第五步：最近增量导入F： </p>
		<p style="TEXT-INDENT: 2em">
		</p>
		<center>
				<ccid_nobr>
						<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
								<tbody>
										<tr>
												<td class="code" style="FONT-SIZE: 9pt" bgcolor="#e6e6e6">
														<pre>
																<ccid_code>imp system/manager inctype=RESTORE FULL=Y FILE=F</ccid_code>
														</pre>
												</td>
										</tr>
								</tbody>
						</table>
				</ccid_nobr>
		</center>
		<p style="TEXT-INDENT: 2em">二、 冷备份 </p>
		<p style="TEXT-INDENT: 2em">冷备份发生在数据库已经正常关闭的情况下，当正常关闭时会提供给我们一个完整的数据库。冷备份时将关键性文件拷贝到另外的位置的一种说法。对于备份Oracle信息而言，冷备份时最快和最安全的方法。冷备份的优点是： </p>
		<p style="TEXT-INDENT: 2em">１、 是非常快速的备份方法（只需拷文件） </p>
		<p style="TEXT-INDENT: 2em">２、 容易归档（简单拷贝即可） </p>
		<p style="TEXT-INDENT: 2em">３、 容易恢复到某个时间点上（只需将文件再拷贝回去） </p>
		<p style="TEXT-INDENT: 2em">４、 能与归档方法相结合，做数据库“最佳状态”的恢复。 </p>
		<p style="TEXT-INDENT: 2em">５、 低度维护，高度安全。 </p>
		<p style="TEXT-INDENT: 2em">但冷备份也有如下不足： </p>
		<p style="TEXT-INDENT: 2em">１、 单独使用时，只能提供到“某一时间点上”的恢复。 </p>
		<p style="TEXT-INDENT: 2em">２、 再实施备份的全过程中，数据库必须要作备份而不能作其他工作。也就是说，在冷备份过程中，数据库必须是关闭状态。 </p>
		<p style="TEXT-INDENT: 2em">３、 若磁盘空间有限，只能拷贝到磁带等其他外部存储设备上，速度会很慢。 </p>
		<p style="TEXT-INDENT: 2em">４、 不能按表或按用户恢复。 </p>
		<p style="TEXT-INDENT: 2em">如果可能的话（主要看效率），应将信息备份到磁盘上，然后启动数据库（使用户可以工作）并将备份的信息拷贝到磁带上（拷贝的同时，数据库也可以工作）。冷备份中必须拷贝的文件包括： </p>
		<p style="TEXT-INDENT: 2em">１、 所有数据文件 </p>
		<p style="TEXT-INDENT: 2em">２、 所有控制文件 </p>
		<p style="TEXT-INDENT: 2em">３、 所有联机REDO LOG文件 </p>
		<p style="TEXT-INDENT: 2em">４、 Init.ora文件（可选） </p>
		<p style="TEXT-INDENT: 2em">值得注意的使冷备份必须在数据库关闭的情况下进行，当数据库处于打开状态时，执行数据库文件系统备份是无效的。 </p>
		<p style="TEXT-INDENT: 2em">下面是作冷备份的完整例子。 </p>
		<p style="TEXT-INDENT: 2em">（1） 关闭数据库 </p>
		<p style="TEXT-INDENT: 2em">
		</p>
		<center>
				<ccid_nobr>
						<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
								<tbody>
										<tr>
												<td class="code" style="FONT-SIZE: 9pt" bgcolor="#e6e6e6">
														<pre>
																<ccid_code>sqlplus /nolog 
sql&gt;;connect /as sysdba 
sql&gt;;shutdown normal;</ccid_code>
														</pre>
												</td>
										</tr>
								</tbody>
						</table>
				</ccid_nobr>
		</center>
		<p style="TEXT-INDENT: 2em">（2） 用拷贝命令备份全部的时间文件、重做日志文件、控制文件、初始化参数文件 </p>
		<p style="TEXT-INDENT: 2em">
		</p>
		<center>
				<ccid_nobr>
						<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
								<tbody>
										<tr>
												<td class="code" style="FONT-SIZE: 9pt" bgcolor="#e6e6e6">
														<pre>
																<ccid_code>sql&gt;;cp &lt;file&gt;; &lt;backup directory&gt;;</ccid_code>
														</pre>
												</td>
										</tr>
								</tbody>
						</table>
				</ccid_nobr>
		</center>
		<p style="TEXT-INDENT: 2em">（3） 重启Oracle数据库 </p>
		<p style="TEXT-INDENT: 2em">
		</p>
		<center>
				<ccid_nobr>
						<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
								<tbody>
										<tr>
												<td class="code" style="FONT-SIZE: 9pt" bgcolor="#e6e6e6">
														<pre>
																<ccid_code>sql&gt;;startup</ccid_code>
														</pre>
												</td>
										</tr>
								</tbody>
						</table>
				</ccid_nobr>
		</center>
		<p style="TEXT-INDENT: 2em">三、 热备份 </p>
		<p style="TEXT-INDENT: 2em">热备份是在数据库运行的情况下，采用archivelog mode方式备份数据库的方法。所以，如果你有昨天夜里的一个冷备份而且又有今天的热备份文件，在发生问题时，就可以利用这些资料恢复更多的信息。热备份要求数据库在Archivelog方式下操作，并需要大量的档案空间。一旦数据库运行在archivelog状态下，就可以做备份了。热备份的命令文件由三部分组成： </p>
		<p style="TEXT-INDENT: 2em">1． 数据文件一个表空间一个表空间的备份。 </p>
		<p style="TEXT-INDENT: 2em">（1） 设置表空间为备份状态 </p>
		<p style="TEXT-INDENT: 2em">（2） 备份表空间的数据文件 </p>
		<p style="TEXT-INDENT: 2em">（3） 回复表空间为正常状态 </p>
		<p style="TEXT-INDENT: 2em">2． 备份归档log文件 </p>
		<p style="TEXT-INDENT: 2em">（1） 临时停止归档进程 </p>
		<p style="TEXT-INDENT: 2em">（2） log下那些在archive rede log目标目录中的文件 </p>
		<p style="TEXT-INDENT: 2em">（3） 重新启动archive进程 </p>
		<p style="TEXT-INDENT: 2em">（4） 备份归档的redo log文件 </p>
		<p style="TEXT-INDENT: 2em">3． 用alter database bachup controlfile命令来备份控制文件 </p>
		<p style="TEXT-INDENT: 2em">热备份的优点是： </p>
		<p style="TEXT-INDENT: 2em">1． 可在表空间或数据库文件级备份，备份的时间短。 </p>
		<p style="TEXT-INDENT: 2em">2． 备份时数据库仍可使用。 </p>
		<p style="TEXT-INDENT: 2em">3． 可达到秒级恢复（恢复到某一时间点上）。 </p>
		<p style="TEXT-INDENT: 2em">4． 可对几乎所有数据库实体做恢复 </p>
		<p style="TEXT-INDENT: 2em">5． 恢复是快速的，在大多数情况下爱数据库仍工作时恢复。 </p>
		<p style="TEXT-INDENT: 2em">热备份的不足是： </p>
		<p style="TEXT-INDENT: 2em">1． 不能出错，否则后果严重 </p>
		<p style="TEXT-INDENT: 2em">2． 若热备份不成功，所得结果不可用于时间点的恢复 </p>
		<p style="TEXT-INDENT: 2em">3． 因难于维护，所以要特别仔细小心，不允许“以失败告终”。</p>
		<p style="TEXT-INDENT: 2em">
				<br />
				<br />
				<br />参考资料：<a href="http://publish.it168.com/2006/0601/20060601045701.shtml?positioncode=1545">http://publish.it168.com/2006/0601/20060601045701.shtml?positioncode=1545</a><br /><a href="http://bbs.zol.com.cn/index20061024/index_124_11079.html">http://bbs.zol.com.cn/index20061024/index_124_11079.html</a><br /><a href="http://community.csdn.net/Expert/TopicView3.asp?id=5276764">http://community.csdn.net/Expert/TopicView3.asp?id=5276764</a><br /><a href="http://bbs.gdei.edu.cn/faster.php?id=t-55261">http://bbs.gdei.edu.cn/faster.php?id=t-55261</a><br /><a href="http://www.dvbbs.net/tech/data/2006031819272.asp">http://www.dvbbs.net/tech/data/2006031819272.asp</a><br /><a href="http://study.feloo.com/computer/data/Oracle/200509/121026.html">http://study.feloo.com/computer/data/Oracle/200509/121026.html</a><br /></p>
<img src ="http://www.blogjava.net/wangxq/aggbug/96113.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxq/" target="_blank">扭转乾坤</a> 2007-01-26 11:54 <a href="http://www.blogjava.net/wangxq/archive/2007/01/26/96113.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一哥们写的日期处理类，很棒</title><link>http://www.blogjava.net/wangxq/archive/2007/01/25/95910.html</link><dc:creator>扭转乾坤</dc:creator><author>扭转乾坤</author><pubDate>Thu, 25 Jan 2007 05:52:00 GMT</pubDate><guid>http://www.blogjava.net/wangxq/archive/2007/01/25/95910.html</guid><wfw:comment>http://www.blogjava.net/wangxq/comments/95910.html</wfw:comment><comments>http://www.blogjava.net/wangxq/archive/2007/01/25/95910.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxq/comments/commentRss/95910.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxq/services/trackbacks/95910.html</trackback:ping><description><![CDATA[  import   java.util.Calendar;   <br />  import   java.sql.Date;   <br />  import   java.text.SimpleDateFormat;   <br />  import   java.text.ParseException;   <br />    <br />  /**   <br />    *   Utility   to   date   time   <br />    *   @version   0.1   <br />    *   @author   Super   Zhao   <br />    */   <br />  public   class   DateTimeUtil   {   <br />    <br />  /**   <br />    *   由java.util.Date到java.sql.Date的类型转换   <br />    *   @param   date   <br />    *   @return   Date   <br />    */   <br />  public   static   Date   getSqlDate(java.util.Date   date){   <br />  return   new   Date(date.getTime());   <br />  }   <br />    <br />  public   static   Date   nowDate(){   <br />  Calendar   calendar=Calendar.getInstance();   <br />  return   getSqlDate(calendar.getTime());   <br />  }   <br />    <br />  /**   <br />    *   获得某一日期的后一天   <br />    *   @param   date   <br />    *   @return   Date   <br />    */   <br />  public   static   Date   getNextDate(Date   date){   <br />  Calendar   calendar=Calendar.getInstance();   <br />  calendar.setTime(date);   <br />  int   day=calendar.get(Calendar.DATE);   <br />  calendar.set(Calendar.DATE,day+1);   <br />  return   getSqlDate(calendar.getTime());   <br />  }   <br />    <br />  /**   <br />    *   获得某一日期的前一天   <br />    *   @param   date   <br />    *   @return   Date   <br />    */   <br />  public   static   Date   getPreviousDate(Date   date){   <br />  Calendar   calendar=Calendar.getInstance();   <br />  calendar.setTime(date);   <br />  int   day=calendar.get(Calendar.DATE);   <br />  calendar.set(Calendar.DATE,day-1);   <br />  return   getSqlDate(calendar.getTime());   <br />  }   <br />    <br />  /**   <br />    *   获得某年某月第一天的日期   <br />    *   @param   year   <br />    *   @param   month   <br />    *   @return   Date   <br />    */   <br />  public   static   Date   getFirstDayOfMonth(int   year,int   month){   <br />  Calendar   calendar=Calendar.getInstance();   <br />  calendar.set(Calendar.YEAR,year);   <br />  calendar.set(Calendar.MONTH,month-1);   <br />  calendar.set(Calendar.DATE,1);   <br />  return   getSqlDate(calendar.getTime());   <br />  }   <br />    <br />  /**   <br />    *   获得某年某月最后一天的日期   <br />    *   @param   year   <br />    *   @param   month   <br />    *   @return   Date   <br />    */   <br />  public   static   Date   getLastDayOfMonth(int   year,int   month){   <br />  Calendar   calendar=Calendar.getInstance();   <br />  calendar.set(Calendar.YEAR,year);   <br />  calendar.set(Calendar.MONTH,month);   <br />  calendar.set(Calendar.DATE,1);   <br />  return   getPreviousDate(getSqlDate(calendar.getTime()));   <br />  }   <br />    <br />  /**   <br />    *   由年月日构建java.sql.Date类型   <br />    *   @param   year   <br />    *   @param   month   <br />    *   @param   date   <br />    *   @return   Date   <br />    */   <br />  public   static   Date   buildDate(int   year,int   month,int   date){   <br />  Calendar   calendar=Calendar.getInstance();   <br />  calendar.set(year,month-1,date);   <br />  return   getSqlDate(calendar.getTime());   <br />  }   <br />    <br />  /**   <br />    *   取得某月的天数   <br />    *   @param   year   <br />    *   @param   month   <br />    *   @return   int   <br />    */   <br />  public   static   int   getDayCountOfMonth(int   year,int   month){   <br />  Calendar   calendar=Calendar.getInstance();   <br />  calendar.set(Calendar.YEAR,year);   <br />  calendar.set(Calendar.MONTH,month);   <br />  calendar.set(Calendar.DATE,0);   <br />  return   calendar.get(Calendar.DATE);   <br />  }   <br />    <br />  /**   <br />    *   获得某年某季度的最后一天的日期   <br />    *   @param   year   <br />    *   @param   quarter   <br />    *   @return   Date   <br />    */   <br />  public   static   Date   getLastDayOfQuarter(int   year,int   quarter){   <br />  int   month=0;   <br />  if(quarter&gt;4){   <br />  return   null;   <br />  }else{   <br />  month=quarter*3;   <br />  }   <br />  return   getLastDayOfMonth(year,month);   <br />    <br />  }   <br />    <br />  /**   <br />    *   获得某年某季度的第一天的日期   <br />    *   @param   year   <br />    *   @param   quarter   <br />    *   @return   Date   <br />    */   <br />  public   static   Date   getFirstDayOfQuarter(int   year,int   quarter){   <br />  int   month=0;   <br />  if(quarter&gt;4){   <br />  return   null;   <br />  }else{   <br />  month=(quarter-1)*3+1;   <br />  }   <br />  return   getFirstDayOfMonth(year,month);   <br />  }   <br />    <br />  /**   <br />    *   获得某年的第一天的日期   <br />    *   @param   year   <br />    *   @return   Date   <br />    */   <br />  public   static   Date   getFirstDayOfYear(int   year){   <br />  return   getFirstDayOfMonth(year,1);   <br />  }   <br />    <br />  /**   <br />    *   获得某年的最后一天的日期   <br />    *   @param   year   <br />    *   @return   Date   <br />    */   <br />  public   static   Date   getLastDayOfYear(int   year){   <br />  return   getLastDayOfMonth(year,12);   <br />  }   <br />    <br />  /**   <br />    *   String到java.sql.Date的类型转换   <br />    *   @param   param   <br />    *   @return   Date   <br />    */   <br />  public   static   java.sql.Date   StringToDate(String   param)   {   <br />  if(StringUtil.nullOrBlank(param))   {   <br />  return   null;   <br />  }   else   {   <br />  java.util.Date   date   =null;   <br />  try   {   <br />  SimpleDateFormat   sdf=new   SimpleDateFormat("yyyy-MM-dd");   <br />  date   =   sdf.parse(param);   <br />  return   new   Date(date.getTime());   <br />  }   <br />  catch   (ParseException   ex)   {   <br />  //ex.printStackTrace();   <br />  return   null;   <br />  }   <br />  }   <br />  }   <br />  }   <img src ="http://www.blogjava.net/wangxq/aggbug/95910.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxq/" target="_blank">扭转乾坤</a> 2007-01-25 13:52 <a href="http://www.blogjava.net/wangxq/archive/2007/01/25/95910.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>好玩的眼睛</title><link>http://www.blogjava.net/wangxq/archive/2006/12/30/91035.html</link><dc:creator>扭转乾坤</dc:creator><author>扭转乾坤</author><pubDate>Sat, 30 Dec 2006 09:30:00 GMT</pubDate><guid>http://www.blogjava.net/wangxq/archive/2006/12/30/91035.html</guid><wfw:comment>http://www.blogjava.net/wangxq/comments/91035.html</wfw:comment><comments>http://www.blogjava.net/wangxq/archive/2006/12/30/91035.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxq/comments/commentRss/91035.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxq/services/trackbacks/91035.html</trackback:ping><description><![CDATA[
		<div>
		</div>
<img src ="http://www.blogjava.net/wangxq/aggbug/91035.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxq/" target="_blank">扭转乾坤</a> 2006-12-30 17:30 <a href="http://www.blogjava.net/wangxq/archive/2006/12/30/91035.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>javascript打印</title><link>http://www.blogjava.net/wangxq/archive/2006/11/14/81096.html</link><dc:creator>扭转乾坤</dc:creator><author>扭转乾坤</author><pubDate>Tue, 14 Nov 2006 04:26:00 GMT</pubDate><guid>http://www.blogjava.net/wangxq/archive/2006/11/14/81096.html</guid><wfw:comment>http://www.blogjava.net/wangxq/comments/81096.html</wfw:comment><comments>http://www.blogjava.net/wangxq/archive/2006/11/14/81096.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxq/comments/commentRss/81096.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxq/services/trackbacks/81096.html</trackback:ping><description><![CDATA[
		<p>问题：去除页眉页脚，设置打印的横纵向方式！<br />解决方案一：<br />修改注册表：<br />  var HKEY_Root,HKEY_Path,HKEY_Key;<br />  HKEY_Root = "HKEY_CURRENT_USER\\";<br />  HKEY_Path="Software\\Microsoft\\Internet Explorer\\PageSetup\\";<br />  <br />  function PageSetup_Null(){<br />   var Wsh = new ActiveXObject("WScript.Shell");<br />   HKEY_Key = "header";<br />   //Wsh.RegRead(HKEY_Root+HKEY_Path+HKEY_Key);<br />   Wsh.RegWrite(HKEY_Root+HKEY_Path+HKEY_Key,"");<br />   HKEY_Key = "footer";<br />   //Wsh.RegRead(HKEY_Root+HKEY_Path+HKEY_Key);<br />   Wsh.RegWrite(HKEY_Root+HKEY_Path+HKEY_Key,"");<br />  }<br />  <br />  window.onload=PageSetup_Null();<br />  <br />  function PageSetup_Reset(){<br />   var Wsh = new ActiveXObject("WScript.Shell");<br />   HKEY_Key = "header";<br />   Wsh.RegWrite(HKEY_Root+HKEY_Path+HKEY_Key,"&amp;w&amp;b页码,&amp;p/&amp;P");<br />   HKEY_Key = "footer";<br />   Wsh.RegWrite(HKEY_Root+HKEY_Path+HKEY_Key,"&amp;u&amp;b&amp;d");<br />  }</p>
		<p>  window.unonload=PageSetup_Reset();</p>
		<p>由于注册表位置跟操作系统有关，不推荐使用。</p>
		<p>解决方案二：<br />使用控件：<br />－－－－－－－－－－－－－<a href="http://www.7say.com/article.asp?id=112">http://www.7say.com/article.asp?id=112</a>－－－－－－－－－－<br />利用ScriptX.cab控件进行WEB打印，可以控制"纵打"、 横打”和“页面的边距。打印代码如下：</p>
		<p>&lt;object id=factory viewastext style="display:none"<br />classid="clsid:1663ed61-23eb-11d2-b92f-008048fdd814"<br /> codebase="<a href="http://www.meadroid.com/scriptx/ScriptX.cab#Version=6,2,433,14">http://www.meadroid.com/scriptx/ScriptX.cab#Version=6,2,433,14</a>"&gt;<br />&lt;/object&gt;<br />&lt;script defer&gt;<br />function window.onload() {<br /> // -- advanced features<br /> factory.printing.SetMarginMeasure(2); // measure margins in inches<br /> factory.printing.printer = "HP DeskJet 870C";<br /> factory.printing.paperSize = "A4";<br /> factory.printing.paperSource = "Manual feed";<br /> factory.printing.collate = true;<br /> factory.printing.copies = 2;<br /> factory.printing.SetPageRange(false, 1, 3); // need pages from 1 to 3</p>
		<p> // -- basic features<br /> factory.printing.header = "This is MeadCo";<br /> factory.printing.footer = "Advanced Printing by ScriptX";<br /> factory.printing.portrait = false;<br /> factory.printing.leftMargin = 1.0;<br /> factory.printing.topMargin = 1.0;<br /> factory.printing.rightMargin = 1.0;<br /> factory.printing.bottomMargin = 1.0;<br />}</p>
		<p>function Print(frame) {<br /> factory.printing.Print(true, frame) // print with prompt<br />&lt;/script&gt;</p>
		<p>&lt;script language="javascript"&gt;<br />function printTure() //打印函数<br />{<br /> document.all("dayinDiv").style.display="none";//隐藏按钮<br /> factory.printing.Print(false); //调用控件打印<br /> document.all("dayinDiv").style.display="";//显示<br />}<br />&lt;/script&gt;</p>
		<p>&lt;DIV align="center" id="dayinDiv" name="dayinDiv"&gt;<br />&lt;input type=button value="打印本页" onclick="printTure()"&gt; <br />&lt;input type=button value="页面设置" onclick="factory.printing.PageSetup()"&gt; <br />&lt;input type=button value="打印预览" onclick="factory.printing.Preview()"&gt;&lt;br&gt; <br />&lt;/DIV&gt;</p>
		<p>
				<br />关于ScriptX的下载和该控件的使用方法请登陆 <a href="http://www.meadroid.com/scriptx/index.asp">http://www.meadroid.com/scriptx/index.asp</a> 查看.<br />－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<br />具体应用：<br />  &lt;object id=factory style="display:none"<br />   classid="clsid:1663ed61-23eb-11d2-b92f-008048fdd814" <br />   codebase="&lt;c:url value="/editor/ScriptX.cab#version=5,60,0,375"/&gt;" viewastext&gt;<br />  &lt;/object&gt;</p>
		<p>  &lt;OBJECT id=WB　classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2 height=0 width=0&gt;&lt;/OBJECT&gt; </p>
		<p>  function printit() <br />  { <br />   factory.printing.header   =   "";   <br />         factory.printing.footer   =   "";   <br />   factory.printing.portrait = false;<br />  　　 WB.ExecWB(6,6) <br />  } <br />  <br />  function setPrint()<br />  {<br />   factory.printing.header   =   "";   <br />         factory.printing.footer   =   "";   <br />   factory.printing.portrait = false;<br />   WB.ExecWB(8,1);<br />  }<br />  function previewPrint()<br />  {<br />   factory.printing.header   =   "";   <br />         factory.printing.footer   =   "";   <br />   factory.printing.portrait = false;<br />   WB.ExecWB(7,1)<br />  }</p>
		<p>  function reset() {<br />   factory.printing.header   =   "&amp;w&amp;b页码,&amp;p/&amp;P";   <br />         factory.printing.footer   =   "&amp;u&amp;b&amp;d";   <br />   factory.printing.portrait = true;<br />  }</p>
		<p>  window.unonload=reset();</p>
		<p>&lt;DIV align="center" id="dayinDiv" name="dayinDiv"&gt;<br />&lt;input type=button value="打印本页" onclick="printit()"&gt; <br />&lt;input type=button value="页面设置" onclick="setPrint()"&gt; <br />&lt;input type=button value="打印预览" onclick="previewPrint()"&gt;&lt;br&gt; <br />&lt;/DIV&gt;</p>
<img src ="http://www.blogjava.net/wangxq/aggbug/81096.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxq/" target="_blank">扭转乾坤</a> 2006-11-14 12:26 <a href="http://www.blogjava.net/wangxq/archive/2006/11/14/81096.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java中split使用简介</title><link>http://www.blogjava.net/wangxq/archive/2006/11/14/81095.html</link><dc:creator>扭转乾坤</dc:creator><author>扭转乾坤</author><pubDate>Tue, 14 Nov 2006 04:25:00 GMT</pubDate><guid>http://www.blogjava.net/wangxq/archive/2006/11/14/81095.html</guid><wfw:comment>http://www.blogjava.net/wangxq/comments/81095.html</wfw:comment><comments>http://www.blogjava.net/wangxq/archive/2006/11/14/81095.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxq/comments/commentRss/81095.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxq/services/trackbacks/81095.html</trackback:ping><description><![CDATA[
		<p>java.lang.string.split<br />split 方法<br />将一个字符串分割为子字符串，然后将结果作为字符串数组返回。<br />string.split([separator，[limit]])<br />参数<br />string 必选项。要被分解的 String 对象或文字。该对象不会被 split 方法修改。<br />separator 可选项。字符串或 正则表达式 对象，它标识了分隔字符串时使用的是一个还是多个字符。如果忽略该选项，返回包含整个字符串的单一元素数组。 <br />limit 可选项。该值用来限制返回数组中的元素个数。 <br />说明<br />split 方法的结果是一个字符串数组，在 sting 中每个出现 separator 的位置都要进行分解。</p>
		<p>separator 不作为任何数组元素的部分返回。</p>
		<p>，+ * 不是有效的模式匹配规则表达式，用"\\*" "\\+"转义后即可得到正确的结果。<br />"|" 分隔串时虽然能够执行，但是却不是预期的目的，"\\|"转义后即可得到正确的结果。<br />还有如果想在串中使用"\"字符，则也需要转义.首先要表达"aaaa\bbbb"这个串就应该用"aaaa\\bbbb",如果要分隔就应该这样才能得到正确结果：<br />        String[] aa = "aaa\\bbb\\bccc".split(<a>\\\\</a>);</p>
		<p>\\也可用[]代替，如：[|] [*]<br /></p>
<img src ="http://www.blogjava.net/wangxq/aggbug/81095.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxq/" target="_blank">扭转乾坤</a> 2006-11-14 12:25 <a href="http://www.blogjava.net/wangxq/archive/2006/11/14/81095.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>存储过程的一些用法</title><link>http://www.blogjava.net/wangxq/archive/2006/11/14/81084.html</link><dc:creator>扭转乾坤</dc:creator><author>扭转乾坤</author><pubDate>Tue, 14 Nov 2006 03:27:00 GMT</pubDate><guid>http://www.blogjava.net/wangxq/archive/2006/11/14/81084.html</guid><wfw:comment>http://www.blogjava.net/wangxq/comments/81084.html</wfw:comment><comments>http://www.blogjava.net/wangxq/archive/2006/11/14/81084.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxq/comments/commentRss/81084.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxq/services/trackbacks/81084.html</trackback:ping><description><![CDATA[
		<p>最近在用存储过程,在网上找了很多的资料,下面就参考各种资料整理的一些小例子做些阐述：<br />1. Oralce TO_NUMBER() function 的改进：<br />用Oracle TO_NUMBER进行类型转换的时候，如果有无效数字，将返回错误。遗憾的是，Oralce TO_NUMBER并不是在query运行开始就报错，而是到碰到无效数字的纪录才报错，而且只是说无效输入，并不提示是哪条纪录，也没有任何输出。如果是一张大表，query运行很久才来这么一下，而且根本不知道那里出的错，是什么值，岂不痛苦？偶就经常跟这样的表打交道，遂自建一个函数，GET_NUM：</p>
		<p>CREATE OR REPLACE FUNCTION GET_NUM(IN_TXT in VARCHAR2) RETURN NUMBER IS<br />RETRUN_VALUE NUMBER;<br />BEGIN<br /> select to_number(IN_TXT) into RETRUN_VALUE from dual;<br /> RETURN RETRUN_VALUE;<br /> <br /> EXCEPTION<br /> WHEN others<br /> THEN<br /> RETURN null;<br />END GET_NUM;<br />/<br />这样无效数字全转换成 Null,纠错容易多了。</p>
		<p>写个存储过程测试一下：<br />CREATE OR REPLACE PROCEDURE TestFun IS<br />    v_name varchar2(10);/***** 存放cursor_para中的name *****/<br />    CURSOR cursor_name IS select name from test;<br />    cursor cursor_para(p_num number) is select name from test where num = p_num;<br />begin<br />  /******* t_name为循环的临时变量******/<br />  FOR t_name IN cursor_name LOOP<br />  <br />    if (get_num(t_name.name) is not null) then<br />    <br />   open cursor_para(get_num(t_name.name));<br />   <br />   fetch cursor_para into v_name;<br />   <br />   DBMS_OUTPUT.PUT_LINE('Name:'|| v_name);<br />   <br />   close cursor_para;<br />       <br />   end if;<br />   <br />  END LOOP;<br />END TestFun;<br />/<br />存储过程也用到了带参数的游标和游标For循环,稍后介绍.</p>
		<p>其中测试表的创建：<br />create table test<br />(<br />     name varchar2(10),<br />    num number<br />)</p>
		<p>测试数据: <br />insert into test(name) values ('12_');<br />insert into test(name) values ('123');<br /><br />2.带参数的游标</p>
		<p>　　与存储过程和函数相似，可以将参数传递给游标并在查询中使用。这对于处理在某种条件下打开游标的情况非常有用。它的语法如下：</p>
		<p>CURSOR cursor_name[(parameter[,parameter],...)] IS select_statement; </p>
		<p>　　定义参数的语法如下：</p>
		<p>Parameter_name [IN] data_type[{:=|DEFAULT} value] </p>
		<p>　　与存储过程不同的是，游标只能接受传递的值，而不能返回值。参数只定义数据类型，没有大小。 </p>
		<p>　　另外可以给参数设定一个缺省值，当没有参数值传递给游标时，就使用缺省值。游标中定义的参数只是一个占位符，在别处引用该参数不</p>
		<p>一定可靠。</p>
		<p>　　在打开游标时给参数赋值，语法如下：</p>
		<p>OPEN cursor_name[value[,value]....]; </p>
		<p>3.游标FOR循环</p>
		<p>　　在大多数时候我们在设计程序的时候都遵循下面的步骤：</p>
		<p>　　1、打开游标</p>
		<p>　　2、开始循环</p>
		<p>　　3、从游标中取值</p>
		<p>　　4、检查那一行被返回</p>
		<p>　　5、处理</p>
		<p>　　6、关闭循环</p>
		<p>　　7、关闭游标</p>
		<p>　　可以简单的把这一类代码称为游标用于循环。但还有一种循环与这种类型不相同，这就是FOR循环，用于FOR循环的游标按照正常的声明方</p>
		<p>式声明，它的优点在于不需要显式的打开、关闭、取数据，测试数据的存在、定义存放数据的变量等等。游标FOR 循环的语法如下：</p>
		<p>FOR record_name IN<br />(corsor_name[(parameter[,parameter]...)]<br />| (query_difinition)<br />LOOP<br />statements<br />END LOOP; </p>
		<p>上面的这两个用法也在例子中提到了！</p>
		<p>同理类推，也可以将TO_DATE()函数改进。<br /></p>
		<p>下面的例子自<a href="http://www.nikicn.com/bbs/dispbbs.asp?boardid=23&amp;id=908">http://www.nikicn.com/bbs/dispbbs.asp?boardid=23&amp;id=908</a><br />没有测试，留作备份之用：<br />4. 将Oracle 的Last_Day()函数改写到DB2上：<br />DROP SPECIFIC FUNCTION LAST_DAYDATE<br />;<br />CREATE FUNCTION LAST_DAY(D DATE)<br />RETURNS     DATE<br />    SPECIFIC LAST_DAYDATE<br />    LANGUAGE SQL<br />    DETERMINISTIC<br />    CONTAINS SQL<br />    CALLED ON NULL INPUT<br />    NO EXTERNAL ACTION<br />    RETURN <br />D + 1 month - day(D + 1 month) day</p>
		<p>;</p>
		<p>同理，DB2下的first day:<br />DROP SPECIFIC FUNCTION FIRST_DAYDATE<br />;<br />CREATE FUNCTION FIRST_DAY(D DATE)<br />RETURNS     DATE<br />    SPECIFIC FIRST_DAYDATE<br />    LANGUAGE SQL<br />    DETERMINISTIC<br />    CONTAINS SQL<br />    CALLED ON NULL INPUT<br />    NO EXTERNAL ACTION<br />    RETURN<br />D - day(D) day + 1 day</p>
<img src ="http://www.blogjava.net/wangxq/aggbug/81084.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxq/" target="_blank">扭转乾坤</a> 2006-11-14 11:27 <a href="http://www.blogjava.net/wangxq/archive/2006/11/14/81084.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]Jsp运行环境的配置方法</title><link>http://www.blogjava.net/wangxq/archive/2006/08/24/65464.html</link><dc:creator>扭转乾坤</dc:creator><author>扭转乾坤</author><pubDate>Thu, 24 Aug 2006 02:54:00 GMT</pubDate><guid>http://www.blogjava.net/wangxq/archive/2006/08/24/65464.html</guid><wfw:comment>http://www.blogjava.net/wangxq/comments/65464.html</wfw:comment><comments>http://www.blogjava.net/wangxq/archive/2006/08/24/65464.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wangxq/comments/commentRss/65464.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangxq/services/trackbacks/65464.html</trackback:ping><description><![CDATA[
		<p>
				<a href="http://soft.etcell.com/topicView.aspx?Id=5692">http://soft.etcell.com/topicView.aspx?Id=5692</a>
				<br />配置server.xml ------ Tomcat的全局配置文件<br />当你打开Tomcat这个目录时，你将可以看到在这个目录下有个conf文件夹，打开该目录下server.xml文件的源码，我们会看到里面有很多xml代码，是用来描述Tomcat的全局配置，在此我们只关心跟我们有密切关系的部分。<br />&lt;1&gt;设置路径映射<br />大概在第264至267行中你可以看到</p>
		<p>&lt;!-- Tomcat Root Context --&gt;<br />        &lt;!--<br />          &lt;Context path="" docBase="ROOT" debug="0"/&gt;<br />        --&gt;</p>
		<p>其中&lt;!-- Tomcat Root Context --&gt;是说明部分，没任何作用，我们不理它。<br />docBase="ROOT"就是指定我们项目的物理地址，如果用上面所建的项目htdocs，那就是docBase=" E:/Tomcat41/htdocs"。</p>
		<p>path=""是指定在URL的相对路径，如设置为path="TEST",那么在URL中输入<a href="http://127.0.0.1:80/TEST">http://127.0.0.1:80/TEST</a> ，它将能读到E:/Tomcat41/htdocs下的文件。<br />但一般我们设置为path=""，而且在安装Tomcat时端口设置为80，那么<br />在URL中输入<a href="http://127.0.0.1/">http://127.0.0.1/</a>就可以读到E:/Tomcat41/htdocs下的文件了。</p>
		<p>为了每次网页刷新能有效的读到最新的文件，在此我们增加了一个设置，<br />reloadable=”true”。<br />最后的结果是：</p>
		<p>&lt;!-- Tomcat Root Context --&gt;<br />&lt;Context path="" docBase="E:/Tomcat41/htdocs" reloadable="true" debug="0"/&gt;</p>
		<p>web.xml -----在Tomcat中配置不同的关系环境<br />跟server.xml同一目录下还有一个web.xml，打开该文件的源码,我们看看一些常用的配置方法<br />A.隐藏跟目录下的文件夹<br />出于安全的考虑，为了不让客户端能看到服务器端跟目录下的文件，必须把listings从true改为false,具体如下：<br />&lt;servlet&gt;<br />        …………<br />        &lt;init-param&gt;<br />            &lt;param-name&gt;listings&lt;/param-name&gt;<br />            &lt;param-value&gt;false&lt;/param-value&gt;<br />        &lt;/init-param&gt;<br />        ……………<br />    &lt;/servlet&gt;<br />B.开放servlet和jsp<br />由于在应用程序中会用到servlet和jsp,为了在URL中检索并处理servlet和jsp，必须把servlet和jsp开放出来，就是去掉 “&lt;!—“和” --&gt;”,具体如下：<br />&lt;!-- The mapping for the invoker servlet --&gt;</p>
		<p>    &lt;servlet-mapping&gt;<br />        &lt;servlet-name&gt;invoker&lt;/servlet-name&gt;<br />        &lt;url-pattern&gt;/servlet/*&lt;/url-pattern&gt;<br />    &lt;/servlet-mapping&gt;<br />    &lt;!-- The mapping for the JSP servlet --&gt;<br />    &lt;servlet-mapping&gt;<br />        &lt;servlet-name&gt;jsp&lt;/servlet-name&gt;<br />        &lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt;<br />&lt;/servlet-mapping&gt;<br />C.设置默认文件<br />   由于客户通常只知道网站的名称，而不该知道网站的入口文件名称。为了客户在输入网址时能够找到默认的入口文件，必须把文件名加入到&lt;welcome-file-list&gt;中，如：<br />&lt;welcome-file-list&gt;<br />        &lt;welcome-file&gt;index.html&lt;/welcome-file&gt;<br />        &lt;welcome-file&gt;index.htm&lt;/welcome-file&gt;<br />        &lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;<br />&lt;/welcome-file-list&gt;<br />这时如果输入<a href="http://127.0.0.1">http://127.0.0.1</a>就等于输入<a href="http://127.0.0.1/index.html">http://127.0.0.1/index.html</a><br /><br /></p>
<img src ="http://www.blogjava.net/wangxq/aggbug/65464.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangxq/" target="_blank">扭转乾坤</a> 2006-08-24 10:54 <a href="http://www.blogjava.net/wangxq/archive/2006/08/24/65464.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>