工大在线

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1481|回复: 3
打印 上一主题 下一主题

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

[复制链接]

2

主题

0

好友

9

积分

书生

Rank: 2

该用户从未签到

西工币
190 枚
好评度
0 点
声望
7 点
注册时间
2009-3-23
帖子
5
积分
9
UID
21363
跳转到指定楼层
1#
发表于 2009-3-25 09:32:16 |只看该作者 |倒序浏览
分享 经典实例——摘自易学设计模式
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

0

主题

0

好友

1

积分

书生

Rank: 2

该用户从未签到

西工币
10 枚
好评度
0 点
声望
0 点
注册时间
2009-3-25
帖子
1
积分
1
UID
21396
2#
发表于 2009-3-26 11:29:06 |只看该作者
★★★一点Java都不会,没有关系,这里教你技巧★★★
13.2.1  制作一个按钮
制作一个按钮很容易,只要创建一个JButton类对象即可。JButton类的构造函数有以下几个。
        public JButton():创建不带文本也不带图标的按钮,或称为空按钮,通常这样的按钮需要调用其他方法来设置文本或图标。空按钮没有意义,用户不知道这样的组件有什么作用。
        public JButton(Icon icon):创建带图标的按钮,图标对按钮的作用有一定的指导意义,如在制作工具栏时就是使用带图标的按钮实现的。如在word中的工具栏如图13.3所示。

图13.3  word中的图标按钮
        public JButton(String text):创建带文本的按钮,如我们在使用软件时经常遇到的“确认”按钮、“取消”按钮等。
        public JButton(String text,Icon icon):创建带有文本且带有图标的按钮。
        JButton自己拥有一个窗口,一旦屏幕更新如放大窗口时,JButton组件就会自动重绘。用户需要做的只是把这些按钮创建出来,并放在一个容器中。代码13-3给出一个例子,在窗口中添加三个按钮,分别是带文本、带图标、带文本和图标的按钮。
代码13-3  制作按钮组件
1        import javax.swing.*;
2        import java.awt.*;
3        public class ButtonTest extends JFrame{
4        public ButtonTest(){
5        JButton b1 = new JButton("Button1");                                        //制作带文本的按钮
6        JButton b2 = new JButton("Linux",new ImageIcon("linux.gif"));        //制作带文本和图标的按钮
7        JButton b3 = new JButton(new ImageIcon("win.gif"));                //制作只带图标的按钮
8        Container cp = getContentPane();                                                //获得当前窗口对象的容器
9        cp.setLayout(new FlowLayout());                                //设置容器的布局管理器,流布局管理器
10        //向容器上添加按钮,这些按钮组件按照从左到右、从上到下的顺序摆放组件。
11        cp.add(b1);
12        cp.add(b2);
13        cp.add(b3);
14        }
15        public static void main(String[] args){
16        //创建类ButtonTest对象该类是JFrame的子类,所以用其类JFrame的引用指向子类的对象
17                JFrame frame = new ButtonTest();
18         frame.setTitle("ButtonTest!!!");         //设置当前窗口的标题
19        frame.setSize(500,100);         //设置窗口显示尺寸
20                frame.show();        //显示调用show()方法,以在屏幕上显示该窗口。
21        }
22 };
程序的运行结果如图13.4所示。

图13.4  制作按钮
注意:这里用到布局管理器的概念,布局管理器就是告诉容器该如何摆放在该容器上的组件。如FlowLayout,BorderLayout等。这里使用了FlowLayout其作用是放置在容器上的组件是从左到又,从上到下排列的。一旦窗口变化,如放大或缩小比例,这些组件的位置由布局管理器管理,布局管理器根据窗口的大小和组件的数量、大小按次序排列。
本段文字摘自 机械工业出版社 《java完全自学手册》
图书销售网址  china-pub  http://www.china-pub.com/195054&ref=ps
当当         
http://product.dangdang.com/product.aspx?product_id=20443591
卓越         
http://www.amazon.cn/mn/detailAp ... r=13-1&uid=168-

图书精彩正文下载  http://www.yinghuochong.com/disk/353360.htm
                  http://www.yinghuochong.com/disk/353361.htm
                  http://www.yinghuochong.com/disk/353364.htm
技术讨论网        www.rzchina.cn
回复

使用道具 举报

0

主题

0

好友

2

积分

书生

Rank: 2

该用户从未签到

西工币
60 枚
好评度
0 点
声望
0 点
注册时间
2009-3-22
帖子
2
积分
2
UID
21321
3#
发表于 2009-3-26 16:37:03 |只看该作者
回复

使用道具 举报

0

主题

0

好友

2

积分

书生

Rank: 2

该用户从未签到

西工币
60 枚
好评度
0 点
声望
0 点
注册时间
2009-3-22
帖子
2
积分
2
UID
21321
4#
发表于 2009-3-26 16:37:23 |只看该作者
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

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

GMT+8, 2025-7-20 20:46 , Processed in 0.142426 second(s), 24 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部