`
wuxiaozeng2440
  • 浏览: 27136 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

初看设计

 
阅读更多
<div class="iteye-blog-content-contain" style="font-size: 14px"></div>
实现简单的用户登录功能。
首先设计用户类:User.java
public class User {
private Long id;
private String loginName;
private String password;
public User(String loginName;,String password){
this.loginName; = loginName;;
this.password = password;
}
//相应的get/set方法
………
}

先假设数据层我们用Hibernate,然后设计用户查询类:UserDaoHibernate.java
public class UserDaoHibernate {
	User findByLoginName(String loginName){
	...
}
}

因为业务简单,我们在次省略业务层,
数据层代码完成后,我们就可以在客户端UserLoginAction.java中使用它了。
public class UserLoginAction{
	public static void main(String[] args){
        UserDaoHibernate userDaoHibernate = new UserDaoHibernate();
    	userDaoHibernate.findByLoginName(loginName));

}
}

可是,现在如果数据层不用hibernate,要改用iBATIS,又该如何实现呢?如果只是实现一个UserDaoIbatis.java类,这个不难,但是所有使用过UserDaoHibernate.java的类,都要修改,并且得重新编译和测试,有违背设计的开闭原则,所以,以上的设计是糟糕的。于是我们开始重构。

第一步:面向接口编程,设计用户持久化类的接口UserDao.java
public interface UserDao {
User findByLoginName(String loginName);
}

具体的持久化来必须要继承UserDao接口,于是就有
public class UserDaoHibernate implements UserDao{
	User findByLoginName(String loginName){
	...
}
}

UserDaoIbatis.java的实现代码和上面的UserDaoHibernate基本相同,只是具体方法不一样。
客户端UserLoginAction.java的代码就应该如下修改:
UserDao userDao = new UserDaoHibernate();
userDao.findByLoginName(loginName));

这就是利用了java的多态机制。如果要改用iBATIS,UserLoginAction.java的代码仍然需要改。如何解决客户端对象依赖具体实现类的问题呢?

第二步:工厂模式
我们使用一个工厂类来实现userDao对象的创建,这样客户端只要知道这一个工厂类就可以了,不用依赖任何具体的UserDao实现。创建userDao对象的工厂类UserDaoFactory代码如下:
public class UserDaoFactory {
public static UserDao createUserDao(){
return new UserDaoHibernate();
}
}

客户端UserLoginAction.java代码片断如下:
UserDao userDao = UserDaoFactory.createUserDao();
userDao.findByLoginName(loginName));

现在如果要改用iBATIS,我们唯一要修改的只是一个UserDaoFactory类。但这还是不完美的,因为这还是需要代码,代码的修改就意味着重新编译、打包、部署甚至引入新的Bug,所以,这还是不够优雅的。至少在我们消除修改带来的硬编码之前是不够优雅的。

第三步:依赖倒转
Spring的IoC容器完美的解决了这个问题。使用IoC容器,类UserLoginAction.java不用主动创建UserDao实现类的实例。由IoC容器主动创建UserDao实现类的实例,并注入到UserLoginAction类中。下面将使用Spring提供的IoC容器来管理我们的UserLoginAction类。
用户注册类UserLoginAction的部分代码如下:
public class UserLoginAction{
private UserDao userDao = null;
//由容器注入的实例对象
public void setUserDao(UserDao userDao){
this.userDao = userDao;
}
public static void main(String[] args){
userDao.findByLoginName(loginName));
}
}

UserDao的实例由Spring容器主动为它创建。Spring提供了配置文件来组装我们的组件。Spring的配置文件applicationContext.xml代码片断如下:
<bean id="userDao" class="com...UserDaoHibernate"/>

分享到:
评论

相关推荐

    房地产景观方案及扩初设计任务书模板.pdf

    根据提供的文件信息,文件标题是“房地产景观方案及扩初设计任务书模板.pdf”,描述中也仅仅是重复了标题内容,标签为“资料”。文件内容包含了大量看似随机的数字和字母组合,看起来像是通过OCR(光学字符识别)...

    基于生活,强化自主——评《人工智能初体验》教学设计.pdf

    以上内容综合来看,《人工智能初体验》的教学设计充分体现了以学生为中心,强调自主学习和知识应用的现代教育理念。通过将生活实际、教学目标、创新的教学方法、教师角色的转变相结合,形成了一套系统的、有效的教学...

    自考《版面设计》试题解析

    1. **早期版面设计技术**:15世纪初,欧洲开始采用木块雕刻技术,在宗教题材的绘画上压印文字,这是早期版面设计技术的应用之一。 2. **现代设计理论的开创者**:威廉·莫里斯被公认为现代设计理论的开创者之一,他...

    设计之道 张逸

    张逸 目 录 设计,看上去很美 设计,由你掌握 重构初体验 从企业的运行价值链说起 使用极限编程改善项目的设计和灵活性 从实例谈OOP、工厂模式和重构 从实例谈Adapter 模式 从...

    FPGA的设计经验,是个人的心得体会

    设计之初,明确模块的时序关系和接口信号尤为重要,这有助于后续设计阶段避免因时序问题导致的返工。一级模块与二级模块之间的接口信号应有详细的时序波形描述,确保即使在详细设计阶段需要调整时序,其影响也仅限于...

    江南大学食品工厂设计复习题.pdf

    24. 食品工厂设计一般分为:二阶段设计和三阶段设计,二阶段设计指的是扩初设计和施工图设计,三阶段设计包括初步设计、技术设计、施工设计。 25. 扩初设计文件的主要内容包括:设计说明书、附件和总概述。 26. ...

    AI芯片的产品设计与安全设计.pdf

    在AI芯片产品设计方面,算丰AI芯片的设计初心主要体现在以下几个方面: 1. 提供低功耗、高算力的硬件支持,以满足不同应用场景的需求。算丰AI芯片高算力、大带宽、强劲的视频编解码能力,支持多核心运算,主控能力...

    通用设计法则

    任何一个读者都可以通过这本书看懂设计的门道,培养出判断“好设计、好物件、好视觉如何好”的眼光与能力。 自2003年初版以来,受到全世界三十多个国家近百万读者的信赖。这是十年来首次更新的版本,对第一版的内容...

    电子设计发展趋势——开源PCB设计.pdf

    例如,基于开源布局的电源模块设计,初看起来可能运行良好,但在后续的测试阶段可能会发现没有经过全面测试以满足特定规范或要求,例如电磁干扰(EMI)的问题。 尽管存在这些挑战,开源PCB设计同样提供了一个全新的...

    常见的防水装置设计,毕业设计常用.rar

    这个名为"常见的防水装置设计,毕业设计常用.rar"的压缩包文件,很可能是为即将毕业的学生或初入行业的工程师提供的一份参考资料,包含了设计图、CAD图纸和三维模型,帮助他们理解和掌握防水装置的设计原理和实践...

    两级OTA或Cascode OTA设计

    从内容提要来看,本文设计了一个基于1.2µm 5V CMOS工艺的OTA电路,详细列举了包括电源电压、工作温度、负载电阻、直流增益、单位增益带宽、相位裕度、系统失调电压、输入共模范围、输出摆幅、共模抑制比、功耗等一...

    恒流源设计软件

    恒流源设计软件是一款专为硬件电路设计师打造的实用工具,无论是资深的行业专家还是初入行的新手,都能从中受益。恒流源在电子电路设计中扮演着至关重要的角色,因为它能确保电流在一定范围内稳定输出,不受电压变化...

    框架设计原则

    为了更好地理解上述设计原则在实际中的应用,我们可以看看Dubbo框架是如何实施这些原则的。Dubbo采用了高度模块化的设计,每个模块都有清晰的职责边界,并且遵循了上述提到的各项设计原则。例如,Dubbo在设计时充分...

    菜鸟初入FPGA之状态机的设计

    例如,组合逻辑输出可能会使输出向量产生毛刺,并且从速度角度来看,状态机的输出向量必须通过译码状态向量得到,这就加大了从状态向量到输出向量的延时。另外,组合输出消耗一部分时钟周期,增加了下一个模块的输入...

    中外设计师必看十大经典网站.docx

    【中外设计师必看十大经典网站】对于任何想要在设计领域提升自己的设计师来说,了解和学习这些网站的内容至关重要。以下是对这些网站的详细说明: 1. 青年设计论坛...

    设计模式精解-GoF 23种设计模式解析

    学习设计模式的过程可能会让人感到痛苦,尤其是在初读GoF的经典著作《设计模式:可复用面向对象软件的基础》时,面对大量抽象的概念和术语可能会感到困惑。然而,随着实践经验的积累,你会发现设计模式的强大之处,...

    《信息及其特征》教学设计

    《信息及其特征》教学设计作为“高中信息技术基础课程”的第一章第一节,具有着开启整章和高中信息技术基础必修课程的意义。...另外,初看教学内容,也很难渗透过程、方法、情感等方面的教学目标。

    入门设计师必读书籍精选.docx

    这些书籍为初入设计行业的设计师提供了宝贵的指导,涵盖了简约设计、设计理念、设计历史以及设计心理学等多个方面。 1. 《简约至上》 - 科尔伯恩 - 该书强调追求简单易用是设计的核心,通过合理删除、分层组织、...

Global site tag (gtag.js) - Google Analytics