導航:首頁 > 編程語言 > java與模式源碼

java與模式源碼

發布時間:2023-04-17 08:25:02

java源碼中應用哪些設計模式

3種工廠模式 單例模式 策略模式 用的都很多 其實實際開發中用的最多的還是工廠和單例,其餘的根本沒用過。

⑵ GitHub上面有哪些經典的java框架源碼

⑶ 求個JAVA 人力資源管理系統 源代碼和模版界面以及需求分析,求參考

星原人力資源管理系統 結構如下,

產品說明: 人力資源規劃 組織管理 招聘管理 人力測評
人事管理
培訓管理
考勤管理
薪酬福利

績效管理
行政事務
員工關系 人力分析和輔助決策

文控管理 工作流
領導查詢和員工自助查詢
SA8000人權驗廠方案

系統概覽

一、人力資源規劃
◇通過企業發展階段設置,設定適應各發展期的人力資源管理政策;

◇適應年度培訓計劃體系、三級培訓體系、崗位培訓體系、ISO管理培訓體系;
◇自動生成培訓到課與缺課統計,對比崗位任職與培訓需求,為晉升與上崗提供依據;
◇針對ISO體系驗證,為繁雜的培訓記錄及文檔管理提供自動生成核對功能,防止漏訓或資料的不一致;
◇自定義培訓費用項目;
◇提供培訓需求調查表,統一管理培訓教材,簡化教材的不致性與版本混亂;
◇可直接在系統中製作培訓通知單;
◇提供培訓心得報告;
◇提供培訓效果調查表,統一考核管理,加強培訓效果,評估成本效益;
◇能對個人、部門的培訓成績及效果進行分析,並輸出各種分析報表;
◇簡化培訓操作;
◇培訓規劃可根據用戶需要直接轉入到培訓安排中。

返回頂端

二、組織管理
1、組織機構管理

◇提供對集團公司組織管理的支持,自定義組織層級,不限組織層次;
◇對不同時期的組織職能變更進行動態管理;
◇能夠導出樹狀和矩狀的組織架構圖;
◇可以進行部門合並、部門升降,並有歷史記錄記載。
2、崗位管理

◇可以對崗位層級關系進行管理,通過設立崗位層次、級別、職系、職類、職位進行人力分析與規劃,建立組織架構與權責體系;
◇可以對不同時期的崗位職責進行管理,並有歷史記錄記載;
◇可以建立在職級、職務、職類體繫上的工作分析、含職位工作說明、職務任職資格、
◇工作量評估、權責體系、工作流分析、工資結構與權重、薪點數等管理職能表格;並有歷史記錄記載;
◇可以對不同時期的崗位任職資格進行管理,並有歷史記錄記載;
◇可以對內容進行管理,並有歷史記錄記載;
◇可設計該崗位的職業發展通道,使員工在此崗位上有很好的前景展望;
◇可設計該崗位的不同時期的績效考評指標(KPI),並有歷史記錄記載;
◇可以進行崗位的升遷、降級處理,並有歷史記錄記載;
◇對不同崗位市場成本調查,按崗位制度公司薪酬體系,對各崗位的評估上限與下限值,根據任職資格與個人資料評估薪酬;
◇通過崗位職責分類,控制直接與間接人員數量與成本比例,使管理成本更合理。
3、年度編制計劃與編制管理

◇可對各年度各部門崗位進行人員編制管理;
◇與人力資源規劃、招聘模塊關聯,自動產生招聘申請需求及招聘標准;
◇按既定編制招聘人手,判斷是否超編。
◇支持各種計劃性、臨時性、租賃、外包等多種用工招聘模式;
◇按人力資源規劃確定各組織人員需求層次,按崗位分析與任職要求制定測評指標;
◇參照人力資源規劃需求、組織架構與崗位編制制定出相應的招聘計劃;
◇制定對內招聘與晉升計劃,激發員工學習與工作能力;
◇按組織規劃確認面試者薪酬結構與標准;
◇參照組織管理中崗位規劃屬性,結合當前人事檔案的年齡、藉貫、性別、學歷等統計分析報表,確定招聘申請人員標准;
◇記錄招聘渠道信息,及相關廣告、費用等;
◇招聘關鍵環節的申報審批功能;
◇從招聘計劃開始對每個關鍵環節詳細跟蹤,實現動態信息記載;
◇對應聘人員從填寫應聘簡歷到面試、測評錄用進行全程跟蹤記載;
◇把應聘人員轉入到人事檔案中並設置此人的狀態,很好的與人事檔案結合到一起;
◇內部儲備人才和外部儲備人才進行分別管理;
◇對一段時間內各部門人員需求單的分類統計;
◇對已審批的部門需求單直接轉入到招聘安排中;
◇面試通知單可直接在系統中通過郵件的形式發送給面試者;
◇提供通用的報表形式,如錄用通知單,招聘通知單等;
◇可直接從系統中生成招聘發布信息,也可直接把招聘需求發送給人才市場;
◇對招聘渠道、招聘成功率、留任率、人均成本等招聘結果進行綜合全面的分析;
◇對未審批的招聘計劃、已審批的招聘計劃、未審批的人員需求單、已審批的人力需求單及時提醒用戶;
◇可與人力測評結合使用,對應聘人員的各方面素質進行測試記載。
返回頂端

三、招聘管理
◇支持各種計劃性、臨時性、租賃、外包等多種用工招聘模式;
◇按人力資源規劃確定各組織人員需求層次,按崗位分析與任職要求制定測評指標;
◇參照人力資源規劃需求、組織架構與崗位編制制定出相應的招聘計劃;
◇制定對內招聘與晉升計劃,激發員工學習與工作能力;
◇按組織規劃確認面試者薪酬結構與標准;
◇參照組織管理中崗位規劃屬性,結合當前人事檔案的年齡、藉貫、性別、學歷等統計分析報表,確定招聘申請人員標准;
◇記錄招聘渠道信息,及相關廣告、費用等;
◇招聘關鍵環節的申報審批功能;
◇從招聘計劃開始對每個關鍵環節詳細跟蹤,實現動態信息記載;
◇對應聘人員從填寫應聘簡歷到面試、測評錄用進行全程跟蹤記載;
◇把應聘人員轉入到人事檔案中並設置此人的狀態,很好的與人事檔案結合到一起;
◇內部儲備人才和外部儲備人才進行分別管理;
◇對一段時間內各部門人員需求單的分類統計;
◇對已審批的部門需求單直接轉入到招聘安排中;
◇面試通知單可直接在系統中通過郵件的形式發送給面試者;
◇提供通用的報表形式,如錄用通知單,招聘通知單等;
◇可直接從系統中生成招聘發布信息,也可直接把招聘需求發送給人才市場;
◇對招聘渠道、招聘成功率、留任率、人均成本等招聘結果進行綜合全面的分析;
◇對未審批的招聘計劃、已審批的招聘計劃、未審批的人員需求單、已審批的人力需求單及時提醒用戶;
◇可與人力測評結合使用,對應聘人員的各方面素質進行測試記載。
返回頂端

