java的设计思想
(设计思想,是需要不断领悟的。。。)
一、封装
学java的人都知道这是向对象的编程语言,从字面上理解,就是针对对象的一些操作,将具有某一特性的实体封装成一个类或者是将具有一定功能的方法,抽取出来封装成一个供外面调用的方法,然后通过new这个类或方法生成对象,最后通
过对对象进行操作或者实现相应的功能。如将一个人封装成一个人的类,人有属性:性别,年龄,出生日期,家庭住址等,外界对人进行操作时,只能改变其属性值,但是不能改变属性的种类,这要更安全,而且当对人进行操作时,也是连带属性
一起进行操作,这就是面向对象的编程。
所以java的设计思想一般离不开封装,如做一个项目,首先对项目的每个子系统进行封装,然后对子系统中的每个模块进行封装,最后对每个模块中的每个组件(组件:能完成某一特定功能的方法)进行封装,这里的子系统、模块、组件都是
一个封装体,这样做不仅能使项目做起来更加有条理,更加安全,而且让后面的维护和更改更加方便、简单、易操作。(后面有项目的实例)
二、设计的基本原则
★ 面向接口编程
a、这是Java编程里面大家公认的第一原则。
b、接口很重要的一个功能:封装隔离
c、接口是功能块或封装块的外观
接口及相关机制最基本的作用:通过接口可以实现不相关类的相同行为,而不需要考虑这些类之间的层次关系。根据接口可以了解对象的交互界面,而不需要了解对象所属的类。
面向对象程序设计讲究“提高内聚,松散耦合”,那么不同的程序模块怎么相互访问呢,就是通过接口,也就是接口是各部分对外的统一外观。接口在Java程序设计中体现的思想就是封装隔离,因为接口只是描述一个统一的行为,所以开发人员在面
向接口编程时并不关心具体的实现。
由以上讲到的接口的作用和基本思想可以看到,接口在面向对象的Java程序设计中占有举足轻重的地位。事实上在设计阶段最重要的任务之一就是设计出各部分的接口,然后通过接口的组合,形成程序的基本框架结构。
注:对于行为模型,优先选用接口,尽量少用抽象类
既为约束子类的功能,又要提供一些公共的功能,就选用抽象类
★ 优先使用对象组合而非类继承
★ 分层
最典型的:三层结构
① 表现层功能:展示数据、人机交互、收集参数调用逻辑层。
② 逻辑层功能:进行数据的逻辑校验、进行逻辑判断、实现业务功能、处理相关功能、处理后续流程、组织数据返回给表现层。
③ 数据层功能:实现数据持久化、实现对象和持久化数据的双向映射。
★ 层间交互的基本原则
① 表现层调用逻辑层,逻辑层调用数据层,不可以反过来。
② 层间交互也应该通过接口进行调用,以确保各层的实现独立变化。
★ 开闭原则
简单点说就是对新增开放,对修改关闭。而且应尽量做到不用修改模块的源代码,就能更改模块的行为。
★ 依赖性倒置原则
这个原则就是依赖抽象而不要依赖具体实现。
★ 接口隔离原则
这个原则就是不要使用通用的接口,而是为不同的用户使用不同的接口。
★ 替换原则
这个原则就是子类应当可以替换父类并出现在父类能够出现的任何地方。
三、大神们的基本经验
★ 类要单一
所设计的类功能要单一 ,一个类应该是描述一类极其相关的属性和方法。
★ 加强内聚,松散耦合
指一个类,能够在自己内部实现的功能就自己内部实现,不要去调其它类,尽量减少与其它类的依赖关系。
★ 好的封装性
不必对外开放的部分,一律不对外开放。如果在不确定属性权限的情况下,先把类的属性设成private,用的时候再开。
★ 类的粒度要合理
Java规范中建议,一个类的大小不要超过1000行,一个方法的大小不要超过100行。
★ 实现类不能依赖它的使用类
一个类依赖(使用或调用)了另一个类,那么在另一个类中就不能反过来再依赖当前类。
★ 应考虑灵活性,也就是可配置、可维护
用户的需求是会不断改变的,后期的修改与维护是不可避免的,因此软件开发时就要考虑灵活性。
★ 要考虑性能,考虑可伸缩性
要权衡速度与资源耗费之间的关系,要考虑软件能够在一定范围内可伸缩。
★ 要考虑今后可能的变化,也就是可扩展性
可扩展性指该应用程序能够很方便地添加新的功能。
★ 要考虑合理的复用
要尽量考虑复用,但也不能光考虑复用,不能把其它的设计原则都丢掉了。
★ 要合理的考虑接口和抽象类的使用
优先使用接口,如果既想约束子类的行为,又要为子类提供公共的功能时,采用抽象类。
★ 尽量减少类与协作类的交互次数和交互信息的量
类之间不要反复地调用,不要每次传很多的数据。
★ 父类不应知道子类的信息,子类必须知道父类的信息
★ 访问对象必须通过接口,不能绕过接口直接去访问
四、实例
功能:图形界面的个人信息管理系统,实现增、删、改、查等功能,而且将相关信息存在文件中。
设计思想:每个功能一个模块,也就是一个封装体。
表现层:
addressApp.java(主界面)
设置界面的大体框架,如菜单,和面板,标题等
package cn.hncu.addressManage;
import java.awt.event.KeyEvent;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Event;
import java.awt.BorderLayout;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.KeyStroke;
import java.awt.Point;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JMenuItem;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JFrame;
import javax.swing.JDialog;
import cn.hncu.addressManage.UI.ListPanel;
public class addressApp {
private JFrame jFrame = null;
private JPanel jContentPane = null;
private JMenuBar jJMenuBar = null;
private JMenu fileMenu = null;
private JMenu editMenu = null;
private JMenu helpMenu = null;
private JMenuItem exitMenuItem = null;
private JMenuItem aboutMenuItem = null;
private JMenuItem cutMenuItem = null;
private JMenuItem copyMenuItem = null;
private JMenuItem pasteMenuItem = null;
private JMenuItem saveMenuItem = null;
private JDialog aboutDialog = null;
private JPanel aboutContentPane = null;
private JLabel aboutVersionLabel = null;
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
SwingUtilities.invokeLater(new Runnable() {
public void run() {
addressApp application = new addressApp();
application.getJFrame().setVisible(true);
}
});
}
/**
* This method initializes jFrame
*
* @return javax.swing.JFrame
*/
private JFrame getJFrame() {
if (jFrame == null) {
jFrame = new JFrame();
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setJMenuBar(getJJMenuBar());
jFrame.setSize(800, 650);
jFrame.setContentPane(getJContentPane());
jFrame.setTitle("Application");
}
return jFrame;
}
/**
* This method initializes jContentPane
*
* @return javax.swing.JPanel
*/
private JPanel getJContentPane() {
if (jContentPane == null) {
jContentPane = new JPanel();
jContentPane.setLayout(new BorderLayout());
//把我们的ListPanel加到jContentPane中
jContentPane.add(new ListPanel(jFrame,null,false));
//jContentPane.remove(listPanel)
}
return jContentPane;
}
/**
* This method initializes jJMenuBar
*
* @return javax.swing.JMenuBar
*/
private JMenuBar getJJMenuBar() {
if (jJMenuBar == null) {
jJMenuBar = new JMenuBar();
jJMenuBar.add(getFileMenu());
jJMenuBar.add(getEditMenu());
jJMenuBar.add(getHelpMenu());
}
return jJMenuBar;
}
/**
* This method initializes jMenu
*
* @return javax.swing.JMenu
*/
private JMenu getFileMenu() {
if (fileMenu == null) {
fileMenu = new JMenu();
fileMenu.setText("File");
fileMenu.add(getSaveMenuItem());
fileMenu.add(getExitMenuItem());
}
return fileMenu;
}
/**
* This method initializes jMenu
*
* @return javax.swing.JMenu
*/
private JMenu getEditMenu() {
if (editMenu == null) {
editMenu = new JMenu();
editMenu.setText("Edit");
editMenu.add(getCutMenuItem());
editMenu.add(getCopyMenuItem());
editMenu.add(getPasteMenuItem());
}
return editMenu;
}
/**
* This method initializes jMenu
*
* @return javax.swing.JMenu
*/
private JMenu getHelpMenu() {
if (helpMenu == null) {
helpMenu = new JMenu();
helpMenu.setText("Help");
helpMenu.add(getAboutMenuItem());
}
return helpMenu;
}
/**
* This method initializes jMenuItem
*
* @return javax.swing.JMenuItem
*/
private JMenuItem getExitMenuItem() {
if (exitMenuItem == null) {
exitMenuItem = new JMenuItem();
exitMenuItem.setText("Exit");
exitMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
}
return exitMenuItem;
}
/**
* This method initializes jMenuItem
*
* @return javax.swing.JMenuItem
*/
private JMenuItem getAboutMenuItem() {
if (aboutMenuItem == null) {
aboutMenuItem = new JMenuItem();
aboutMenuItem.setText("About");
aboutMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JDialog aboutDialog = getAboutDialog();
aboutDialog.pack();
Point loc = getJFrame().getLocation();
loc.translate(20, 20);
aboutDialog.setLocation(loc);
aboutDialog.setVisible(true);
}
});
}
return aboutMenuItem;
}
/**
* This method initializes aboutDialog
*
* @return javax.swing.JDialog
*/
private JDialog getAboutDialog() {
if (aboutDialog == null) {
aboutDialog = new JDialog(getJFrame(), true);
aboutDialog.setTitle("About");
aboutDialog.setContentPane(getAboutContentPane());
}
return aboutDialog;
}
/**
* This method initializes aboutContentPane
*
* @return javax.swing.JPanel
*/
private JPanel getAboutContentPane() {
if (aboutContentPane == null) {
a