导航:首页 > 编程语言 > 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与模式源码相关的资料

热点内容
RPG游戏解压后乱码 浏览:986
无线通信的几个密钥算法 浏览: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
命令行参考 浏览:281
怎么初步认识编程 浏览:208
为什么程序员都喜欢谷歌 浏览:891