四、人力評測
◇系統支持各種測試模式,自定義測評類別與試題,例如通過導入一般職業適合性測驗、心理測試、領導測評類測評試題或工具,對任職指標、智力、語言能力、算術、書寫知覺、空間判斷能力、形狀知覺、協同動作、運動速度、手指靈活度、手靈活度、領導類型、能力、職業興趣、個性,LPC領導有效性測評、領導與部屬關系測量、工作結構測量、職位權力測量等各項指標進行測評;
◇可按測評職位、標准任職資格指標庫等自動推薦測評方案、項目、權重等;
◇ 提供測評方式維護;
◇可利用電腦進行人力在線測評,方便控制時間與測評效果;
◇人力測評登記;
◇人力測評查詢;
◇ 崗位匹配性分析;
◇情景測試:公文處理測試等;
◇對應各測試類別的測試的方法與題目:所有試題給出總分值、測試目標與功能,合格分、勝任分、優秀分值及否決項;
◇測評項目與職位指標相對應部份自動對比,計算匹配度;
◇ 按各測試項的測試目標、總分值、實得分值,自動分析出各項優秀、合格、不合格層次及總層次;
◇測評結果可以用不同方式查詢與設計報表。
返回頂端

五、人事管理
◇提供身份證識別設備供驗證身份證真偽,同時將身份證相片及姓名、號碼、住址等自動讀入系統,減少輸入錯誤、提高效率,自動判斷年齡等合法性;
◇預先統計時間點在職、離職等各種人員狀態,為生產計劃、招聘計劃提供依據;
◇提供員工狀態管理,了解各類員工比例;
◇通過各種統計報表了解人員各種比例,分析可能存在的同籍貫風險、年齡或學歷不合理等,為招聘與調配提供依據;
◇通過統計流失率及離職原因分析,查找人員流失率主因,為行政工作決策提供依據;
◇對個人檔案管理增加了對個人的技能檔案管理、計生檔案管理、崗位職責查詢;
◇自動統計員工學習、工作、培訓、考核、異動、加薪履歷,對比組織管理崗位規劃,作為晉升、調動、加薪等依據;
◇個人職業生涯規劃;
◇個人離職記錄查詢,對有多次離職記錄人員進行記載跟蹤;
◇人事檔案中人事動態跟蹤,用戶可自定義人員狀態,並記載各狀態下的發生信息。比如可定義離職申請狀態、離職已審批狀態、已離職狀態;
◇人事黑名單管理,對在公司犯有重大錯誤的人納入到黑名單中,系統提醒是否錄用。
返回頂端

六、培訓管理
◇適應年度培訓計劃體系、三級培訓體系、崗位培訓體系、ISO管理培訓體系;
◇自動生成培訓到課與缺課統計,對比崗位任職與培訓需求,為晉升與上崗提供依據;
◇針對ISO體系驗證,為繁雜的培訓記錄及文檔管理提供自動生成核對功能,防止漏訓或資料的不一致;
◇自定義培訓費用項目;
◇提供培訓需求調查表,統一管理培訓教材,簡化教材的不致性與版本混亂;
◇可直接在系統中製作培訓通知單;
◇提供培訓心得報告;
◇提供培訓效果調查表,統一考核管理,加強培訓效果,評估成本效益;
◇能對個人、部門的培訓成績及效果進行分析,並輸出各種分析報表;
◇簡化培訓操作;
◇培訓規劃可根據用戶需要直接轉入到培訓安排中。
返回頂端

七、考勤管理
◇豐富的參數設置,適應不同企業班制特殊性;
◇提供了與多種型號IC卡、條碼、指紋考勤機數據介面;
◇能處理頻繁倒班、調班、停工待料、中途請假等靈活的出勤管理;
◇能處理臨時加班,周末加班、節假日加班、班前、班中、班後加班以及通宵加班等各種加班的管理;可根據最大加班管控指標預警,並通過各種加班報表分析加班的必要性,以控制加班成本;與門禁系統結合可規范員工行為,培養員工良好的工作習慣與優秀的公司文化;
◇能處理跨72小時連班作業(跨兩天);
◇可根據各項加班最大加班管控指標預警,並通過各種加班報表顯示;
◇分析加班的必要性,以控制加班成本與防範違反法規,分析產值加班負荷率;
◇自定義各種假期,如事假、病假、工傷假、調休、年假、累計假等有薪、無薪、半薪假的管理可處理存假自動與請假抵消,各種復雜的調休等;
◇能輸出各種請假單、加班單、排班表、班製作休時間;
◇能輸出並查詢年、月、日及任意時間段任意部門人的出勤情況報表、異常出勤表並進行各種匯總分析;
◇運用了自動找班和多種靈活排班技術,極大地減輕了考勤人員工作量;
◇運用了先進的考勤演算法,處理5000人一個月的考勤報表只需3-5分鍾,提高了考勤管理的時效性及管理效率,高度開放的二次開發平台,可最大程度調整考勤項目與計算方法;
◇系統支持多用戶和網路,通過嚴格的許可權控制技術、使得考勤日常管理(分散和集中)做到隨心所欲,實時控制;
◇自定義各類遲到、早退、曠工、加班超時等異常查詢邏輯顯示顏色,一目瞭然、處理快捷
◇自定義簽卡控制次數,簽卡顯示以顏色區分;
◇可定義入職或離職當天是否計出勤;
◇提供海量數據處理機制,解決大型企業歷史數據累積導致系統性能下降問題;
◇考勤與門禁系統結合分析上班期間外出情況,可規范員工出勤行為;
◇考勤與消費系統結合,使上班時間與就餐時間對應,公司可以視情況確定是否補貼與是否允許就餐;
◇提醒機制:系統提供默認遲到、早退、曠工、超時加班等提醒功能,同時提供自定義提醒項目需求;
◇安全機制:提供加班、請假、簽卡、調休、考勤結果審核功能,防止生效後結果被人為更改或因制度改變重算影響歷史數據;
◇考勤項目直接匯入工資計算,考勤、工資、消費數據整合;
◇自定義各種考勤明細、匯總報表,加班、缺勤、異常等報表;
◇支持集團性多套帳或驗廠用到的多帳套演算法。
返回頂端

八、薪酬福利管理
◇可對薪資項目進行分類管理,如:崗位工資、福利、獎金,實現用戶自定義設定和自定義計算,適應各種薪資體系與工資計算方式經常變動;
◇解決了一個月多次調薪的計算難題;
◇可按薪資等級或薪點數根據崗位進行設置,並可設定多個調薪方案;
◇支持多個薪酬體系,不同組織、崗位、職級不同的薪資方案的計算方法,可根據崗位設計標准成本與實際薪資對比,部門預算與實際薪資對比;
◇每個月可計算多個帳套;
◇各帳套可支持不同財務周期演算法;
◇支持非自然月為財務周期的工資計算方式,財務周期起止日期可支持自定義;
◇帳套間可共用每月錄入數據及介面數據;
◇薪資計算可從考勤、績效導入數據;
◇支持銀行報盤,所得稅計算與申報;
◇豐富的薪酬福利報表;
◇支持借款扣除;
◇支持自離或曠工多日自動薪資凍結,也支持手動凍結與解凍;
◇對於其客觀存在系統的數據完全共享,如計件工資、考勤、考評、獎懲、水電費、就餐資產等數據與本系統實現了無縫聯接,實時調用,只要一次錄入,不用重復錄入或轉換。
返回頂端

