一 面向对象开发中的核心思想和概念
1、消息:面向对象的服务是由对象的方法来实现的,因此发送消息实际上也就是调用一个对象的方法。
2、接口:在java语言中,接口有两种意思,一是指概念性的接口,即指系统对外提供的所有服务,在对象中表现为public类型的方法的声明。二是指用interface关键字定义的实实在在的接口,用于明确的描述系统对外提供的所有服务,它能够更加清晰地把系统的实现细节与接口分离。
3、继承:继承中,子类只能继承父类的部分属性和方法,父类中用private修饰的属性和方法对于子类是透明的。
4、软件框架:通用软件架构中都提供了一些扩展点。这些扩展点就是专门让用户继承和扩展的类。这些类已经具备了一些功能,并且能和软件架构中其他的类紧密协作。用户只需要创建这些类的子类,然后在子类中增加新功能或重新实现某些功能。用户自定义的类能够和谐的融入到软件架构中,顺利地与软件架构中的其他类协作。
目前在java领域比较流行的架构软件包括:
J2EE——sun公司制定的分布式的分层的企业应用的软件架构,它把企业应用分为客户层、javaweb层、应用服务层和数据库层。在javaweb层的扩展点主要是Servlet类和JSP,应用服务层的扩展点主要是EJB组件。
Struct——Apache开放源代码组织为JavaWeb应用创建的通用框架,采用MVC设计模式,它的主要扩展点是控制器层的Action类。
JSF——Sun 公司为JavaWeb 应用的界面创建的通用框架。
Spring——Spring 开放源代码组织为企业应用的服务层创建的通用框架。
5、多态:多态是指当系统A访问系统B的服务时,系统B可以通过多种实现方式来提供服务,而这一切对系统A是透明的。
6、UML语言简介:UML的几种框图现在没用到所以没看。下面讲讲类之间的关系。
关联:对于两个相对独立的系统,当一个系统的实例与另一个系统的一些特定实例存在固定的对应关系时,这两个系统之间为关联关系。表现在代码中就是某个类拥有另一个类的实例的属性,接下来一般要调用这个实例的方法。
依赖:对于两个相对独立的系统,当一个系统负责构造另一个系统的实例,或者依赖另一个系统的服务时,这两个系统之间主要体现为依赖关系。表现在代码中,与关联对比,它没有另一个类的实例属性,直接传参数进来调用另一个类的实例的方法或者自己生成另一个类的实例再调用它的方法。
关联和依赖在语义上的区别,举例来说:
人和自行车,一个人应该拥有的是特定的自行车,所以”人“类中会有一个”自行车“实例的属性,表示它俩关联。
自行车和打气筒,自行车不会配备专用的打气筒,所以”自行车“中没有”打气筒“的实例属性,而是直接传参数进来,调用”打气筒“的方法即可。
聚集:聚集表示整体和部分的关系。代码上,它和关联类似,它的整体这个类中会有部分的类的实例属性。他俩的区别在语义上比较明显:聚集中有明显的部分整体关系,而且部分离开了整体大多数情况下是没有意义的,比如人由头、躯干、四肢等组成,部分单独存在没有意义。
聚集还分普通聚集和强聚集。例如台灯和灯泡普通聚集,灯泡可以被替换。而台灯和线路是强聚集,线路不可以更换。边现在代码中就是,台灯类中会有方法来设置台灯setBulb(Bulb bulb),从而可以更换台灯,而线路类中没有设置线路的方法。
泛化:泛化指的是类之间的继承关系。实现:实现指的是类与接口之间的关系。
最后呢,有一个例子Panel系统,用到了工厂模式,Panel和ShapeFactory是依赖的关系,因为Panel依赖ShapeFactory的服务即getShape方法,Panel和Shape也是依赖关系因为Panel用到了ShapeFactory产生的Shape的draw方法,而Shapefactory和Shape也是依赖的的关系,因为Shapefactory产生Shape的实例。
例子中用到了反射(很久没用了都忘了),另外Map的使用也要学习一下,< >里面的两个该都必须是对象类型的,不然int没必要转换成integer类型的,还有静态代码块也要学习一下。
下面贴出代码:
//Shape类: abstract public class Shape { abstract void draw(); } //下面是它的三个子类 public class Circle extends Shape{ public void draw(){ System.out.println("draw a circle"); } } public class Line extends Shape{ public void draw(){ System.out.println("draw a line"); } } public class Rectangle extends Shape{ public void draw(){ System.out.println("draw a rectangle"); } }
//下面是工厂类
import java.util.HashMap; import java.util.Map; public class ShapeFactory { /** 定义形状类型常量 */ public static final int SHAPE_TYPE_CIRCLE=1; public static final int SHAPE_TYPE_RECTANGLE=2; public static final int SHAPE_TYPE_LINE=3; private static Map<Integer,String> shapes=new HashMap<Integer,String>(); static{ //静态代码块,当Java虚拟机加载ShapeFactory类的代码时,就会执行这段代码 // 建立形状类型和形状类名的对应关系 shapes.put(new Integer(SHAPE_TYPE_CIRCLE),"Circle"); shapes.put(new Integer(SHAPE_TYPE_RECTANGLE),"Rectangle"); shapes.put(new Integer(SHAPE_TYPE_LINE),"Line"); } /** 构造具体的Shape对象,这是一个静态方法 */ public static Shape getShape(int type){ try{ //获得与形状类型匹配的形状类名 String className=shapes.get(new Integer(type)); //运用Java反射机制构造形状对象 return (Shape)Class.forName(className).newInstance(); }catch(Exception e){return null;} } }
//下面是主类
import java.io.*; public class Panel { public void selectShape()throws Exception{ System.out.println("请输入形状类型:"); //从控制台读取用户输入形状类型 BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); int shapeType=Integer.parseInt(input.readLine()); //获得形状实例 Shape shape=ShapeFactory.getShape(shapeType); if(shape==null) System.out.println("输入的形状类型不存在"); else shape.draw(); //画形状 } public static void main(String[] args)throws Exception { new Panel().selectShape(); } }
/****************************************************
* 作者:孙卫琴 *
* 来源:<<Java面向对象编程>> *
* 技术支持网址:www.javathinker.org *
***************************************************/
上面为了建立int类型的变量和string类型的变量用到了maps,另一种方法应该也可行,即用Sring类型的数组即可。
static String[] shapes={"Circle","Rectangle","Line"};//替代shapeFactory的static代码区 String className=shapes[type];//替代shapeFactory的String className=shapes.get(new Integer(type));获得与形状类型匹配的形状类名
再有就是配置文件的使用,使用了配置文件的类由于把可变的部分写到了配置文件里,所以修改的时候对于这个类只需修改配置文件即可,不必修改代码。
下面贴出使用了配置文件的shapeFactory类代码:
import java.util.*; import java.io.*; public class ShapeFactory { private static Properties shapes=new Properties(); static{ try{ InputStream in=ShapeFactory.class.getResourceAsStream("panel.properties"); shapes.load(in); //把配置信息加载到shapes对象中 }catch(IOException e){throw new RuntimeException(e);} } public static Shape getShape(int type){ try{ //获得与形状类型匹配的形状类名 String className=(String)shapes.get(String.valueOf(type)); //运用Java反射机制构造形状对象 return (Shape)Class.forName(className).newInstance(); }catch(Exception e){return null;} }