工大在线

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1752|回复: 4
打印 上一主题 下一主题

[原创] 分享 经典实例——摘自易学设计模式

[复制链接]

2

主题

0

好友

9

积分

书生

Rank: 2

该用户从未签到

西工币
190 枚
好评度
0 点
声望
7 点
注册时间
2009-3-23
帖子
5
积分
9
UID
21363
跳转到指定楼层
1#
发表于 2009-3-23 18:45:02 |只看该作者 |倒序浏览
分享 经典实例——摘自易学设计模式
1.1  小巩的疑惑
小巩大学刚毕业,就进入了某软件公司做程序员,经过3个月的Java培训后,被分配到了大拿这个项目组,大拿是公司的技术架构师,水平很高。大拿的项目组目前正在给一家企业做人事软件,小巩被安排来进行薪资程序的一小部分开发。
小巩早就想一显身手了,还没有接到大拿的设计文档,就粗略看了一下需求文档,开始设计开发了。因为这家企业有很多子公司,所以小巩进行了如下设计,首先抽象一个薪资类,然后所有的子公司薪资类都继承这个抽象的薪资类。抽象薪资类的示意代码如下:
//******* Salary.java**************
package com.gongdan;
public interface Salary {
    void computerSalary ();
}
河北子公司的薪资类示意代码如下:
//******* HeBeiSalary.java**************
package com.gongdan;
public class HeBeiSalary implements Salary {
    public void computerSalary() {
        System.out.println("开始计算河北子公司的薪资");
    }
}
吉林子公司的薪资类示意代码如下:
//******* JiLinSalary.java**************
package com.gongdan;
public class JiLinSalary implements Salary {
    public void computerSalary() {
        System.out.println("开始计算吉林子公司的薪资");
    }
}
这样当客户端调用的时候,首先判断是哪个子公司,然后再new一个薪资类的对象就可以了,客户端调用的示意代码如下:
//******* Client.java**************
package com.gongdan;
public class Client {
    /*根据参数创建不同的对象*/
public Salary createSalary (String name) {
                Salary salary = null;
                if ("HeBei".equals(name))
            salary = new HeBeiSalary();
         else if ("JiLin".equals(name))
                        salary = new JiLinSalary();
         return salary;
}
/*具体的薪资计算*/
public void  computerSalary (String name) {
                Salary salary = createSalary(name);
                salary. computerSalary();
}
}
小巩很快就完成了设计,看到自己设计的薪资类,小巩心里很高兴,但同时又有了疑问:“那就是听说这家公司很快要兼并很多公司,这样一来,它就有了很多的子公司,那客户端的条件判断岂不是也要写很多?代码也肯定越写越长了。”
刚想到这里,大拿的设计方案就送过来了,小巩一看,茅塞顿开:“原来可以这样设计啊,高手就是高手。”
大拿是这样来设计的:首先也是一个抽象的薪资类,然后子公司的薪资类都继承这个抽象的薪资类,这点和小巩设计的一样,但是大拿这里又多设计了一个工厂类,把具体产生薪资类的判断语言抽取到工厂类里,并且使用了Java的反射机制,而客户端则只负责具体的薪资计算。这样一来类的职责也清晰了,而且由于使用了Java的反射机制,代码也变少了。
抽象薪资类的示意代码如下:
//******* Salary.java**************
package com.gongdan;
public interface Salary {
    void computerSalary ();
}
河北子公司的薪资类示意代码如下:
//******* HeBeiSalary.java**************
package com.gongdan;
public class HeBeiSalary implements Salary {
    public void computerSalary() {
        System.out.println("开始计算河北子公司的薪资");
    }
}
吉林子公司的薪资类示意代码如下:
//******* JiLinSalary.java**************
package com.gongdan;
public class JiLinSalary implements Salary {
    public void computerSalary() {
        System.out.println("开始计算吉林子公司的薪资");
    }
}
产生薪资类对象的工厂类示意代码如下:
//******* SampleFactory.java**************
package com.gongdan;
public class SampleFactory {
    /*根据参数创建不同的对象*/
public static Salary createSalary (String name) {
                Class c = Class.forName(name);
                Salary salary = (Salary)c.newInstance();
                return salary;
    }
}
这样客户端只负责具体的薪资计算而不需要判断要创建哪个子公司的薪资类了,客户端调用的示意代码如下:
//******* Client.java**************
package com.gongdan;
public class Client {
/*具体的薪资计算*/
public void  computerSalary (String name) {
                Salary salary = SampleFactory.createSalary(name);
                salary. computerSalary();
}
}
说明:上述只是示意代码,实际的薪资计算程序要比这复杂。
小巩看完大拿的设计,心里自愧不如,马上问大拿:“大拿,你是如何思考才这样设计的啊?”
大拿说:“其实没什么,这是参考设计模式里面的简单工厂模式,随着设计经验的积累,你也会慢慢设计出好的程序的,你先找些设计模式的书籍看看吧。”
更多精彩样章下载 http://www.yinghuochong.com/disk/338374.htm
分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏0 顶!~顶!~0 扔鸡蛋~扔鸡蛋~0
您需要登录后才可以回帖 登录 | 注册

手机版|xatubbs.com ( 苏ICP备11050183号 )

GMT+8, 2025-7-6 20:10 , Processed in 0.137642 second(s), 24 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部