九、績效管理
◇系統支持自定義考核模型或工具:排名表、面談表、組織考核表、KPI、MBO、360度;
◇績效參數設置:包括績效指標庫管理,績效指標可以根據職位績效指標引入績效考評指標,並可在此基礎上進行自定義其它指標庫;
◇績效層次設置:每個績效層次有相應的績效變數及職位;
◇在支持量化指標考核同時,也支持關鍵工作事項等不能量化的考核項目考核與跟蹤;
◇績效考評級別管理,根據績效考評級別可以進行多層次、多方位的考評,可以更准確的了解考評者的績效狀況,考評級別依賴於考評分類,每個考評級別所需要的考評級別及每個級別所佔的比重是不一樣的;
◇績效考評模板管理,個人績效考評表及組織績效考評表可在績效考評模板基礎上生成;
◇組織績效考評包括引入組織、定義考評分類及考評要點、製作考評表,查看考核信息;
◇個人績效考評根據個人所在的考評層次及考評周期設置考評分類及考評要點,並根據每個考評級別製作考評表,最後根據每個考評級別及考評周期生成綜合考評信息;
◇系統支持自定義考評工具及相關考評表格式;
◇按考評分值與權重自動統計考核結果,自動比對標桿;
◇自動提醒針對考核不合格的培訓項目;
◇自動對比各期考核結果,跟蹤考核項目改善狀況;
◇支持對考核者直接評分;
◇支持領導多級點評、修正、審核;
◇考核結果自動應用於晉升、調職、薪資計算、培訓等相關功能模塊,起到預警提醒作用;
◇考核結果查詢支持:絕對分值比較、相對標准比較、客觀標准比較;
◇支持排序法,代表人物法、強制正態分布法(預先設定優良中及格差比例)統計方法;
◇支持績效考核結果申訴,設定提交、受理、處理、結案周期;
◇考核結果可以通過自定義演算法,直接應用於薪酬,異動等子系統。
返回頂端

十、行政事務管理
1、會議管理

系統通過對會議室及物品配套、會議室安排排程、會議參會人員與時間核算會議成本。通過會議申請,提前規范會議內容以 提高會議效率,避免管理中的文山會海;同時,提高會議記錄管理,對會議決議跟蹤,避免會議流於形式,每次會議決議、跟進責任人、進度、結案做自動跟蹤,管 理者通過系統查詢,跟進工作,保證決議得以執行。

通過會議管理系統,避免諸多企業會而不議、議而不決、決而不行、行而不果的會議怪圈與高昂的會議成本。

2、工傷管理

工傷管理,通過對工傷等級劃分,確認各級別對應處理預案。對單個工傷案例每一個社保步驟進度跟蹤記錄,同時保持對應的文件。可隨時產生所有工傷案例進度表,員工離職是可避免工傷未結案帶來的風險。

3、宿舍管理

◇對宿舍基本資料、床位床號的設置;
◇可隨時查詢各宿舍的入住情況及空床位;可自定義按部門,班組等自動建議床位分配;
◇對各宿舍進行物品配置及管理;
◇對住宿安排、變更、退宿進行全面管理;
◇對外宿人員的登記管理;
◇對宿舍水電費價格的設定,水電表的登記、水電費用等的登記、計算;
◇水電等費用的分攤;相關費用與薪資系統的鏈接,並可直接從工資中扣除;
◇宿舍日常的維修維護、物品租賃的登記管理等。
4、圖書管理

用於企業內部文化室(或圖書館)的計算機化管理。可對所有圖書、報刊、雜志、傳記、專業資料書籍等進行分類登記;對內部員工的借閱、歸還進行跟蹤管理;對破損、遺失、賠償等進行登記跟蹤管理。

5、資產管理

對人力資源部門通常管理的辦公用品、工衣等物品進行分類編碼;對辦公用品的購進、 分發、領用、歸還、賠償等進行登記跟蹤管理;對庫存物品可進行盤點操作;對所有數據的分類分析等。與員工離職相關聯,保證先退保管資產,後辦離職發工資的 手續。在規定時間內重復領用系統自動提示。可核算人均辦公費用等管理指標。

6、保險管理

管理企業內部的各類福利保險;自定義保險險種、員工、企業的繳費記錄、明細分攤;處理員工參保,停保操作,與系統的工資等其它功能模塊相關聯進行匯總和查詢分析。

7、醫療管理

記錄員工入職時及各次體檢記錄,對在企業內部葯品的分發、使用、回收、醫葯費進行管理;對醫療服務的過程進行跟蹤記錄;對醫療服務的類型、費用等進行分類、分析等。

8、車輛管理

規范企業的公務用車管理。從申請、批復等環節對公務用車進行有效的管控;對外出路線、逗留時間、維修保養、路橋費、油費等進行有效有據的跟蹤記錄,從而達到降低費用,提高效用的目的。

返回頂端

十一、員工關系
◇對相關法律法規條款重要性與內容案例解讀,可能風險性預估;
◇明確公司規章各項條款與對應措施,量化必要的指標,更好貫徹各項規章;
◇公司公告的發布、公示與保管等,協助達到制度、公告的最大公示性;
◇法律法規、公司規章、公司公告明確責任到相關執行與保管人員,量化必要數據,保留原始憑據體系,以降低公司人力資源風險;
◇需求調查與處理、員工建議、文娛管理,結合公司理念,協助公司文化建設,提高員工滿意度,加強公司員工凝聚力;
◇職代會管理、工會管理:建立公司各種會議架構,明確職責。並對公司相關制度決議討論,對接國家對企業工會、職代會制度要求,有利公司和諧經營,從文化上降低經營風險與推行企業文化理念;
◇員工跟蹤:對員工計劃事項進行跟進,防止工作漏失;
◇離職員工訪談與跟蹤,針對離職原因切實改善管理;
◇合同管理:可對新員工自動產生合同,進行分類型管理,明確各類合同法定事項,保存各類相關原始文本與變更記錄,合同外約定附件等;
◇提供合同批次管理可按簽訂日期分合同批次,避免每日續簽合同,也防止漏簽或遲簽;
◇工傷管理:提供各工傷案的原始文件,處理步驟流程與進度維護。對各種工種鑒定級別做相應的理培事項;
◇證件管理:對各種證件的有無與有效期管理,自動提醒;
◇體檢管理:關注員工健康,對各工種員工按法規或公司制度進行體檢管理。按周期要求自動提醒需求;
◇文娛管理:對公司文娛計劃與執行,相關經費預算與實際應用進行管理;
◇◇對企業內部公告、通知、新聞消息等的登記、發布、跟蹤、反饋等進行分類管理與分析;
◇總經理信箱:在公司內部架設一個上下級之間可以快速、直接的溝通渠道。可對信息進行分類管理,並有保密措施。
返回頂端
十二、人力分析和輔助決策
◇包括人力成本分析、組織績效分析、合理化建議分析、薪資實驗分析、薪資分布分析;
◇自定義和輸出多種報表和圖表,靈活生成和輸出各種多維統計報表,分析人力資源的組成、成本和效益,發掘和預測人力資源的發展趨勢;
◇系統內置分析型數據倉庫,提供在線實時(OLAP)數據統計分析功能;
◇人員供給分析(根據生產情況及現有人員分析);
◇勞動生產率分析。
返回頂端

