总是需要一些温暖。哪怕是一点点自以为是的纪念。 注册 | 登陆
浏览模式: 标准 | 列表2008年03月的文章

Java 接口与继承的本质

大多数人认为,接口的意义在于顶替多重继承。众所周知Java没有c++那样多重继承的机制,但是却能够实作多个接口。其实这样做是很牵强的,接口和继承是完全不同的东西,接口没有能力代替多重继承,也没有这个义务。接口的作用,一言以蔽之,就是标志类的类别(type of class)。把不同类型的类归于不同的接口,可以更好的管理他们。OO的精髓,我以为,是对对象的抽象,最能体现这一点的就是接口。为什么我们讨论设计模式都只针对具备了抽象能力的语言(比如c++、java、c#等),就是因为设计模式所研究的,实际上就是如何合理的去抽象。(cowboy的名言是“抽象就是抽去像的部分”,看似调侃,实乃至理)。  

  设计模式中最基础的是工厂模式(Factory),在我最近的一个很简单的应用中,我想尽量的让我的程序能够在多个数据库间移植,当然,这涉及很多问题,单是如何兼容不同DBMS的SQL就让人头痛。我们不妨先把问题简单化,只考虑如何连接不同的数据库。  

  假设我有很多个类,分别是Mysql.java、SQLServer.java、Oracle.java、DB2.java,他们分别连接不同的数据库,统一返回一个Connection对象,并且都有一个close方法,用于关闭连接。只需要针对你的DBMS,选择不同的类,就可以用了,但是我的用户他会使用什么数据库?我不知道,我希望的是尽量少的修改代码,就能满足他的需要。我可以抽象如下接口:  

  package org.bromon.test;  
  public interface DB  
  {  
  java.sql.Connection openDB(String url,String user,String password);  
  void close();  
  }  

  这个接口只定义两个方法,没有任何有实际意义的代码,具体的代码由实作这个接口的类来给出,比如Mysql.java:  

  Package org.bromon.test;  
  import java.sql.*;  
  public class Mysql implements DB  
  {  
  private String url=”jdbc:mysql:localhost:3306/test”;  
  private String user=”root”;  
  private String password=””;  
  private Connection conn;  
  public Connection openDB(url,user,password)  
  {  
    //连接数据库的代码  
  }  

  public void close()  
  {  
    //关闭数据库  
  }  
  }  

  类似的当然还有Oracle.java等等,接口DB给这些类归了个类,在应用程序中我们这样定义对象:  

  org.bromon.test.DB myDB;  

  使用myDB来操作数据库,就可以不用管实际上我所使用的是哪个类,这就是所谓的“开-闭”原则。但是问题在于接口是不能实例化的,myDB=new DB(),这样的代码是绝对错误的,我们只能myDB=new Mysql()或者myDB=new Oracle()。麻烦了,我还是需要指定具体实例化的是哪个类,用了接口跟没用一样。所以我们需要一个工厂:  

  package org.bromon.test;  
  public class DBFactory  
  {  
  public static DB Connection getConn()  
  {  
    Return(new Mysql());  
  }  
  }  

  所以实例化的代码变成:myDB=DBFactory.getConn();  

  这就是23种模式中最基础的普通工厂(Factory),工厂类负责具体实例化哪个类,而其他的程序逻辑都是针对DB这个接口进行操作,这就是“针对接口编程”。责任都被推卸给工厂类了,当然你也可以继续定义工厂接口,继续把责任上抛,这就演变成抽象工厂(Abstract Factory)。  

  整个过程中接口不负责任何具体操作,其他的程序要连接数据库的话,只需要构造一个DB对象就OK,而不管工厂类如何变化。这就是接口的意义----抽象。  

  继承的概念不用多说,很好理解。为什么要继承呢?因为你想重用代码?这绝对不是理由,继承的意义也在于抽象,而不是代码重用。如果对象A有一个run()方法,对象B也想有这个方法,所以有人就Class B extends A。这是不经大脑的做法。如果在B中实例化一个A,调用A的Run()方法,是不是可以达到同样的目的?如下:  

  Class B  
  {  
  A a=new A();  
  a.run();  
  }  

  这就是利用类的聚合来重用代码,是委派模式的雏形,是GoF一贯倡导的做法。  

  那么继承的意义何在?其实这是历史原因造成的,最开始的OO语言只有继承,没有接口,所以只能以继承来实现抽象,请一定注意,继承的本意在于抽象,而非代码重用(虽然继承也有这个作用),这是很多Java烂书最严重的错误之一,它们所造成的阴影,我至今还没有完全摆脱,坏书害人啊,尤其是入门类的,流毒太大。什么时候应该使用继承?只在抽象类中使用,其他情况下尽量不使用。抽象类也是不能实例化的,它仅仅提供一个模版而已,这就很能说明问题。  

  软件开发的万恶之源,一是重复代码而不是重用代码,二是烂用继承,尤以c++程序员为甚。Java中取缔多重继承,目的就是制止烂用继承,实是非常明智的做法,不过很多人都不理解。Java能够更好的体现设计,这是让我入迷的原因之一。

jboss入门jboss管理

一。搭建jboss环境  
     设置jboss环境变量,jdk环境变量。桌面--我的电脑--右键属性--高级--环境变量--系统变量。  
    新建jboss环境变量,变量名:“JBOSS_DIST”,变量值:“d:\OA\jboss”;  
    新建jdk环境变量,变量名:“JAVA_HOME”,变量值:“d:\OA\jdk14”;  
    新建CLASSPATH环境变量,变量名:“CLASSPATH”,变量值:“d:\OA\jdk14\lib;d:\OA\jdk14\jre\lib”;  
    修改path的值,在最后追加:“;d:\OA\jdk14\bin”。  
      
    二。启动和关闭jboss服务  
     双击“d:\OA\jboss\bin\run.bat”启动jboss;启动后出现一个dos窗口,关闭该窗口可停止jboss服务,或者双击“d:\OA\jboss\bin\shutdown.bat”也可关闭jboss服务。  
      
    三。修改jboss端口  
     jboss端口默认是“8080”,配置文件在“D:\OA\jboss\server\default\deploy\tomcat4-service.xml”。用记事本打开该文件,拉到最底下将对应的“port = "8080"”改成“port = "80"”。  
     经常遇到的失误:新手常常不知道xml文件,也不注意这里的后缀,总是打开“tomcat4-service.jar”。也有些人修改注释行:“”。有些用UltraEdit打开xml文件修改保存,这样有时候会导致xml里多了些隐藏的字符,而导致xml解析出现错误。  
      
    四。部署系统的位置  
  [separator]   D:\OA\jboss\server\default\deploy\VOA.war。访问路径为:http://localhost:8080/VOA/  
      
    五。缓存文件的作用和影响  
     对应于部署文件VOA.war以及访问路径http://localhost:8080/VOA/,jboss自动将jsp编译成servelet,这将提高我们访问系统的速度。这个就是我们平时所说的缓存,目录对应于:“D:\OA\jboss\catalina\work\MainEngine\localhost\VOA”。如果访问路径为“http://localhost:8080/”的系统,对应的缓存文件为:“D:\OA\jboss\catalina\work\MainEngine\localhost\_”。如果给系统打了补丁,可能需要删除对应的文件夹,否则得不到最新的结构;也有可能需要重新启动jboss服务。  
      
    六。日志文件  
     当前最新的日志文件:“D:\OA\jboss\server\default\log\server.log”;如果操作系统不显示后缀名,则文件为“server”。  
      
    七。安全设置  
     jboss默认设置可直接访问目录,这将导致最明显的程序安全问题。禁止直接访问jboss下的目录:用记事本打开“D:\OA\jboss\catalina\conf\web.xml”,将“listings”的值改成false就可以。  
       
     listings  
     true  
    
  
      
    八。怎么直接打开一个文件,而不是下载  
     一般客户要求,上传的文件如果是world,xls,ppt,rar之类的文件,希望点开的时候直接打开文件,而不是下载到本机再打开。用记事本打开“D:\OA\jboss\catalina\conf\web.xml”,增加  
       
     doc  
     application/msword  
    
  
       
     xls  
     application/msexcel  
    
  
       
     ppt  
     application/mspowerpoint  
    
  
       
     rar  
     application/rar  
    
  
      
    九。访问路径  
     极品OA系统默认访问路径:http://localhost:8080/VOA/,很多客户希望直接通过IP地址访问OA,修改的地方有二。  
    1。修改jboss端口为80  
    2。修改或增加:“D:\OA\jboss\server\default\deploy\VOA.war\WEB-INF\jboss-web.xml”文件,修改后内容如下:  
       
     /  
     localhost  
    
  
    3。以上两点修改后可直接通过IP地址访问OA。如果操作系统安装了IIS或其他web服务,占用了端口,会导致jboss服务启动不成功,从而访问不了OA

30M/10G/PHP/MYSQL/FTP/elixhosting

30 MB space (ask for more)
10 GB bandwidth (ask for more)
Hotlinking allowed
Linux host
Instant setup
Easy online account management
No posting!

http://free.elixhosting.com

30M/10G/PHP/MYSQL/FTP/elixhosting

30 MB space (ask for more)
10 GB bandwidth (ask for more)
Hotlinking allowed
Linux host
Instant setup
Easy online account management
No posting!

http://free.elixhosting.com

免费.ee域名

General Conditions:

Only institutions registered in Estonia are eligible to apply for .ee domain names.
Only one domain name can be registered per institution.
Registration is free of charge.
Before submitting an application, all name servers for the domain name must be configured.
http://www.eenet.ee/EENet/ee-tldomreg.html

免费.ee域名

General Conditions:

Only institutions registered in Estonia are eligible to apply for .ee domain names.
Only one domain name can be registered per institution.
Registration is free of charge.
Before submitting an application, all name servers for the domain name must be configured.
http://www.eenet.ee/EENet/ee-tldomreg.html

5GB/100GB/PHP/MYSQL/无广告/LP/绑米/FTP/oxyhost.com

Hello FWS.NET,

OXYHOST.com is now available for public beta testing! http://oxyhost.com. Check us out!

Features:

No Ads, No Catches
5GB RAID 10 SATA II Storage
100GB Cogent Bandwidth
Custom LPv2 panel
5 MySQL Databases
Awstats and Real-TimeWeb Statistics
500 Domains and subdomains can be hosted on one account.
PHP5/Apache2
One-click Script Uploader
Monthly backup to RsyncPalace.com.

Servers' Specification:

Quad Core 8.52GHz Core-Architecture based Xeons
4 GB of ECC DDRII RAM.
4X500 GB SATA II in RAID-10.
100mbps COGENT bandwidth with backup carrier.

Note: Your accounts will not be deleted after the beta phase ends.

So... help us out by posting bugs you find and post it on our forums. If it is system security related, please submit a support ticket.
http://www.oxyhost.com/

5GB/100GB/PHP/MYSQL/无广告/LP/绑米/FTP/oxyhost.com

Hello FWS.NET,

OXYHOST.com is now available for public beta testing! http://oxyhost.com. Check us out!

Features:

No Ads, No Catches
5GB RAID 10 SATA II Storage
100GB Cogent Bandwidth
Custom LPv2 panel
5 MySQL Databases
Awstats and Real-TimeWeb Statistics
500 Domains and subdomains can be hosted on one account.
PHP5/Apache2
One-click Script Uploader
Monthly backup to RsyncPalace.com.

Servers' Specification:

Quad Core 8.52GHz Core-Architecture based Xeons
4 GB of ECC DDRII RAM.
4X500 GB SATA II in RAID-10.
100mbps COGENT bandwidth with backup carrier.

Note: Your accounts will not be deleted after the beta phase ends.

So... help us out by posting bugs you find and post it on our forums. If it is system security related, please submit a support ticket.
http://www.oxyhost.com/
Records:3612345