門面模式是對象的結構模式,外部與一個子系統的通信必須通過一個統一的門面對象進行。門面模式提供一個高層次的接口,使得子系統更易于使用。使用門面模式還有一個附帶的好處,就是能夠有選擇性地暴露方法。一個模塊中定義的方法可以分成兩部分,一部分是給子系統外部使用的,一部分是子系統內部模塊之間相互調用時使用的。有了Facade類,那么用于子系統內部模塊之間相互調用的方法就不用暴露給子系統外部了。public interface ServiceA {
void methodA() ;
}
public class ServiceAImpl implements ServiceA{
@Override
public void methodA() {
System.out.println("這是服務A");
}
}
public interface ServiceB {
void methodB() ;
}
public class ServiceBImpl implements ServiceB{
@Override
public void methodB() {
System.out.println("這是服務B");
}
}
public interface ServiceC {
void methodC() ;
}
public class ServiceCImpl implements ServiceC{
@Override
public void methodC() {
System.out.println("這是服務C");
}
}
public class Facade {
ServiceA sa;
ServiceB sb;
ServiceC sc;
public Facade() {
sa = new ServiceAImpl();
sb = new ServiceBImpl();
sc = new ServiceCImpl();
}
public void methodA() {
sa.methodA();
sb.methodB();
}
public void methodB() {
sb.methodB();
sc.methodC();
}
public void methodC() {
sc.methodC();
sa.methodA();
}
}
測試類:
public class Test {
public static void main(String[] args) {
ServiceA sa = new ServiceAImpl();
ServiceB sb = new ServiceBImpl();
sa.methodA();
sb.methodB();
System.out.println("========");
//facade
Facade facade = new Facade();
facade.methodA();
facade.methodB();
facade.methodC();
}
}
推薦免費下載430套大型商業源碼
下載地址:http://www.hur.cn/tg/linkin.asp?linkid=200978
PB-商業源碼
金科信進銷存軟件源碼(81M)
制造業管理系統源碼(257M)
PB連鎖藥店GSP源碼(136M)
創某醫院系統源碼(813M)
人力資源管理系統源碼(182M)
浪某財務系統源碼(131M)
醫院系統源碼(58M)
醫院管理軟件門診掛號收費系統源碼(83M)
醫療保險管理系統源碼(191M)
拓某連鎖專賣寶典源碼(90M)
普某ERP系統源碼(300M)
科某企業ERP源碼(154M)
重慶運通商業連鎖系統源碼(293M)
供電局MIS管理信息系統源碼(196M)
社區信息管理系統源碼(122M)
暫住人口管理系統4.0(網絡版)源碼(25M)
高某醫院系統源碼(200M)
思某商業管理系統源碼(40M)
電子廠用小型ERP系統源碼(51M)
點某財務軟件源碼(121M)
和某ERP系統源碼(73M)
醫院管理系統源碼(956M)
河南醫院信息系統源碼(400M)
瑞某酒店管理系統源碼(48M)
飛某商業管理系統源碼(87M)
PowerBuilder 8.0 自定義報表系統(5M)
動態報表系統(10M)
致某動態報表模塊源碼(5M)
小型商業進銷存系統(帶POS)(34M)
大型酒店管理最新版本PB8(60M)
中小超市POS綜合管理系統(142M)
檢查科室報告單管理軟件(17M)
商某5.0 POS系統(20M)
威某酒店管理系統(365M)
鞋業ERP系統(繁體)(160M)
新某大財務系統(301M)
醫生工作站源碼(30M)
宏聲人力資源管理系統(41M)
醫療保險系統(37M)
醫藥衛生綜合管理系統(54M)
MIS系統源代碼pb9(40M)
PB影碟出租管理系統8.03(14M)
pb-oracle通用開發框架(27M)
PB編寫的電子地圖源碼(5M)
大眾醫院門診收費系統(28M)
pb洗浴管理系統(9M)
餐飲管理程序源代碼(14M)
倉庫管理系統源碼(6M)
查詢打印數據窗口共享排序定制基類(5M)
長江科學院合同成果管理(27M)
工程造價系統源碼(17M)
國泰商業管理系統MIS(135M)
華泰印刷源碼(122M)
檢查科室報告單管理軟件(17M)
金華醫院門診掛號收費系統PB(80M)
酒店管理系統(網絡版)(73M)
某配件公司生產管理系統(154M)
某企業財務管理系統(125M)
瑞通hms(245M)
瑞通酒店管理系統V8.0網絡版(102M)
商場管理系統源代碼pb(15M)
商品進銷存管理系統(pb)(9M)
天河進銷存POS系統(211M)
物流程序源碼(53M)
小型商業進銷存系統(帶POS)(32M)
鞋業ERP源碼(153M)
旭日2000企業管理系統(65M)
血庫的軟件用pb做(6M)
藥品管理(27M)
醫療保險系統pb(258M)
普陽Erp源碼(61M)
科研管理系統源碼(15M)
酒店管理系統(59M)
Delphi-商業源碼
美容院管理系統源碼(70M)
MRPII制造資源計劃系統源碼(147M)
ERP企業管理系統源碼(74M)
福某制衣MRP管理系統源碼(43M)
勝某進銷存系統源碼(88M)
立某酒店、餐飲、洗浴、休閑管理系統源碼(55M)
實某聊天系統 v3.0源碼(71M)
社保管理系統源碼(22M)
商業通醫藥連鎖經營管理系統源碼(40M)
商業管理系統源碼(135M)
日某餐飲系統源碼(173M)
企業進銷存系統源碼(41M)
貿易網站登陸器源碼(60M)
遵某的視頻會議系統代碼源碼(26M)
貿易管理系統源碼(65M)
酒店管理系統源碼(106M)
汽車租賃信息咨詢系統源碼(62M)
牙科診所管理系統源碼(31M)
制衣MRPII系統源碼(65M)
中國眼科病歷系統源碼(103M)
遠程控制源碼(20M)
醫藥連鎖源碼源碼(55M)
語音故障報修系統(需要TW8VID語音卡)源碼(18M)
行業應急系統源碼(23M)
銷售管理系統源碼(24M)
洗浴中心管理系統源碼(20M)
五金管理信息系統源碼(18M)
網絡教室系統源碼(網絡版)源碼(58M)
天某ERP系統源碼(281M)
醫院病案管理系統源碼(26M)
VOD點歌系統源碼(59M)
國外的財務軟件源碼(126M)
旅游公司信息系統源碼(43M)
人力資源管理系統源碼(24M)
POS超市管理系統源碼(60M)
POS系統源碼(43M)
醫院收費與信息管理系統源碼(122M)
安某銷售系統源碼(10M)
GIS系統—有線電視網絡設備管理系統源碼(30M)
ICQ(客服服務器)源碼(55M)
辦公自動化系統源代碼源碼(27M)
倉儲物流信息管理系統源碼(137M)
傳奇游戲源碼(178M)
電能表載波抄表軟源碼(44M)
電子試卷生成系統源碼(30M)
美容院管理系統源碼(16M)
泰某工程管理軟件源碼(40M)
環某美容美發管理系統源碼(23M)
機房收費管理源碼(78M)
計劃生育管理系統源碼(21M)
駕駛員考試源碼(40M)
金某驗布系統源碼(82M)
進銷存系統源碼(43M)
超市庫存管理系統源碼(23M)
中移動大客戶管理系統(7M)
思微pos系統(48M)
泰達圖書館工程管理軟件源碼(24M)
Delphi編寫的企業進銷存系統源代碼(11M)
ENO企業人事信息管理系統(6M)
NiceERP企業系統(42M)
ST進銷存源碼(12M)
賓館軟件源碼(12M)
采購應用系統源碼(11M)
超市管理系統源代碼(7M)
非常方便的物業管理系統(7M)
鋼鐵進銷存源碼(12M)
港匯客戶管理系統源碼(13M)
海信商業管理系統完整源碼版(99M)
進銷存ForD7(8M)
牧羊人服飾系統 (ADO+SQL)(6M)
實達企業在線EOL三層系統Delphi源碼(11M)
手機營銷系統源碼(10M)
通用的進銷存系統源碼(10M)
通用人力資源系統源碼(7M)
完整的市一級工資管理程序源碼(142M)
西恩軟件機房管理源碼(26M)
信息管理程序源碼(14M)
制衣MRP管理系統源碼(45M)
勝天財務進銷存2003源碼(82M)
AL源碼(10M)
DAGL 檔案管理程序 v1.0 (SQL Server)(22M)
delphi BookMIS 教材管理系統(7M)
delphi_宏遠VOD原代碼(45M)
大型企業ERP管理系統(84M)
大型企業郵件管理系統(7M)
delphi_柯龍中草藥進銷存 v3.0(22M)
delphi_企業管理Erp(64M)
delphi_思微POS連鎖超市管理系統(60M)
delphi個人理財軟件源碼(7M)
delphi名佳商務系統源碼(74M)
delphi萬家福超市管理系統(17M)
delphi物流供應鏈管理系統(5M)
delphi醫院管理系統(18M)
delphi詠南進銷存 兩層(C_S)(8M)
NDOA南都辦公自動化系統(delphi)(8M)
POS連鎖超市管理系統 (商業代碼)(60M)
delphi灰鴿子vip1.2 版本(43M)
地磅稱量系統(7M)
典當綜合業務管理系統(10M)
電子尋更源程序(20M)
東莞和富有限公司進銷存管理系統(33M)
動感立體KTV VOD(18M)
工資管理系統(53M)
廣電行業GIS系統(10M)
華絲貿易國內銷售管理系統(30M)
火鍋城管理系統1.0版(10M)
機動車駕駛員無紙化理論考試系統(38M)
局域網即時通信系統(52M)
客房管理系統(網絡版)(100M)
客戶關系管理系統(CRM)(11M)
力信消費管理系統2000(12M)
龍邦進銷存源碼(16M)
美容院管理系統修改版(ADO)(21M)
某公司工資管理系統(17M)
某企業ERP企業管理系統(32M)
某通用進銷存系統(20M)
配件倉庫管理(24M)
企業管理Erp(商業源碼)(64M)
全球數碼倉庫倉儲管理信息系統(110M)
思雷特(sunnet)物業管理信息系統(232M)
臺灣公司做的一個ERP管理系統(235M)
萬佳圓賓館桑拿洗浴管理系統(20M)
網絡營銷專家(25M)
維修管理工具(15M)
五金材料商業進銷存(23M)
物業管理(22M)
校園網多媒體自動播放系統(10M)
新藝VOD系統(59M)
眼鏡行業財務進銷存后臺管理代碼 V1.0v(72M)
異洲酒店(餐飲)管理系統delphi源碼(delphi+sql)(20M)
P2P即時通訊源碼Delphi(46M)
POS消費管理系統2000delhi源碼(12M)
大型超市銷售連鎖管理系統(16M)
電子尋更源程序delphi(20M)
遠程控制DELPHI源代碼(17M)
高考網上招生省招辦投檔系統(11M)
湖南佳某軟件公司商業POS通系統delphi源碼(98M)
化工顏料生產管理源碼(30M)
科技計劃信息管理系統delphi源碼(22M)
視頻會議系統delphi源碼(45M)
某醫院HIS管理系統delphi源碼(86M)
順某指紋考勤管理系統delphi源碼(64M)
delphi超市管理系統源碼(16M)
VB-商業源碼
新世某ERP5.0升級版源碼(796M)
MIS管理信息系統源碼(583M)
醫藥衛生管理系統源碼(60M)
制造業ERP系統源碼(125M)
專賣店POS系統源碼(36M)
售房管理系統源碼(89M)
用某u850源碼(9M)
易某點歌系統源碼(18M)
醫院系統源碼(202M)
醫藥管理GSP源碼(36M)
新開某酒店系統源碼(29M)
網吧管理系統源碼(15M)
太平某信息管理系統源碼(33M)
金算某財務及企業管理軟件源碼(134M)
教師住房管理系統源碼(12M)
惠某ERP系統源碼(442M)
報業廣告發行管理系統源碼(42M)
寶某售飯系統源碼(15M)
新世某ERP5.0完全版源碼(399M)
宛某書社圖書管理系統源碼(9M)
VB+SQL開發銀行模擬系統(167M)
VB超巿管理系統(11M)
材料目錄軟件(10M)
進銷存軟件(13M)
全球通商務管理系統——POS管理系統(另一版本)(75M)
四季青污水處理廠系統(62M)
網吧管理系統服務器客戶端源程序(另一版本)(15M)
住房公積金監管系統(46M)
郵件管理與群發系統(30M)
學生信息管理系統(5M)
通用文檔一體化檔案管理系統(127M)
升瑞售樓管理系統(60M)
設計系統2000(報表設計與管理系統)(12M)
人力資源管理系統(28M)
網絡營銷軟件(25M)
某企業物資管理信息系統(14M)
某計算機網絡管理系統VB(74M)
財務系統源碼(70M)
路橋收費系統VB(702M)
大型企業內部管理系統(228M)
伯樂人力資源管理系統2000(161M)
北京市區綠化隔離地區信息系統2000(34M)
學生信息管理系統v1.0(附源碼)(5M)
馨香物業管理糸統(13M)
新版圖書綜合管理系統(6M)
審核管理系統-完整版(35M)
華成酒店管理系統(10M)
大型商業ERP系統2-財務系統部分(65M)
超市銷售管理系統(5M)
賓館桑拿休閑中心管理系統(30M)
賓館客房管理系統(6M)
vb酒店管理系統(10M)
VB物流管理系統源碼(11M)
計劃生育管理系統(56M)
vb和Mapx開發的房屋測繪系統GIS商業源碼(10M)
鄉鎮供電所電費處理系統(14M)
VB人事工資管理系統(27M)
VB財務軟件源碼(19M)
VC-商業源碼
網絡聽診管理監控系統源碼(1540M)
速某(c++)MRPII系統源碼(320M)
貿易網站登陸器源碼(60M)
工廠自動化生產整合管理系統源碼(233M)
高速公路收費系統源碼(44M)
北京某大賣場公司自主開發首套linux平臺Pos源碼(245M)
酒店餐飲管理系統(21M)
伯克公司生產銷售系統源碼(14M)
企業短信助理源代碼(20M)
一個超完整的醫藥管理系統源碼(59M)
綜合人事管理系統源碼(vc+sql2000)(18M)
綜合人事管理系統源碼(vc+sql2000)(5M)
Hotel酒店管理系統源碼(4M)
POS前臺C++程序源碼(7M)
quakeIII 源碼(26M)
視頻會議系統源碼(50M)
VC客房管理系統源碼(10M)
VC數字圖像模式技術及工程應用源碼(106M)
串口編程調試及雙機互聯源碼(44M)
代碼名稱:Microsoft MS-DOS6.0 完整源代碼(63M)
家族信息管理系統源碼(7M)
酒店管理系統2003(8M)
考勤管理系統源代碼下載(9M)
利用MFC開發的OpenGL開發包(27M)
屏幕轉換成AVI文件的程序源碼(25M)
賽克思書店銷售管理系統源碼(7M)
數字圖像處理源碼(30M)
數字圖像獲取、處理與分析源盤(42M)
圖形圖象類代碼(8M)
用Visual C++開發GIS系統(16M)
游戲編程精粹源碼(36M)
云臺鏡頭控制系統源碼(20M)
智能安防報警系統源碼(37M)
Vc視頻會議源代碼壓縮文件(314M)
VC數字圖像模式技術及工程應用(103M)
vc醫院門診收費系統(5M)
互聯天下im(95M)
某公司VC視頻核心代碼(35M)
視頻會議開發代碼(259M)
視頻監控(55M)
視音頻代碼(35M)
用Visual C++開發GIS系統(15M)
真正的速達源碼(CB5可編譯)(54M)
IM企業即時通訊軟件源代碼(18M)
賓館酒店管理系統源碼(25M)
可視電話軟件源碼(16M)
商品采購管理系統vc源碼(25M)
網絡視頻會議系統vc源碼(41M)
.NET-商業源碼
和某大型ERP系統源碼(510M)
商務管理教學源碼(28M)
C#寫的網上汽修汽配管理系統(52M)
企業公文管理信息系統(87M)
教材管理中心(3M)
商務之星(ASP.NET)(618M)
物流系統Logistics(v1.0)(217M)
若冰.net遠程教育系統(18M)
asp.net+c#的人事系統(2M)
Coffice協同辦公管理系統(C#)(176M)
NET的bbs論壇源碼(6M)
OA辦公自動化系統源碼(21M)
嘉惠藥品進銷存管理系統(vb.net)(55M)
企業內部信息交流系統源碼(9M)
若冰企業商務平臺.net(31M)
數據結構動畫演示系統(c#)DataStructure(8M)
醫院管理系統ASP.NET+MSSQL(9M)
中鐵五局Mis系統原型設計(9M)
住房公積金管理中ASP.NET+MSSQL(5M)
房地產信息網(c#.net+sql)(6M)
net網上購書系統(11M)
NET藥品進銷存系統(5M)
net采購倉庫核銷管理系統(6M)
net計算機基礎考試系統(10M)
net精品OA(91M)
net客戶關系管理系統(6M)
net企業客戶服務系統(5M)
net企業銷售管理信息系統(8M)
net汽車銷售公司ERP進銷存系統(38M)
net圖書館管理系統(11M)
net學生寢室管理系統(12M)
net真正的全動態報表(5M)
net自定義報表(16M)
vb.net 銷售管理系統(5M)
vbnet進銷存系統源碼(6M)
多層架構的大型.NET OA 系統(16M)
客戶關系管理系統(8M)
某公司CRM管理系統 net(29M)
三甲醫院管理系統HIS(C#版)(27M)
局域網考試系統C#(9M)
進出倉管理系統(17M)
Asp.Net用友華表(V5.1)制作自定義報表(16M)
Asp.net通用OA系統源代碼(12M)
C#酒店管理系統(20M)
PowerOA辦公自動化系統商業源碼(15M)
餐飲管理系統(C#源碼)(32M)
公司客戶關系管理系統CRM ASP.NET源碼(27M)
機械制造業信息管理系統源碼(21M)
C#某櫥柜銷售企業ERP管理系統(16M)
公司的業務管理系統(15M)
商業進銷管理系統(47M)
公路運輸管理系統asp.net(30M)
汽車銷售公司ERP進銷存系統(39M)
現代教務管理系統源碼(25M)
藥店管理系統(33M)
餐飲管理系統源碼(10M)
智能辦公系統(14M)
JAVA-商業源碼
大型企業JAVA的ERP源碼(193M)
可樂吧在線游戲最新服務器端及部分源代碼源碼(18M)
華某物業管理系統源碼-JSP源碼(97M)
華某物業管理系統安裝程序源碼(43M)
樂趣大型購物系統源碼(7M)
Java做的WebMail源碼(9M)
JAVA進銷存源碼(60M)
哈工大CERP系統源碼(17M)
JSP開發的項目跟蹤系統源碼(11M)
季風進銷存管理系統1.1(JSP版)源碼(4M)
java框架開源訂銷管理系統MYSQL(6M)
條形碼商品管理信息系統源碼(12M)
信用卡管理系統源碼(4M)
學生課績管理系統(5M)
工作流管理系統openwfe源碼(38M)
開源網上會議系統iula-0.1.0 java(5M)
java 學生管理系統(全部代碼+數據庫)(5M)
java超市購物系統(9M)
java網上oa辦公系統原碼(5M)
JAVA寫的個人博客源碼(8M)
java陽光酒店管理系統(14M)
投票管理系統java(16M)
寵物銷售管理系統 java(11M)
網站在線客服系統(Jsp+MySql)(19M)
企富商貿網 java(12M)
商城之家JSP商城企業版v6.8(15M)
石大在線財務管理系統(含源碼)java(5M)
AWT圖形設計源代碼(9M)
iText可以制作中文PDF文件的JAVA源程序(5M)
Java+sqlserver2000做的員工管理系統(5M)
6JAVA的ICQ系統源碼(7M)
Java開發的網絡辦公系統(33M)
Java設計源碼(25M)
Java做的WebMail(9M)
雇員管理系統源碼(5M)
酒店管理系統(16M)
員工管理系統(8M)
CRM客戶管理系統源代碼(12M)
J2EE項目源碼DigitalCampus數字校園(17M)
JAVA網上商城項目完整源碼(10M)
Java實現圖書館管理系統源碼(13M)
Java寫的ERP系統(30M)
java大型企業DRP分銷系統源碼(11M)
CRM項目java源碼(10M)
JBuilder固定資產管理系統java項目源碼(12M)
基于J2EE三層結構設計ERP源碼(12M)
..............
<!-- 配置方法級別的校驗 -->
<interceptor-ref name="validation">
<param name="excludeMethods">input,back,cancel,browse</param>
<param name="validateAnnotatedMethodOnly">true</param>
</interceptor-ref>
所以action中的這四個方法不需要驗證
// 保存
@Validations(
requiredStrings = {
@RequiredStringValidator(fieldName = "admin.username", message = "用戶名不允許為空!"),
@RequiredStringValidator(fieldName = "admin.password", message = "密碼不允許為空!"),
@RequiredStringValidator(fieldName = "admin.email", message = "E-mail不允許為空!")
},
requiredFields = {
@RequiredFieldValidator(fieldName = "admin.isAccountEnabled", message = "是否啟用不允許為空!")
},
stringLengthFields = {
@StringLengthFieldValidator(fieldName = "admin.username", minLength = "2", maxLength = "20", message = "用戶名長度必須在${minLength}到${maxLength}之間!"),
@StringLengthFieldValidator(fieldName = "admin.password", minLength = "4", maxLength = "20", message = "密碼長度必須在${minLength}到${maxLength}之間!")
},
emails = {
@EmailValidator(fieldName = "admin.email", message = "E-mail格式錯誤!")
},
regexFields = {
@RegexFieldValidator(fieldName = "admin.username", expression = "^[0-9a-z_A-Z\u4e00-\u9fa5]+$", message = "用戶名只允許包含中文、英文、數字和下劃線!")
}
)
public class DBHelp<T> {
private static String driver;
private static String url;
private static String username;
private static String password;
private static BasicDataSource dataSource;
static{
Properties properties = new Properties();
try {
//讀取到src目錄中存放的db.properties配置文件
properties.load(DBHelp.class.getClassLoader().getResourceAsStream("db.properties"));
driver = properties.getProperty("driver");
url = properties.getProperty("url");
username = properties.getProperty("username");
password = properties.getProperty("password");
} catch (IOException e) {
e.printStackTrace();
}
dataSource = new BasicDataSource();
dataSource.setDriverClassName(driver);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
dataSource.setInitialSize(5);
dataSource.setMaxWait(5000);
dataSource.setMaxActive(20);
dataSource.setMinIdle(10);
}
public Connection getConnection(){
try {
Connection conn = dataSource.getConnection();
return conn;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
public List<T> executeForList(RowMapper<T> rowMapper,String sql) {
Connection conn = null;
PreparedStatement stat = null;
ResultSet rs = null;
List<T> list = new ArrayList<T>();
try {
conn = getConnection();
stat = conn.prepareStatement(sql);
rs = stat.executeQuery();
while(rs.next()) {
list.add(rowMapper.mapperRow(rs));
}
System.out.println("SQL"+sql);
} catch (SQLException e) {
e.printStackTrace();
}finally{
close(rs, stat, conn);
}
return list;
}
public List<T> executeForList(String sql,RowMapper<T> rowMapper,Object... args) {
Connection conn = null;
PreparedStatement stat = null;
ResultSet rs = null;
List<T> list = new ArrayList<T>();
try {
conn = getConnection();
stat = conn.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
stat.setObject(i+1,args[i]);
}
rs = stat.executeQuery();
while(rs.next()) {
list.add(rowMapper.mapperRow(rs));
}
System.out.println("SQL"+sql);
} catch (SQLException e) {
e.printStackTrace();
}finally{
close(rs, stat, conn);
}
return list;
}
public T executeForObject(String sql,RowMapper<T> rowMapper,Object... args) {
Connection conn = null;
PreparedStatement stat = null;
ResultSet rs = null;
T obj = null;
try {
conn = getConnection();
stat = conn.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
stat.setObject(i+1, args[i]);
}
rs = stat.executeQuery();
if(rs.next()) {
obj = rowMapper.mapperRow(rs);
}
System.out.println("SQL"+sql);
} catch (SQLException e) {
e.printStackTrace();
}finally{
close(rs, stat, conn);
}
return obj;
}
public int executeForCount(String sql,Object... args){
Connection conn = null;
PreparedStatement stat = null;
ResultSet rs = null;
int count = 0;
try {
conn = getConnection();
stat = conn.prepareStatement(sql);
rs = stat.executeQuery();
for(int i = 0;i < args.length;i++){
stat.setObject(i+1, args[i]);
}
if(rs.next()) {
count = rs.getInt(1);
}
System.out.println("SQL"+sql);
} catch (SQLException e) {
e.printStackTrace();
}finally{
close(rs, stat, conn);
}
return count;
}
public void executeUpdate(String sql,Object... args) {
Connection conn = null;
PreparedStatement stat = null;
try {
conn = getConnection();
stat = conn.prepareStatement(sql);
for(int i = 0;i < args.length;i++){
stat.setObject(i+1, args[i]);
}
stat.executeUpdate();
System.out.println("SQL"+sql);
} catch (SQLException e) {
e.printStackTrace();
}finally{
close(stat,conn);
}
}
public void close(PreparedStatement stat,Connection conn) {
close(null,stat,conn);
}
public void close(ResultSet rs,PreparedStatement stat,Connection conn) {
try {
if(rs != null){
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
if(stat != null) {
stat.close();
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
if(conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
public interface RowMapper<T> {
public T mapperRow(ResultSet rs) throws SQLException;
}
public class TourDao {
private DBHelp<Tour> db = new DBHelp<Tour>();
public Tour findByName(String name){
String sql = "SELECT id,tourname FROM t_tour WHERE tourname=?";
Tour t = db.executeForObject(sql, new TourRowMapper(), name);
return t;
}
public void insertSale(String name){
String sql = "INSERT INTO t_tour (tourname) VALUE(?)";
db.executeUpdate(sql, name);
}
public class TourRowMapper implements RowMapper<Tour>{
public Tour mapperRow(ResultSet rs) throws SQLException {
Tour t = new Tour();
t.setId(rs.getInt("id"));
t.setTourname(rs.getString("tourname"));
return t;
}
}
}
備忘錄(Memento)模式又稱標記(Token)模式。GOF給備忘錄模式的定義為:在不破壞封裝性的前提下,捕獲一個對象的內部狀態,并在該對象之外保存這個狀態。這樣以后就可將該對象恢復到原先保存的狀態。
其實單就實現保存一個對象在某一時刻的狀態的功能,還是很簡單的——將對象中要保存的屬性放到一個專門管理備份的對象中,需要的時候則調用約定好的方法將備份的屬性放回到原來的對象中去。
備忘錄模式的組成部分:
1) 備忘錄(Memento)角色:備忘錄角色存儲“備忘發起角色”的內部狀態。“備忘發起角色”根據需要決定備忘錄角色存儲“備忘發起角色”的哪些內部狀 態。為了防止“備忘發起角色”以外的其他對象訪問備忘錄。備忘錄實際上有兩個接口,“備忘錄管理者角色”只能看到備忘錄提供的窄接口——對于備忘錄角色中 存放的屬性是不可見的。“備忘發起角色”則能夠看到一個寬接口——能夠得到自己放入備忘錄角色中屬性。
2) 備忘發起(Originator)角色:“備忘發起角色”創建一個備忘錄,用以記錄當前時刻它的內部狀態。在需要時使用備忘錄恢復內部狀態。
3) 備忘錄管理者(Caretaker)角色:負責保存好備忘錄。不能對備忘錄的內容進行操作或檢查。
使用備忘錄模式的前提:
1) 必須保存一個對象在某一個時刻的(部分)狀態, 這樣以后需要時它才能恢復到先前的狀態。
2) 如果一個用接口來讓其它對象直接得到這些狀態,將會暴露對象的實現細節并破壞對象的封裝性。
例子如下:
//存儲信息類
public class Caretaker {
private Memento memento;
public Memento getMemento(){
return this.memento;
}
public void setMemento(Memento memento){
this.memento = memento;
}
}
//備忘錄模式
public class Memento {
private String state;
public Memento(String state) {
this.state = state;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
}
public class Originator {
private String state;
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public Memento createMemento() {
return new Memento(state);
}
public void setMemento(Memento memento) {
state = memento.getState();
}
public void showState(){
System.out.println(state);
}
}
測試類:
public class Test {
public static void main(String[] args) {
Originator org = new Originator();
org.setState("開會中");
org.showState();//顯示
System.out.println("---------------");
Caretaker ctk = new Caretaker();
ctk.setMemento(org.createMemento());//將數據封裝在Caretaker
System.out.println("---------------");
org.setState("睡覺中");
org.showState();//顯示
System.out.println("---------------");
org.setMemento(ctk.getMemento());//將Caretaker中的數據重新導入
org.showState();
System.out.println("---------------");
}
}
Java深入到一定程度,就不可避免的碰到設計模式這一概念,了解設計模式,將使自己對java中的接口或抽象類應用有更深的理解.設計模式在java的 中型系統中應用廣泛,遵循一定的編程模式,才能使自己的代碼便于理解,易于交流,Mediator(中介者模式)模式是比較常用的一個模式.
Mediator中介者模式,當多個對象彼此間都有聯系的時候,我們就可以應用Mediator將對象間的多對多關系轉換為一對多的關系,這樣做,可以使各個對象間的耦合松散。統一管理對象間的交互。但也可能使得Mediator對象成為一個系統中的龐然大物,難以維護
使用場景:集中負責維護對象模型的關系完整性 以及需要 封裝對象間交互方式的時候.
其實MVC中的controller就是一種Mediator,是UI層 和后端應用sevice層間的中介者。中介者將交互的復雜性變為中介者的復雜性
例子如下:
業務類的接口:
public interface Colleague {
void action();
}
業務類的2個實現類:
public class ColleagueA implements Colleague{
@Override
public void action() {
System.out.println("普通員工努力工作aaaaaaa");
}
}
public class ColleagueB implements Colleague{
@Override
public void action() {
System.out.println("前臺注意了bbbb");
}
}
中介者接口:
public interface Mediator {
void notice(String content);
}
public class ConcreteMediator implements Mediator{
private ColleagueA ca;
private ColleagueB cb;
public ConcreteMediator() {
ca = new ColleagueA();
cb = new ColleagueB();
}
public void notice(String content) {
if (content.equals("boss")) {
//老板來了, 通知員工A
ca.action();
}
if (content.equals("client")) {
//客戶來了, 通知前臺B
cb.action();
}
}
}
測試類:
public class Test {
public static void main(String[] args) {
Mediator med = new ConcreteMediator();
//老板來了
med.notice("boss");
//客戶來了
med.notice("client");
}
}
當客戶端傳過來的字符串不一樣時,中介者類根據字符串實現不同的業務類的對象,處理數據。
function getClickScale(event, target, isShowInfo) {
var imageWidth = target.width;
var imageHeight = target.height;
var eventX = event.xy[0];
var eventY = event.xy[1];
var scalex = eventX / imageWidth;
var scaley = eventY / imageHeight;
var info = '';
info += 'image (' + imageWidth + ', ' + imageHeight + '), ';
info += 'click (' + eventX + ', ' + eventY + '), ';
info += 'scale (' + scalex + ', ' + scaley + ')';
if (typeof (isShowInfo) != 'undefined' && isShowInfo) {
alert(info);
}
return {
scalex : scalex,
scaley : scaley
};
}
Ext.get('main-navigator-image').on(
'mousemove',
function(event, target, obj) {
var scale = getClickScale(event, target);
target.style.cursor = '';
for ( var i = 0; i < areas.length; i++) {
var area = areas[i];
if (isInRect(scale.scalex, scale.scaley,
area.p1.scalex, area.p1.scaley,
area.p2.scalex, area.p2.scaley)) {
target.style.cursor = 'pointer';
break;
}
}
});
});