十三、文檔辦工流管理
◇支持文檔櫃管理,保證電子文檔與紙質文檔保管台帳對應,方便查找;
◇支持文件多級審批與會簽;
◇支持文件分類管理,內置常用法律法規、公司制度、通知通告等類別;
◇支持其它子系統調用相關文件;
◇可制定各類別文件對應不同審批流程、管控流程;
◇支持文件號、文件多版本管理;
◇通過文檔收發記錄,實時查詢文件起草、審批、公布、收發、保管履歷;
◇支持文件集中備份。
返回頂端
十四、工作流
◇支持針對不同單據而不同職位自定義工作流程;
◇支持自動提醒當前各類需要審批工作流單據;
◇支持工作流程許可權公式定義,例如每個職位可審批的請假天數;
◇支持多人會簽;
◇支持前後審批人員審批意見是否可見;
◇支持離崗期間指定職位替代,替代時可以按流程指定多人替代,是否可查看本人以前單據審批記錄
返回頂端
十五、領導查詢和員工自助查詢
◇XY-WEB星原人力資源查詢系統,採用完全的B/S結構,提高軟體的可維護性和可擴充性;
◇提供使用戶進行二次開發的通用模塊,用戶可以方便地擴展軟體的功能;
◇提供統一友好的操作界面和豐富的數據管理分析功能;
◇為企業的信息發布交流提供人性化的操作平台,使企業的規章制度、新聞簡報、技術交流、公告事項等及時傳播,使企業員工能及時了解企業發展動態;
◇改變傳統的集中辦公方式,擴大辦公區域,企業用戶可在家中、城市各地甚至世界各個角落通過網路連接隨時辦公;
◇系統地利用企業積累的信息資源,改進企業的創新能力和快速響應能力,以提高效率;
◇對客戶端機器的硬體要求較低,可以在保留原有的軟體和硬體的基礎上運行新的應用系統,不影響原有資源;
◇基於WEB方式的辦公系統只需在伺服器上作配置和維護,大大降低了用戶用於軟體系統維護和升級的難度及費用,使系統更加容易實施。
返回頂端

十六、SA8000人權驗廠方案
人權驗廠主要是政府部門、歐美客戶檢查企業執行勞動法的情況,主要表現在員工是否有超時加班和符合當地最低工資標准以及保險福利、安全保護情況。其核心就是人事、考勤和薪酬福利部分。
主持驗廠的對象及特點:

◇政府部門(勞動、稅務、海關)查廠:除了考勤和工資部門要調整外,人數、身份證和保險也應為關注調整重點。企業與政府保持良好的關系也是重要因素; ◇歐美客戶直接驗廠:由於不熟悉大陸情況比較容易應對;
◇客戶委託第三方驗廠:專業從事驗廠工作,對我國情況了如指掌,最難應對,既要符合標准,又要處理好關系。
驗廠的應對方式:
普遍採用的是針對不同的驗廠對象設立多套賬和多套制度,不同的方式,費用和效果差別很大。傳統手工和紙卡考勤方式 工作量大、費用高主要表現在處理考勤和工資項目以及對員工培訓的項目上。為了避免在處理人事考勤工資多套賬時耗用大量的人力和物力,我公司結合近千家工廠 一卡通驗廠實施經驗,總結了多套一卡通驗廠實施方案。

⑷ 求用JAVA編寫俄羅斯方塊游戲的源代碼

