继续学习Spring,在web上面的应用,spring的关键,是将业务类在spring框架中注册,也就是在xml文件中,其中包括类的属性的初始化,这有个属性注入的概念,常用的有构造方法注入,和set方法注入,还有一种不常用的接口注入,Class.forName();,注册以后,在控制器中使用的时候,通过spring框架来创建对象,然后我们来使用这个对象,其中这里有个很重要的要求就是,面向接口编程,要实现一个业务类,必须先定义一个该业务类的接口,然后让实现类实现它,这样做的好处可以隐藏实现类的内部实现,将想让客户见到的方法放到接口中,这样实现隐藏其他不想公开的方法。另外从客户的角度来看,客户只是得到了一个实现类的接口类型,并没有得到具体的实现类,甚至不知道实现类的名字,面向接口编程。
另外,IoR是一种设计思想,将类的创建,管理,销毁,还有单一模式,这一档子事全部交给别人来负责,客户只拿来使用创建好的对象,为客户带来了简便,使更多的精力放到业务放到业务处理上,另外,也带来了代码的松耦合。
一天下来还是头疼,不知怎么搞得,感冒还是没好利索,今天抽时间将编程思想的对象初始化看完了,接下来计划复习Struts。
昨天晚上装jbuilder2006遇上安装好后不能启动的问题,从网上找的解决问题的办法。
安装 JBuilder 后第一次可以成功运行,可是机器重新启动之后再次运行 JBuilder 时却每次只是看到 Logo 闪了一下就没有任何反应了。
这种情况主要是由于 VM 的内存分配设置出了问题。可以在 X:\JBuilder2006\bin 目录下找到一个名为 jbuilder.config 的文件,打开该文件,其中有如下一行设置:
# Tune this VM to provide enough headroom to work on large
# applications
vmmemmin 32m
vmmemmax 75%
vmparam -XX:MaxPermSize=128m
将其改为:
# Tune this VM to provide enough headroom to work on large
# applications
vmmemmin 32m
vmmemmax 512m
vmparam -XX:MaxPermSize=128m
即可解决上述问题。
今天讲spring的MVC实现,理论上跟Struts差不多,只是换汤不换药,目前只是接触到了Spring的控制器和模型之间是如何联系的,Spring利用IoC实现了松耦合。这是比Struts先进的地方。
今天接触到了Spring,我喜欢的名字,呵呵,Spring应用框架是应用于业务层的框架,要求面向接口编程,将类与类之间的关系进行解耦,Spring最基本的就是IoR(Inversion of Control)翻译过来是控制反转,是一种设计模式,使应用程序逻辑外在化,将创建对象,初始化,销毁交给spring来管理,通过动态加载来使用对象。
好久没有打代码了,今天问起strues的东西,都有点陌生了,不行,得好好复习不行。今天一天下来头疼,不知为什么,精力太集中了?呵呵。
今天发现有个人去工作了,哦天,呆两天不会来再哦天。
头疼,回家。
无意中发现baidu的blog可以从别的地方搬家,哈哈,拉拢我们的好办法,决定试一下,哈哈转过来了,还不错,除了因为我原来的页面有背景,字体设成白色的了,在这边显示不出来,让我甚是不爽,改了半天,这下终于行了,还不错。
感觉baidu的速度还是相当快的。/
类与类之间的关系对于理解面向对象具有很重要的作用,以前在面试的时候也经常被问到这个问题,在这里我就介绍一下。
类与类之间存在以下关系:
(1)泛化(Generalization)
(2)关联(Association)
(3)依赖(Dependency)
(4)聚合(Aggregation)
UML图与应用代码例子:
1.泛化(Generalization)
[泛化]
表示类与类之间的继承关系,接口与接口之间的继承关系,或类对接口的实现关系。一般化的关系是从子类指向父类的,与继承或实现的方法相反。
[具体表现]
父类 父类实例=new 子类()
[UML图](图1.1)
图1.1 Animal类与Tiger类,Dog类的泛化关系
[代码表现]
- class Animal{}
- class Tiger extends Animal{}
- public class Test
- {
- public void test()
- {
- Animal a=new Tiger();
- }
- }
2.依赖(Dependency)
[依赖]
对于两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对象的服务时,这两个对象之间主要体现为依赖关系。
[具体表现]
依赖关系表现在局部变量,方法的参数,以及对静态方法的调用
[现实例子]
比如说你要去拧螺丝,你是不是要借助(也就是依赖)螺丝刀(Screwdriver)来帮助你完成拧螺丝(screw)的工作
[UML表现](图1.2)
图1.2 Person类与Screwdriver类的依赖关系
[代码表现]
- public class Person{
- /** 拧螺丝 */
- public void screw(Screwdriver screwdriver){
- screwdriver.screw();
- }
- }
3.关联(Association)
[关联]
对于两个相对独立的对象,当一个对象的实例与另一个对象的一些特定实例存在固定的对应关系时,这两个对象之间为关联关系。
[具体表现]
关联关系是使用实例变量来实现
[现实例子]
比如客户和订单,每个订单对应特定的客户,每个客户对应一些特定的订单;再例如公司和员工,每个公司对应一些特定的员工,每个员工对应一特定的公司
[UML图] (图1.3)
图1.3 公司和员工的关联关系
[代码表现]
- public class Company{
- private Employee employee;
- public Employee getEmployee(){
- return employee;
- }
- public void setEmployee(Employee employee){
- this.employee=employee;
- }
- //公司运作
- public void run(){
- employee.startWorking();
- }
- }
(4)聚合(Aggregation)
[聚合]
当对象A被加入到对象B中,成为对象B的组成部分时,对象B和对象A之间为聚集关系。聚合是关联关系的一种,是较强的关联关系,强调的是整体与部分之间的关系。
[具体表现]
与关联关系一样,聚合关系也是通过实例变量来实现这样关系的。关联关系和聚合关系来语法上是没办法区分的,从语义上才能更好的区分两者的区别。
[关联与聚合的区别]
(1)关联关系所涉及的两个对象是处在同一个层次上的。比如人和自行车就是一种关联关系,而不是聚合关系,因为人不是由自行车组成的。
聚合关系涉及的两个对象处于不平等的层次上,一个代表整体,一个代表部分。比如电脑和它的显示器、键盘、主板以及内存就是聚集关系,因为主板是电脑的组成部分。
(2)对于具有聚集关系(尤其是强聚集关系)的两个对象,整体对象会制约它的组成对象的生命周期。部分类的对象不能单独存在,它的生命周期依赖于整体类的对象的生命周期,当整体消失,部分也就随之消失。比如张三的电脑被偷了,那么电脑的所有组件也不存在了,除非张三事先把一些电脑的组件(比如硬盘和内存)拆了下来。
[UML图](图1.4)
图1.3 电脑和组件的聚合关系
[代码表现]
- public class Computer{
- private CPU cpu;
- public CPU getCPU(){
- return cpu;
- }
- public void setCPU(CPU cpu){
- this.cpu=cpu;
- }
- //开启电脑
- public void start(){
- //cpu运作
- cpu.run();
- }
- }
[参考资料]
1.《Java与模式》(阎宏 编著) 第2章 统一建模语言UML简介
突然感觉自己是个木讷的人,还矫情的写写心情,呵呵,女不女人。
时间过的真快,天气已经很冷了,开始越来越担心,这个年该怎么过,话虽说,车到山前必有路,但还是免不了不知如何是好。
想想,我想要的,其实我也不想太奢侈,自己的路真想自己走,就应该自己走,可是...
哪有那么多可是,男人一点。
我该表明我的观点,我的立场,唉,头晕/
跟着感觉走吧。
Oracle数据库课结束了,老师上完课坐晚上的火成回沈阳,专业Oracle数据库老师,当老师还是不错的嘛,呵呵。
下周就是Spring/冬眠了呵呵,接着Struts继续研究代码的阶段,也不能单纯的研究代码不是,MVC,设计模式,面向对象,这是最基本的,好好研究编程思想吧。
自己好好学吧,靠别人是不行的,也不要多管闲事。
数据库,存储过程,游标
没什么具体写的,心情不好,身体也不好,狗日的,回家。
今天的自讲因为机子连接的问题取消了。
这周接着讲Oracle,
今天脖子特别疼,还比较困,老师一讲就犯困了,
晚上还好,郭斌斌讲了继承,还不错,蛮有收获。哎呦脖子疼,刚刚发现手机欠费了,买了张充值卡充上了,还是说我欠费不让我打电话,真是气死我,狗日的移动。
脖子疼好些了,嗓子又肿了,昨晚一晚上没睡好,还挺厉害,中午买了点消炎药,昨晚开玩笑说,以后我挣的钱还供不上吃药的,呵呵,还活着干啥。
数据库讲了一些如何配置,然后是一些sql语句oracle独有的,老师的水平还是厉害的,看得出来,就是有些腼腆哈哈,感到oracle还是很强大的,有很多它独有的东西。要想学好它可是要费一段功夫的。
昨晚的讲课进行的不好,感觉的在糊弄我们,也没说什么,唉0能说什么呢,今天邓讲内部类,挺麻烦的东西。
最后一天uml,行为模式,Chain of Responsibility (COR)职责链模式,Command模式,Iterator迭代器模式,Mediator模式,Memento备忘录模式,Visitor访问者模式,Strategy策略模式,State状态模式。
COR模式,职责链模式,定义一个接口,有一个处理方法,有一个该接口类型的字段,并且有一个该字段的set设置方法,不同的职责分别实现该接口,处理方法判断是否是自己的方法,如果是,处理,如果不是,利用接口里定义的字段访问下一个职责的处理方法,在客户端,建立各个职责的对象,并用set方法设置下一个职责是哪一个,最后调用第一个职责的处理方法。
Command模式,国王发好施令,定义一个命令接口,用于发布命令,实现该接口,有一个士兵类属性,构造器负责传入士兵对象,用于让那个士兵去执行该命令,士兵类,士兵类里面有具体执行命令的方法,国王类,有发布命令的方法,在客户端,实例化一个士兵,实例化一个发布命令类,将士兵对象作为参数传给命令类,实例化一个国王对象,将命令对象作为参数传给国王,国王发号施令。
Iterator迭代器,就像集合里面有个方法可以得到Iterator对象,用于遍历、排序。
Mediator媒体模式,由多个类需要调用,将这几个类组合到一个类,在这个类里面有每个类类型的属性,让客户端实例化这个类,不需关心其他类。
Memento模式,建立一个跟已有的类一模一样的类,用于保存在某个时刻的值,防止后悔,呵呵!已有类里面有个memento类的对象。
Visitor访问者模式,解决了泛型要解决的问题,利用多态,多态真是太有用了,哈哈,我觉得很多设计模式都用了多态特性。
Strategy策略模式
State状态模式
今天下课给大家讲了讲第三章,比较简单,但是不够自信,怕自己说错了,呵呵,还好,大家都分了一章,下星期都安排好了,安排好后几个人又开始玩cs了,怎么能这样呢,还不好意思说他们,唉…
设计模式,创建型模式,工厂方法,Builder模式
工厂方法就是建一个工厂类,这个工厂类负责生产对象,生产需要的对象,生成什么样的对象由调用工厂方法的对象决定,也可以由xml文件配置,就像在struts里面配置action。随着工厂类的增多,可以将工厂类抽象,然后由子类继承。
Builder模式,可以单独有一个类负责另一个类的对象的创建。我的理解,可以
Interface Car{};
class BuildCar
{
class RedCar implements Car
{}
Public Car getCar()
{
return new RedCar();
}
}
就像10-12日的那个例子,我想这就用了Builder模式。另外,Builder模式还可以有一个叫导向器的类Director,它负责怎样创建这个对象,适用于几个类的属性基本相同,只有少许不同,这样用到导向器,实现Builder类的重用。
基础太重要了,高楼大厦的基石,好好看java编程思想。老师建议我们每个人一人一章,然后负责给每个人讲解,这样的学习效率是很高的,再有,看明白了跟讲明白了是两个层次,可是没人相应,下课我问大家觉得老师的提议怎么样?没人理我,呜呜。大家不想学好么。
设计模式,构建型模式最后一个:Singleton单件模式
保证一个类只有一个实例存在,方法是隐藏构造方法,在类的内部构造一个静态的实例,然后建一个静态方法返回这个实例,其中一个知识点是,静态变量是在main方法执行前初始化的,也就是在程序运行前初始化的。
结构性模式:适配器模式Adapter,桥接模式Bridge,组合模式Composite,装饰模式Dectorator,外观模式Fa ade,享元模式FlyWeight,代理模式Proxy。
Adapter模式,是多重继承的一种替代方法,通过继承一个类,组合一个类,来实现。
Bridge模式,将要执行的业务方法抽象出来,建立一个桥接接口,通过实现该接口用于不同的业务,然后使用该实现类。
Composite模式,多个相同的对象要调用它们的一个方法,单独写一个类,里面有个该对象的类的类型的集合,里面装有许多对象,有个方法,利用循环依次调用每个对象的方法,宗旨是让类的使用者更方便。
Dectorator模式,避免过深继承的一种方式,目前有一个类,但业务需求改变导致这个类有少许变化,如果继承这个类,将导致无限制继承,办法是建立一个这个类的兄弟,实现新的业务需求,然后调用兄弟的方法。
Fa ade模式,用于业务操作十分复杂,为了实现对复杂性的封装,建立一个类,建立一个面向外界的接口,类的使用者只需调用该接口就搞定了,而背后复杂的逻辑不必去关心。
FlyWeight模式,跟单件模式有类似之处,都是为了减少重复对象的创建,这个模式是,建立一个缓存,将已建立的对象放入缓存,当再次需要的时候在缓存中查找是不是已经存在了该对象,如果存在,直接返回,否则创建,这样节省了内存空间,这样的适用于有许多的小型对象的适用。
Proxy模式,用于不同用户有不同操作权限的类似情况,有一个类负责业务逻辑的执行并不负责用户是否具有权限的判断,这件任务由另一个类负责。
以上设计模式的理解,用自己的话写了一下,希望加深理解。
明天可能要给大家讲第三章,得好好准备准备,争取完美,嘻嘻。
今天开始上uml课,老师还是很厉害的。
其中一个很容易混淆的关系就是一个依赖关系,一个关联关系,依赖关系就是参数关系,一个类的对象作为一个参数在另一个类里被使用,而关联关系,是一个类的对象作为另一个类的一个属性或者集合属性来使用。
另外,在实际设计开发中,应尽可能少的使用继承,完全符合继承逻辑关系的才使用继承,以免造成代码的混乱,关于多重继承在java中不直接被支持,采用内部类或者关联关系来实现。
在C++ 中有个名词叫友元,一般情况下,子类继承父类,子类是不能访问父类的私有成员的,而如果一定要访问,就在父类中将子类声明为父类的一个朋友,这样子类就可以使用父类的私有成员,这就是友元,在java中没有这样的概念。
Java基础知识很重要,要注意复习,进一步掌握。
接着uml,接下来就应该是设计模式了,这部分都是些理论的东西,基本不用写代码,一些画uml图的含义,感觉记不住,只能到时候用到的时候,再来查查资料了,uml很重要/
感觉自己掌握的知识太欠缺了,要好好掌握基础才行。
面向对象程序设计实际上进行的是创建新的数据类型。也可以认为,类型决定了接口,而类是该接口的一个特定实现。值得好好理解。
类描述了具有相同特性(数据元素)和行为的对象集合。