俄羅斯方塊——java源代碼提供 import java.awt.*; import java.awt.event.*; //俄羅斯方塊類 public class ERS_Block extends Frame{ public static boolean isPlay=false; public static int level=1,score=0; public static TextField scoreField,levelField; public static MyTimer timer; GameCanvas gameScr; public static void main(String[] argus){ ERS_Block ers = new ERS_Block("俄羅斯方塊游戲 V1.0 Author:Vincent"); WindowListener win_listener = new WinListener(); ers.addWindowListener(win_listener); } //俄羅斯方塊類的構造方法 ERS_Block(String title){ super(title); setSize(600,480); setLayout(new GridLayout(1,2)); gameScr = new GameCanvas(); gameScr.addKeyListener(gameScr); timer = new MyTimer(gameScr); timer.setDaemon(true); timer.start(); timer.suspend(); add(gameScr); Panel rightScr = new Panel(); rightScr.setLayout(new GridLayout(2,1,0,30)); rightScr.setSize(120,500); add(rightScr); //右邊信息窗體的布局 MyPanel infoScr = new MyPanel(); infoScr.setLayout(new GridLayout(4,1,0,5)); infoScr.setSize(120,300); rightScr.add(infoScr); //定義標簽和初始值 Label scorep = new Label("分數:",Label.LEFT); Label levelp = new Label("級數:",Label.LEFT); scoreField = new TextField(8); levelField = new TextField(8); scoreField.setEditable(false); levelField.setEditable(false); infoScr.add(scorep); infoScr.add(scoreField); infoScr.add(levelp); infoScr.add(levelField); scorep.setSize(new Dimension(20,60)); scoreField.setSize(new Dimension(20,60)); levelp.setSize(new Dimension(20,60)); levelField.setSize(new Dimension(20,60)); scoreField.setText("0"); levelField.setText("1"); //右邊控制按鈕窗體的布局 MyPanel controlScr = new MyPanel(); controlScr.setLayout(new GridLayout(5,1,0,5)); rightScr.add(controlScr); //定義按鈕play Button play_b = new Button("開始游戲"); play_b.setSize(new Dimension(50,200)); play_b.addActionListener(new Command(Command.button_play,gameScr)); //定義按鈕Level UP Button level_up_b = new Button("提高級數"); level_up_b.setSize(new Dimension(50,200)); level_up_b.addActionListener(new Command(Command.button_levelup,gameScr)); //定義按鈕Level Down Button level_down_b =new Button("降低級數"); level_down_b.setSize(new Dimension(50,200)); level_down_b.addActionListener(new Command(Command.button_leveldown,gameScr)); //定義按鈕Level Pause Button pause_b =new Button("游戲暫停"); pause_b.setSize(new Dimension(50,200)); pause_b.addActionListener(new Command(Command.button_pause,gameScr)); //定義按鈕Quit Button quit_b = new Button("退出遊戲"); quit_b.setSize(new Dimension(50,200)); quit_b.addActionListener(new Command(Command.button_quit,gameScr)); controlScr.add(play_b); controlScr.add(level_up_b); controlScr.add(level_down_b); controlScr.add(pause_b); controlScr.add(quit_b); setVisible(true); gameScr.requestFocus(); } } //重寫MyPanel類,使Panel的四周留空間 class MyPanel extends Panel{ public Insets getInsets(){ return new Insets(30,50,30,50); } } //游戲畫布類 class GameCanvas extends Canvas implements KeyListener{ final int unitSize = 30; //小方塊邊長 int rowNum; //正方格的行數 int columnNum; //正方格的列數 int maxAllowRowNum; //允許有多少行未削 int blockInitRow; //新出現塊的起始行坐標 int blockInitCol; //新出現塊的起始列坐標 int [][] scrArr; //屏幕數組 Block b; //對方快的引用 //畫布類的構造方法 GameCanvas(){ rowNum = 15; columnNum = 10; maxAllowRowNum = rowNum - 2; b = new Block(this); blockInitRow = rowNum - 1; blockInitCol = columnNum/2 - 2; scrArr = new int [32][32]; } //初始化屏幕,並將屏幕數組清零的方法 void initScr(){ for(int i=0;i<rowNum;i++) for (int j=0; j<columnNum;j++) scrArr[j]=0; b.reset(); repaint(); } //重新刷新畫布方法 public void paint(Graphics g){ for(int i = 0; i < rowNum; i++) for(int j = 0; j < columnNum; j++) drawUnit(i,j,scrArr[j]); } //畫方塊的方法 public void drawUnit(int row,int col,int type){ scrArr[row][col] = type; Graphics g = getGraphics(); tch(type){ //表示畫方快的方法 case 0: g.setColor(Color.black);break; //以背景為顏色畫 case 1: g.setColor(Color.blue);break; //畫正在下落的方塊 case 2: g.setColor(Color.magenta);break; //畫已經落下的方法 } g.fill3DRect(col*unitSize,getSize().height-(row+1)*unitSize,unitSize,unitSize,true); g.dispose(); } public Block getBlock(){ return b; //返回block實例的引用 } //返回屏幕數組中(row,col)位置的屬性值 public int getScrArrXY(int row,int col){ if (row < 0 || row >= rowNum || col < 0 || col >= columnNum) return(-1); else return(scrArr[row][col]); } //返回新塊的初始行坐標方法 public int getInitRow(){ return(blockInitRow); //返回新塊的初始行坐標 } //返回新塊的初始列坐標方法 public int getInitCol(){ return(blockInitCol); //返回新塊的初始列坐標 } //滿行刪除方法 void deleteFullLine(){ int full_line_num = 0; int k = 0; for (int i=0;i<rowNum;i++){ boolean isfull = true; L1:for(int j=0;j<columnNum;j++) if(scrArr[j] == 0){ k++; isfull = false; break L1; } if(isfull) full_line_num++; if(k!=0 && k-1!=i && !isfull) for(int j = 0; j < columnNum; j++){ if (scrArr[j] == 0) drawUnit(k-1,j,0); else drawUnit(k-1,j,2); scrArr[k-1][j] = scrArr[j]; } } for(int i = k-1 ;i < rowNum; i++){ for(int j = 0; j < columnNum; j++){ drawUnit(i,j,0); scrArr[j]=0; } } ERS_Block.score += full_line_num; ERS_Block.scoreField.setText(""+ERS_Block.score); } //判斷游戲是否結束方法 boolean isGameEnd(){ for (int col = 0 ; col <columnNum; col ++){ if(scrArr[maxAllowRowNum][col] !=0) return true; } return false; } public void keyTyped(KeyEvent e){ } public void keyReleased(KeyEvent e){ } //處理鍵盤輸入的方法 public void keyPressed(KeyEvent e){ if(!ERS_Block.isPlay) return; tch(e.getKeyCode()){ case KeyEvent.VK_DOWN:b.fallDown();break; case KeyEvent.VK_LEFT:b.leftMove();break; case KeyEvent.VK_RIGHT:b.rightMove();break; case KeyEvent.VK_SPACE:b.leftTurn();break; } } } //處理控制類 class Command implements ActionListener{ static final int button_play = 1; //給按鈕分配編號 static final int button_levelup = 2; static final int button_leveldown = 3; static final int button_quit = 4; static final int button_pause = 5; static boolean pause_resume = true; int curButton; //當前按鈕 GameCanvas scr; //控制按鈕類的構造方法 Command(int button,GameCanvas scr){ curButton = button; this.scr=scr; } //按鈕執行方法 public void actionPerformed (ActionEvent e){ tch(curButton){ case button_play:if(!ERS_Block.isPlay){ scr.initScr(); ERS_Block.isPlay = true; ERS_Block.score = 0; ERS_Block.scoreField.setText("0"); ERS_Block.timer.resume(); } scr.requestFocus(); break; case button_levelup:if(ERS_Block.level < 10){ ERS_Block.level++; ERS_Block.levelField.setText(""+ERS_Block.level); ERS_Block.score = 0; ERS_Block.scoreField.setText(""+ERS_Block.score); } scr.requestFocus(); break; case button_leveldown:if(ERS_Block.level > 1){ ERS_Block.level--; ERS_Block.levelField.setText(""+ERS_Block.level); ERS_Block.score = 0; ERS_Block.scoreField.setText(""+ERS_Block.score); } scr.requestFocus(); break; case button_pause:if(pause_resume){ ERS_Block.timer.suspend(); pause_resume = false; }else{ ERS_Block.timer.resume(); pause_resume = true; } scr.requestFocus(); break; case button_quit:System.exit(0); } } } //方塊類 class Block { static int[][] pattern = { {0x0f00,0x4444,0x0f00,0x4444},//用十六進至表示,本行表示長條四種狀態 {0x04e0,0x0464,0x00e4,0x04c4}, {0x4620,0x6c00,0x4620,0x6c00}, {0x2640,0xc600,0x2640,0xc600}, {0x6220,0x1700,0x2230,0x0740}, {0x6440,0x0e20,0x44c0,0x8e00}, {0x0660,0x0660,0x0660,0x0660} }; int blockType; //塊的模式號(0-6) int turnState; //塊的翻轉狀態(0-3) int blockState; //快的下落狀態 int row,col; //塊在畫布上的坐標 GameCanvas scr; //塊類的構造方法 Block(GameCanvas scr){ this.scr = scr; blockType = (int)(Math.random() * 1000)%7; turnState = (int)(Math.random() * 1000)%4; blockState = 1; row = scr.getInitRow(); col = scr.getInitCol(); } //重新初始化塊,並顯示新塊 public void reset(){ blockType = (int)(Math.random() * 1000)%7; turnState = (int)(Math.random() * 1000)%4; blockState = 1; row = scr.getInitRow(); col = scr.getInitCol(); dispBlock(1); } //實現「塊」翻轉的方法 public void leftTurn(){ if(assertValid(blockType,(turnState + 1)%4,row,col)){ dispBlock(0); turnState = (turnState + 1)%4; dispBlock(1); } } //實現「塊」的左移的方法 public void leftMove(){ if(assertValid(blockType,turnState,row,col-1)){ dispBlock(0); col--; dispBlock(1); } } //實現塊的右移 public void rightMove(){ if(assertValid(blockType,turnState,row,col+1)){ dispBlock(0); col++; dispBlock(1); } } //實現塊落下的操作的方法 public boolean fallDown(){ if(blockState == 2) return(false); if(assertValid(blockType,turnState,row-1,col)){ dispBlock(0); row--; dispBlock(1); return(true); }else{ blockState = 2; dispBlock(2); return(false); } } //判斷是否正確的方法 boolean assertValid(int t,int s,int row,int col){ int k = 0x8000; for(int i = 0; i < 4; i++){ for(int j = 0; j < 4; j++){ if((int)(pattern[t][s]&k) != 0){ int temp = scr.getScrArrXY(row-i,col+j); if (temp<0||temp==2) return false; } k = k >> 1; } } return true; } //同步顯示的方法 public synchronized void dispBlock(int s){ int k = 0x8000; for (int i = 0; i < 4; i++){ for(int j = 0; j < 4; j++){ if(((int)pattern[blockType][turnState]&k) != 0){ scr.drawUnit(row-i,col+j,s); } k=k>>1; } } } } //定時線程 class MyTimer extends Thread{ GameCanvas scr; public MyTimer(GameCanvas scr){ this.scr = scr; } public void run(){ while(true){ try{ sleep((10-ERS_Block.level + 1)*100); } catch(InterruptedException e){} if(!scr.getBlock().fallDown()){ scr.deleteFullLine(); if(scr.isGameEnd()){ ERS_Block.isPlay = false; suspend(); }else scr.getBlock().reset(); } } } } class WinListener extends WindowAdapter{ public void windowClosing (WindowEvent l){ System.exit(0); } } 22

⑸ Java模式設計之單例模式(一)

作為對象的創建模式[GOF ] 單例模式確保某一個類只有一個實例 而且自行實例化並向整個系統提供這個實例 這個類稱為單例類

單例模式的要點

單例單例

顯然單例模式的要點有三個 一是某各類只能有一個實例 二是它必須自行創建這個事例 三是它必須自行向整個系統提供這個實例 在下面的對象圖中 有一個 單例對象 而 客戶甲 客戶乙 和 客戶丙 是單例對象的三個客戶對象 可以看到 所有的客戶對象共享一個單例對象 而且從單例對象到自身的連接線可以看出 單例對象持有對自己的引用

資源管理

一些資源管理器常常設計成單例模式

在計算機系統中 需要管理的資源包括軟體外部資源 譬如每台計算機可以有若干個列印機 但只能有一個Printer Spooler 以避免兩個列印作業同時輸出到列印機中 每台計算機可以有若干傳真卡 但是只應該有一個軟體負責管理傳真卡 以避免出現兩份傳真作業同時傳到傳真卡中的情況 每台計算機可以有若干通信埠 系統應當集中管理這些通信埠 以避免一個通信埠同時被兩個請求同時調用

需要管理的資源包括軟體內部資源 譬如 大多數的軟體都有一個(甚至多個)屬性(properties)文件存放系統配置 這樣的系統應當由一個對象來管理一個屬性文件

需要管理的軟體內部資源也包括譬如負責記錄網站來訪人數的部件 記錄軟體系統內部事件 出錯信息的部件 或是對系統的表現進行檢查的部件等 這些部件都必須集中管理 不可政出多頭

這些資源管理器構件必須只有一個實例 這是其一 它們必須自行初始化 這是其二 允許整個系統訪問自己這是其三 因此 它們都滿足單例模式的條件 是單例模式的應用

一個例子 Windows 回收站

Windows x 以後的視窗系統中都有一個回收站 下圖就顯示了Windows 的回收站

在整個視窗系統中 回收站只能有一個實例 整個系統都使用這個惟一的實例 而且回收站自行提供自己的實例 因此 回收站是單例模式的應用

雙重檢查成例

在本章最後的附錄里研究了雙重檢查成例 雙重檢查成例與單例模式並無直接的關系 但是由於很多C 語言設計師在單例模式裡面使用雙重檢查成例 所以這一做法也被很多Java 設計師所模仿 因此 本書在附錄里提醒讀者 雙重檢查成例在Java 語言里並不能成立 詳情請見本章的附錄

單例模式的結構

單例模式有以下的特點

…… 單例類只可有一個實例

…… 單例類必須自己創建自己這惟一的實例

…… 單例類必須給所有其他對象提供這一實例

雖然單例模式中的單例類被限定只能有一個實例 但是單例模式和單例類可以很容易被推廣到任意且有限多個實例的情況 這時候稱它為多例模式(Multiton Pattern) 和多例類(Multiton Class) 請見 專題 多例(Multiton )模式與多語言支持 一章 單例類的簡略類圖如下所示

由於Java 語言的特點 使得單例模式在Java 語言的實現上有自己的特點 這些特點主要表現在單例類如何將自己實例化上

餓漢式單例類餓漢式單例類是在Java 語言里實現得最為簡便的單例類 下面所示的類圖描述了一個餓漢式單例類的典型實現

從圖中可以看出 此類已經自已將自己實例化

代碼清單 餓漢式單例類

public class EagerSingleton { private static final EagerSingleton m_instance = new EagerSingleton() /** * 私有的默認構造子*/ private EagerSingleton() { } /** * 靜態工廠方法*/ public static EagerSingleton getInstance()

{

Java 與模式return m_instance }

讀者可以看出 在這個類被載入時 靜態變數m_instance 會被初始化 此時類的私有構造子會被調用 這時候 單例類的惟一實例就被創建出來了

Java 語言中單例類的一個最重要的特點是類的構造子是私有的 從而避免外界利用構造子直接創建出任意多的實例 值得指出的是 由於構造子是私有的 因此 此類不能被繼承

懶漢式單例類

與餓漢式單例類相同之處是 類的構造子是私有的 與餓漢式單例類不同的是 懶漢式單例類在第一次被引用時將自己實例化 如果載入器是靜態的 那麼在懶漢式單例類被載入時不會將自己實例化 如下圖所示 類圖中給出了一個典型的餓漢式單例類實現

代碼清單 懶漢式單例類

package javapatterns singleton demos public class LazySingleton { private static LazySingleton m_instance = null /** * 私有的默認構造子 保證外界無法直接實例化*/ private LazySingleton() { } /** * 靜態工廠方法 返還此類的惟一實例*/ synchronized public static LazySingleton getInstance()

{ if (m_instance == null)

{ m_instance = new LazySingleton() } return m_instance }

讀者可能會注意到 在上面給出懶漢式單例類實現里對靜態工廠方法使用了同步化 以處理多線程環境 有些設計師在這里建議使用所謂的 雙重檢查成例 必須指出的是 雙重檢查成例 不可以在Java 語言中使用 不十分熟悉的讀者 可以看看後面給出的小節

同樣 由於構造子是私有的 因此 此類不能被繼承 餓漢式單例類在自己被載入時就將自己實例化 即便載入器是靜態的 在餓漢式單例類被載入時仍會將自己實例化 單從資源利用效率角度來講 這個比懶漢式單例類稍差些

從速度和反應時間角度來講 則比懶漢式單例類稍好些 然而 懶漢式單例類在實例化時 必須處理好在多個線程同時首次引用此類時的訪問限制問題 特別是當單例類作為資源控制器 在實例化時必然涉及資源初始化 而資源初始化很有可能耗費時間 這意味著出現多線程同時首次引用此類的機率變得較大

餓漢式單例類可以在Java 語言內實現 但不易在C++ 內實現 因為靜態初始化在C++ 里沒有固定的順序 因而靜態的m_instance 變數的初始化與類的載入順序沒有保證 可能會出問題 這就是為什麼GoF 在提出單例類的概念時 舉的例子是懶漢式的 他們的書影響之大 以致Java 語言中單例類的例子也大多是懶漢式的 實際上 本書認為餓漢式單例類更符合Java 語言本身的特點

登記式單例類

登記式單例類是GoF 為了克服餓漢式單例類及懶漢式單例類均不可繼承的缺點而設計的 本書把他們的例子翻譯為Java 語言 並將它自己實例化的方式從懶漢式改為餓漢式 只是它的子類實例化的方式只能是懶漢式的 這是無法改變的 如下圖所示是登記式單例類的一個例子 圖中的關系線表明 此類已將自己實例化

代碼清單 登記式單例類

import java util HashMap public class RegSingleton { static private HashMap m_registry = new HashMap() static { RegSingleton x = new RegSingleton() m_registry put( x getClass() getName() x) } /** * 保護的默認構造子*/ protected RegSingleton() {} /** * 靜態工廠方法 返還此類惟一的實例*/ static public RegSingleton getInstance(String name)

{ if (name == null)

{ name = javapatterns singleton demos RegSingleton } if (m_registry get(name) == null)

{ try { m_registry put( name Class forName(name) newInstance() ) } catch(Exception e)

{ System out println( Error happened ) } return (RegSingleton) (m_registry get(name) ) } /** * 一個示意性的商業方法*/ public String about()

{ return Hello I am RegSingleton }它的子類RegSingletonChild 需要父類的幫助才能實例化 下圖所示是登記式單例類子類的一個例子 圖中的關系表明 此類是由父類將子類實例化的

下面是子類的源代碼

代碼清單 登記式單例類的子類

import java util HashMap public class RegSingletonChild extends RegSingleton { public RegSingletonChild() {} /** * 靜態工廠方法*/ static public RegSingletonChild getInstance()

{ return (RegSingletonChild)

RegSingleton getInstance( javapatterns singleton demos RegSingletonChild ) } /** * 一個示意性的商業方法*/ public String about()

{ return Hello I am RegSingletonChild }

在GoF 原始的例子中 並沒有getInstance() 方法 這樣得到子類必須調用的getInstance(String name)方法並傳入子類的名字 因此很不方便 本章在登記式單例類子類的例子里 加入了getInstance() 方法 這樣做的好處是RegSingletonChild 可以通過這個方法 返還自已的實例 而這樣做的缺點是 由於數據類型不同 無法在RegSingleton 提供這樣一個方法 由於子類必須允許父類以構造子調用產生實例 因此 它的構造子必須是公開的 這樣一來 就等於允許了以這樣方式產生實例而不在父類的登記中 這是登記式單例類的一個缺點

lishixin/Article/program/Java/gj/201311/27416

⑹ 求Java程序源代碼,裡面至少包含3個設計模式,不需要特別難,但一定要能運行出來

什麼課題的

⑺ 學習JAVA的同學都是怎麼讀源碼的

剛參加工作那會,沒想過去讀源碼,更沒想過去改框架的源碼;總想著別人的框架應該是完美的、萬能的,應該不需要改;另外即使我改了源碼,怎麼樣讓我的改動生效了?項目中引用的不還是沒改的jar包嗎。回想起來覺得那時候的想法確實挺??

工作了一年多之後准備跳槽了,開始了一輪的面試,其中有幾個面試官就問到了相關的源碼問題:ArrayList、HashMap的底層實現,spring、mybatis的相關源碼。問源碼的面試一般就是回去等消息,然後就沒然後了。

那時候開始意識到,源碼這東西在之前的工作的中感受不到,但是在面試中好像面的還挺頻繁的,從此有意識的開始了jdk部分源碼的閱讀(主要是集合)。一開始看源碼,看的特別糙,知道個大概,知道ArrayList的底層實現是數組,HashMap的底層是散列表(數組+鏈表);更深入一點的擴容、hash碰撞等等就不知道了。

讀spring源碼起於工作中遇到了一個問題(springjdbcTemplate事務,各種詭異,包你醍醐灌頂!),排查一段時間最終是解決了,但過程讓我非常難受,各種上網查資料、各種嘗試,感覺就像大海撈針一樣,遙遙無期。我下定決心,我要看一看spring的源碼,於是我買了一本《spring源碼深度斗帶解析》,結合著這本書、打開著eclipse,開始了spring的源碼閱讀之旅。至此,讀源碼成了習慣,源碼已經進入了我的心裡。

後來,springboot的火熱,讓我也想蹭上一蹭,於是有了springboot的啟動源碼系列,雖然還在進行中,指侍但是我相信我能將其完成;工作中用到了shiro,我又結合著《跟我學shiro》將shiro的源碼看了個大概,有了shiro源碼系列博文,還差一篇認證與授權(應該很快就能面世),shiro源碼系列就封筆了。最近在搭建自己的後台管理系統,用到了quartz,集成的過程也遇到了一些問題,因此有了quartz的兩篇文章。

慢慢的,從一味的網上找資料變成了很多時候會從源碼中找答案。不求能讀太多的源碼,但願自己接觸的技術都能讀上一讀,路漫漫其修遠兮,吾將上下而求索!

大家為什麼要讀源碼?

很多人一定和我一樣的感受:源碼在工作中有用嗎?用處大嗎?很長一段時間內我也有這樣的疑問,認為哪些有事沒事扯源碼的人就是在裝,只是為了提高他們的逼格而已。

那為什麼我還要讀源碼呢?一剛開始為了面試,後來為了解決工作中的問題,再後來就是個人喜好了。說的好聽點是有匠人精神;說的委婉點是好奇(底層是怎麼實現的);說的不自信點是對黑盒的東西我用的沒底,怕用錯;說的簡單直白點是提升自我價值,為了更高的薪資待遇(這里對真正的技術迷說聲抱歉)。

源碼中我們可以學到很多東西,學習別人高效的代碼書寫、學習別人對設計模式的熟練使用、學習別人對整個架構的布局,等等。如果你還能找出其中的不足,那麼恭喜你,你要飛升了!會使用固然重要,但知道為什麼這么使用同樣重要。從模仿中學習,從模仿中創新。

讀源碼不像圍城(外面的人想進來,裡面的人想出去),它是外面的人不想進來,裡面的人不想出去;當我們跨進城內,你會發現(還是城外好,皮!)城內風光無限,源碼的海洋任我們遨遊!

首先我們要對我們的目標有所了解,知道她有什麼特點,有些什麼功能。對對方都還不了解,就想著進入別人的內心世界,那不是臭不要臉嘛,我們要做一個有著流氓心的紳士;對她有個大致的了解了,就可以發起攻勢,一舉拿下。

那麼怎麼樣了解了,方式有很多,我這里提供幾種,僅供參考

最好的方式就是官方參考指南,親生父母往往對孩子是最了解的,對孩子的描述也是最詳細的;比唯銷吵如SpringBootReferenceGuide就是對springboot最詳細的描述,怎麼樣使用springboot、springboot特性等等,通過此指南,springboot在你面前一覽無遺;

但是,springboot畢竟是外國人的孩子,如果英語不好,估計讀起來有點頭疼了,不過我們有google翻譯呀,咬咬牙也是能看的。源碼世界的丈母娘、老岳丈是非常慷慨的!

其次是書籍,國外優秀的有很多,國內也不乏好書,比較推薦此方式,自成體系,讓我們掌握的知識點不至於太散。這就是好比是源碼的閨蜜,對源碼非常了解,重點是挺大方,會盡全力幫助我們了解源碼。

再次就是博客,雖然可能覺得知識點比較散,但是針對某個知識點卻特別的細,對徹底掌握非常有幫助,園子內就有很多技術大牛,寫的博客自然也是非常棒,非常具有學習價值。當然還有社區、論壇、github、碼雲等等。這就是源碼的朋友圈,我們從中也能獲取到非常多關於源碼的信息。

設計模式的了解

優秀的框架、技術從不乏設計模式;jdk源碼中就應用了很多設計模式,比如IO流中的適配器模式與裝飾模式、GUI的觀察者模式、集合中的迭代器模式等等;spring源碼中也是用到了大量的設計模式。設計模式有什麼優點、各適用於什麼場景,不是本文的內容,需要我們大家自行去了解。

我們只需要對一些常用的設計模式有個大致了解,再去讀源碼是比較好的;不需要將23種設計模式都通讀,也不需要將常用設計模式完全理解透;對於全部通讀,我們時間有限,另外有些模式確實不太好理解、用的少,性價比不高,沒必要全部都讀。

推薦書籍:《HeadFirstDesignPatterns》(中文版:《HeadFirst設計模式》)、《Java與模式》;

另外我比較推薦的一種學習設計模式的方式是讀別人博客:java_my_life,劉偉技術博客,chenssy的設計模式;

設計模式之於源碼,就好比逛街購物之於女人,想順利勾搭源碼,我們需要好好掌握設計模式這個套路。

配合ide進行斷點追蹤

我們通過源碼的圈子對源碼的了解終究只是停在表面,終究還是沒有走進她的內心,接下來我就和大家分享下,我是如何走進她的內心的!

相信看過我的源碼博客的小夥伴都知道,我非常喜歡通過idea斷點來進行源碼追蹤,斷點追蹤源碼是我非常推薦的一種方式。斷點不僅可以用來調試我們的代碼,也可以用來調試我們用到的框架源碼。

面對未知的、茫茫多的源碼,我們往往沒有足夠的時間、經歷和耐心去通讀所有源碼,我們只需要去讀我們關注的部分即可(有人可能會說我都不關心,這?)。那為什麼要用斷掉調試的方式來跟源碼,而不是直接從源代碼入手去跟我們關注的部分呢?

嘗試過的小夥伴應該知道,如果我們對源碼不熟悉,直接通過源碼的方式去跟,一方面很容易迷路(多態,會有很多子類實現),不知道接下來跟哪一個,另一方面也很容易跟丟,當我們跟入的很深的時候,很有可能就忘記上一步跟到哪了。所以讀源碼的重要性淺顯易懂了。

⑻ 我編寫的源代碼程序,在命令行模式中,輸入javac命令對源代碼進行編譯,但是生成不了位元組碼文件(class)

javac HelloWorld.java 是執行的相對路徑, 你是在bin目錄下纖如陪執行的,但bin目錄下面沒有HelloWorld.java文件;
1、可以javac E:\test\HelloWorld.java 把全路徑加上
2、配置環境變數, 在path加入 D:\loveyouth\Java\jdk1.7.0.75\bin;然後進入HelloWorld.java所在橡帆文毀蠢件夾中執行javac HelloWorld.java命令

⑼ 如何看java源代碼

在eclipse中查看源文件用 「Ctrl+超找的源文件」 就可以了。 如我要查看String 我按住Ctrl,然後用滑鼠移動到String下面點擊就行了。
如果彈出一個窗口, 說「Source not found ... ... 」
在彈出的窗口上點擊那個按鈕「attach source」,會出來一個窗口讓你選擇jdk源碼包所在的位置,你選擇一下,比如在我機器上是「C:\Program Files\Java\jdk1.6.0_03\src.zip」,你類比著找一下,這樣就可以用「Ctrl+超找的類名「了。

⑽ 求 JAVA 非同步觀察者模式 的源代碼(完整的),不要同步的,好的給加分

package TestObserver;

import java.util.Iterator;
import java.util.Vector;

/**
*
* @author Seastar
*/
interface Observed {

public void addObserver(Observer o);

public void removeObserver(Observer o);

public void update();
}

interface Observer {

public void takeAction();
}

class Invoker {

private Observer o;
Handler handler;

public Invoker(Observer o) {
new Handler();
this.o = o;
}

private class Handler extends Thread {

public Handler() {
handler = this;
}

@Override
public void run() {
o.takeAction();
}
}

public boolean TestSameObserver(Observer o) {
return o == this.o;
}

public void invoke() {
handler.start();
}
}

class ObservedObject implements Observed {

private Vector<Invoker> observerList = new Vector<Invoker>();

public void addObserver(Observer o) {
observerList.add(new Invoker(o));
}

public void removeObserver(Observer o) {
Iterator<Invoker> it = observerList.iterator();
while (it.hasNext()) {
Invoker i = it.next();
if (i.TestSameObserver(o)) {
observerList.remove(i);
break;
}
}
}

public void update() {
for (Invoker i : observerList) {
i.invoke();
}
}
}

class ObserverA implements Observer {

public void takeAction() {
System.out.println("I am Observer A ,state changed ,so i have to do something");
}
}

class ObserverB implements Observer {

public void takeAction() {
System.out.println("I am Observer B ,i was told to do something");
}
}

class ObserverC implements Observer {

public void takeAction() {
System.out.println("I am Observer C ,I just look ,and do nothing");
}
}

public class Main {

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
ObserverA a = new ObserverA();
ObserverB b = new ObserverB();
ObserverC c = new ObserverC();
ObservedObject oo = new ObservedObject();
oo.addObserver(a);
oo.addObserver(b);
oo.addObserver(c);
for (int i = 0; i < 5; ++i) {
oo.addObserver(new Observer() {

public void takeAction() {
System.out.println("我是山寨觀察者"+",誰敢攔我");
}
});
}
//sometime oo changed ,so it calls update and informs all observer
oo.update();
}
}

觀察者模式的精髓在於注冊一個觀察者觀測可能隨時變化的對象,對象變化時就會自動通知觀察者,
這樣在被觀測對象影響范圍廣,可能引起多個類的行為改變時很好用,因為無需修改被觀測對象的代碼就可以增加被觀測對象影響的類,這樣的設計模式使得代碼易於管理和維護,並且減少了出錯幾率

至於非同步機制實際是個噱頭,可以有觀測對象來實現非同步,也可以有觀察者自身實現,這個程序實際是觀測對象實現了非同步機制,方法是在觀察者類外包裝了一層invoker類

閱讀全文

與java與模式源碼相關的資料

熱點內容
直播用哪個app播放背景音樂 瀏覽:848
點歌機系統app在哪裡下載 瀏覽:609
javadate類型轉換string 瀏覽:694
RPG游戲解壓後亂碼 瀏覽:988
無線通信的幾個密鑰演算法 瀏覽:644
王者榮耀app數據修復在哪裡 瀏覽:429
基於單片機飲水機溫度控制系統的設計 瀏覽:455
c中委託被編譯後的結構 瀏覽:152
飛燕app怎麼注銷賬號 瀏覽:895
cad命令縮小 瀏覽:154
linux發展史 瀏覽:629
伺服器選用什麼CPU比較好 瀏覽:334
明星怎麼宣傳安卓 瀏覽:953
8255晶元編程 瀏覽:65
java文件bat運行 瀏覽:747
java常見筆試 瀏覽:529
360程序員模式 瀏覽:363
AQS演算法的查詢樹構造 瀏覽:329
小豬微信營銷源碼 瀏覽:12
阿里雲伺服器能連接列印機嗎 瀏覽:175