??xml version="1.0" encoding="utf-8" standalone="yes"?>日本一区免费网站,亚洲国产精品综合小说图片区 ,欧美日韩亚州综合http://www.aygfsteel.com/zpuser/archive/2007/02/28/101042.html阿卜阿卜Tue, 27 Feb 2007 16:51:00 GMThttp://www.aygfsteel.com/zpuser/archive/2007/02/28/101042.htmlhttp://www.aygfsteel.com/zpuser/comments/101042.htmlhttp://www.aygfsteel.com/zpuser/archive/2007/02/28/101042.html#Feedback0http://www.aygfsteel.com/zpuser/comments/commentRss/101042.htmlhttp://www.aygfsteel.com/zpuser/services/trackbacks/101042.html

1.    模式定义... 1

2.    模式介绍... 1

3.    模式特点... 2

4.    与其它模式的关系... 3

5.    参?/span>... 3

 

1.    模式定义

工厂Ҏ模式 (Factory Method) 是创建模式的一U,也叫虚拟构造子 (Virture Constractor) 模式或多态性工?/span> (Polymorphic Factory) 模式?/span>

       工厂Ҏ模式定义一个抽象的对象创徏cL接口Q将实际的对象创建工作交l子cL实现?/span>

2.    模式介绍

2.1. 单类?/span>

 

2.2. cd对应CZ代码

2.2.1. 抽象产品Q?/span> AbstractProduct

public interface AbstractProduct{

  public void printName();

}

 

2.2.2. 具体产品Q?/span> ConcreteProduct1 ?/span> ConcreteProduct2

public class ConcreteProduct1 implements AbstractProduct{

  public void printName(){

    System.out.println(“ConcreteProduct1?/st1:chmetcnv>);

}

}

public class ConcreteProduct2 implements AbstractProduct{

  public void printName(){

    System.out.println(“ConcreteProduct2?/st1:chmetcnv>);

}

}

 

2.2.3. 抽象工厂Q?/span> AbstractFactory

public interface AbstractFactory {

  public AbstractProduct factoryMethod();

}

2.2.4. 具体工厂Q?/span> ConcreteFactory1 ?/span> ConcreteFactory2

public class ConcreteFactory1 implements AbstractFactory{

  public AbstractProduct factoryMethod(){

//do something.

return new ConcreteProduct1();

}

}

 

public class ConcreteFactory2 implements AbstractFactory{

  public AbstractProduct factoryMethod(){

//do something.

return new ConcreteProduct2();

}

}

 

3.    模式特点

3.1. 开闭原则(优点Q?/span>

工厂Ҏ模式解决了简单工厂模式的一些缺P是在单工厂模式的基础上发展的?/span>

单工厂模式把所有的重心攑ֈ工厂cMQ一旦向pȝ增加新的产品Q就必须修改工厂c,不满_闭原则;工厂Ҏ模式提供一个抽象的工厂接口Q在不同的品结构上实现不同的品工厂具体类来创层次中的产品Q通常一个具体工厂创Z个具体品。在新增产品的时候,只需要实现新的对应工厂就可以满需要,是符合开闭原则的?/span>

 

3.2. ~点

  1. 相比单工厂模式,工厂Ҏ模式客户端编E复杂,每个产品的创建都需要实例化对应的工厂类?/span>
  2. 相对的扩展性,当需要修改品结构中的对各品的时候,需要修改各个工厂(当然也可以直接新加入很多新的产品和工厂,但这样不是又增加了很多无用的遗留cdQ而且现实中很可能要修改客L代码了。)Q而简单工厂模式仍然只要修改一个工厂类?/span>
  3. 现实中常常要使用退化模式,失去多态性。实际设计中l常会有子类新增功能Q那么在对应工厂生该类的时候就需要直接返回该具体c,而不是抽象品,不然p向下转型了?/span>

 

 

4.    与其它模式的关系

工厂Ҏ模式与模板模?/span>

 

5.    参?/span>

?/span> java 设计模式?/span> 阎宏 电子工业出版C?/span>



阿卜 2007-02-28 00:51 发表评论
]]>
单工厂模式Simple Factoryhttp://www.aygfsteel.com/zpuser/archive/2007/02/27/101035.html阿卜阿卜Tue, 27 Feb 2007 15:32:00 GMThttp://www.aygfsteel.com/zpuser/archive/2007/02/27/101035.htmlhttp://www.aygfsteel.com/zpuser/comments/101035.htmlhttp://www.aygfsteel.com/zpuser/archive/2007/02/27/101035.html#Feedback0http://www.aygfsteel.com/zpuser/comments/commentRss/101035.htmlhttp://www.aygfsteel.com/zpuser/services/trackbacks/101035.html      单工厂模式也叫静态工厂方法模式(Static Factory MethodQ,是由一个工厂对象隐藏ƈ军_产品cȝ具体创徏的一U创建模式。是工厂Ҏ模式的一U特例?br />
什么时候用?
1、创ZcL公共接口或父cȝ对象Qƈ要求隐藏具体实现?br />2、隐藏子cȝ创徏Q提高扩展性?br />
优点Q隐藏具体品的创徏Q客L独立的创Z品而不用关心具体的创徏q程Qƈ在引入新的品类时不用修改客戯用类?br />~点Q所用品的创徏集中到factory上,成ؓpȝ的中心,一旦factory出现问题整个pȝ崩溃?br />
标准单工厂模?/strong>

标准单工厂模? src=

工厂c?/p>
package  pattern.simplefactory;

/**
 * 单工厂模式-工厂c?br /> 
@author  ZhangPu
 
*/


public   class  ProductFactory  {
    
/**
     * 单工厂方法:通过cd路径创徏产品
     * 
@param  className
     * 
@return
     
*/

    
public   static  Product factory(String className) {
        Product product 
=   null ;
        
try   {
            product 
=  (Product)Class.forName(className).newInstance();
        }
  catch  (Exception e)  {
            
throw   new  RuntimeException(e);
        }

        
return  product;
    }


}


抽象产品接口
package pattern.simplefactory;

/**
 * 产品接口
 
*/

public interface Product {
    
public String getName();    
}


具体产品c?br />
package pattern.simplefactory;

/**
 * 普通?br /> 
@author ZhangPu
 
*/


public class ConcreteProduct implements Product {
    
private String name = "普通?/span>";

    
public String getName() {
        
return name;
    }

}

客户端类
package pattern.simplefactory;

/**
 * client class
 
@author ZhangPu
 
*/


public class Client {
    
public static void main(String[] args) {
        Product product 
= ProductFactory.factory("pattern.simplefactory.ConcreteProduct");
        System.out.println(product.getName());
    }

}


合ƈ抽象产品和品的单工厂模?br />


合ƈ产品和工厂的模式



h意与单例模式的区别:
1.单例模式构造函数是U有的,不允许外界创建?br />2.单例模式只有一个实例?/font>



阿卜 2007-02-27 23:32 发表评论
]]>
多例模式Multitonhttp://www.aygfsteel.com/zpuser/archive/2007/02/22/100373.html阿卜阿卜Thu, 22 Feb 2007 13:45:00 GMThttp://www.aygfsteel.com/zpuser/archive/2007/02/22/100373.htmlhttp://www.aygfsteel.com/zpuser/comments/100373.htmlhttp://www.aygfsteel.com/zpuser/archive/2007/02/22/100373.html#Feedback0http://www.aygfsteel.com/zpuser/comments/commentRss/100373.htmlhttp://www.aygfsteel.com/zpuser/services/trackbacks/100373.html
应用实例Q序列键值生成器

本例采用hqldb作ؓ演示数据库。表l构如下Q?br />
CREATE TABLE KEYTABLE(
  KEYNAME VARCHAR(32) NOT NULL PRIMARY KEY,
  KEYVALUE int NOT NULL
)



package pattern.multiton;

import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

/*
 * Key service<br>
 * table strunction:<br/>
 * CREATE TABLE KEYTABLE(<br/>
 * KEYNAME VARCHAR(32) NOT NULL PRIMARY KEY,<br/>
 * KEYVALUE int NOT NULL<br/>
 * )<br>
 @author ZhangPu
 Feb 22, 2007 4:30:47 PM
 
*/


public class KeyService {

    
private int cache;
    
private String keyName;
    
    
private int maxValue;
    
private int nextValue;
    
    
public KeyService(int cache,String keyName) {
      
this.cache = cache;
      
this.keyName = keyName;
      retrieveKey();
    }


    
/**
     * get next key form keyinfo
     * 
     * 
@return
     
*/

    
public int getNextKey() {
        
if(nextValue >= maxValue){
            retrieveKey();
        }

        
return nextValue++;
    }

    
    
/**
     * retrieve current value form db.
     * 
@return
     
*/

    
private void retrieveKey(){
        System.out.println(
"retrieve database!");
        
        String sqlUpdate 
= "update KEYTABLE set KEYVALUE = KEYVALUE + " + cache + " where KEYNAME = '"+keyName+"'"
        String sqlSelete 
= "select KEYVALUE from KEYTABLE where KEYNAME = '"+keyName+"'";
        
        Connection conn 
= null;
        Statement stmt 
= null;
        
int keyFormDb = 0;
        
try{
            Driver driver 
= (Driver)Class.forName("org.hsqldb.jdbcDriver").newInstance();
            DriverManager.registerDriver(driver);
            
            String url 
= "jdbc:hsqldb:hsql://localhost/pattern";
            String user 
= "sa";
            String passwd 
= "";
            conn 
= DriverManager.getConnection(url,user,passwd);
            stmt 
= conn.createStatement();
            stmt.executeUpdate(sqlUpdate);
            ResultSet rs 
= stmt.executeQuery(sqlSelete);
            
if(rs != null && rs.next()){
                keyFormDb 
= rs.getInt(1);
            }

            
        }
catch(Exception e){
            
try {
                stmt.close();
                conn.close();
            }
 catch (Exception ex) {
                ex.printStackTrace();
            }

            e.printStackTrace();
        }


        maxValue 
= keyFormDb;
        nextValue 
= keyFormDb - cache;

    }

    

}



package pattern.multiton;

import java.util.HashMap;
import java.util.Map;

/*
 * KeyGenerator with multiton pattern
 @author ZhangPu
 Feb 22, 2007 5:55:24 PM
 
*/

public class KeyGenerator {
    
    
/**
     * save keyServices
     
*/
    
private static Map<String,KeyGenerator> KeyGenerators = new HashMap<String,KeyGenerator>();
    
/**
     * the current instance.
     
*/
    
private KeyService keyService;
    
/**
     * cache pool size
     
*/
    
private static final int KEY_CACHE = 20;
    
    
private KeyGenerator(){}
    
    
private KeyGenerator(String keyName){
         keyService 
= new KeyService(KEY_CACHE,keyName);
    }
    
    
/**
     * Multiton instance
     * 
@param keyName
     * 
@return
     
*/
    
public synchronized static KeyGenerator getInstance(String keyName){
        
        KeyGenerator keyGenerator;
        
if(KeyGenerators.containsKey(keyName)){
            keyGenerator 
= KeyGenerators.get(keyName);
        }
else{
            keyGenerator 
= new KeyGenerator(keyName);
            KeyGenerators.put(keyName, keyGenerator);
        }
        
return keyGenerator;
    }
    
    
/**
     * business method.
     * 
@return
     
*/
    
public int getNextKey(){
        
return keyService.getNextKey();
    }
    
    
}

package pattern.multiton;

/*
 @author ZhangPu
 Feb 22, 2007 6:27:22 PM
 
*/


public class Client {

    
public static void main(String[] args) {
        String keyName 
= "SYS_RESOURCE";
        KeyGenerator keyGenerator 
= KeyGenerator.getInstance(keyName);
        
        
for(int i=0;i<20;i++){
            System.out.println(
"time"+(i+1)+":"+keyGenerator.getNextKey());
        }

    }

}



阿卜 2007-02-22 21:45 发表评论
]]>
单例模式Singletonhttp://www.aygfsteel.com/zpuser/archive/2007/02/22/100359.html阿卜阿卜Thu, 22 Feb 2007 10:48:00 GMThttp://www.aygfsteel.com/zpuser/archive/2007/02/22/100359.htmlhttp://www.aygfsteel.com/zpuser/comments/100359.htmlhttp://www.aygfsteel.com/zpuser/archive/2007/02/22/100359.html#Feedback0http://www.aygfsteel.com/zpuser/comments/commentRss/100359.htmlhttp://www.aygfsteel.com/zpuser/services/trackbacks/100359.html阅读全文

阿卜 2007-02-22 18:48 发表评论
]]>
[原]JAVA关键?finalhttp://www.aygfsteel.com/zpuser/archive/2007/02/10/99196.html阿卜阿卜Sat, 10 Feb 2007 15:56:00 GMThttp://www.aygfsteel.com/zpuser/archive/2007/02/10/99196.htmlhttp://www.aygfsteel.com/zpuser/comments/99196.htmlhttp://www.aygfsteel.com/zpuser/archive/2007/02/10/99196.html#Feedback0http://www.aygfsteel.com/zpuser/comments/commentRss/99196.htmlhttp://www.aygfsteel.com/zpuser/services/trackbacks/99196.html ?/span> JAVA 语言中,有很多特D的关键字( final,static,super,supert,this {)是每?/span> JAVA E序员必d该搞清楚的,不仅在实际开发中会用刎ͼ而v也是面试或考试题里面青睐的考点之一?/span>

本文是自己关于关键字 final 的一些ȝ?/span> final 关键字主要应用在标志和声明类Q成员变量和ҎZ可变Q通过q个基本定义可以扩展?/span> final 可以限制cdҎ的承关pR?/span>

 

final 变量

final 变量分ؓ单变量和对象变量。声?/span> final 的简单变量,表示该变量从初始化后其|单变量直接存储|而不是引用)׃会改变,需要注意的是在使用其他cL供的 public ?/span> final 单变量的时候,q其他cL变了其定义ƈ重新~译Q用的cd重新~译前该值是不会改变的(参考: http://blog.csdn.net/daniel112/archive/2006/10/11/1330255.aspx Q。声明ؓ final 的对象变量表CZ旦初始化其引用不会改变?/span>

final 变量初始化化可以在声明时或构造函C完成?/span>

Public  class  MyFinalTest{

  
/**  声明时候直接初始化  */

  Public 
final  String FINAL_STR  =  “final_str?

  
/**  在构造函C初始化?/span> */

  Private 
final  String FINAL_STR1;

 

  Public MyFinalTest(){

    FINAL_STR1 
=  “asdfasd?

}

}

final c?/span>

定义?/span> final 的类表示该类不能被承,也就是说该类是一个功能设计完成,不在需要扩展的cR同时该成员Ҏ也对应默认标志ؓ final Q成员变量随定义而定?/span>

 

Public  final   class  FinalClass{

  Public 
void  method1(){}

  
/**

  * 没有必要加关键字final

  
*/

  Public 
final   void  method2(){}

}

 

final Ҏ

定义?/span> final 的方法表CҎ不能被子c覆写( override Q?/span>



阿卜 2007-02-10 23:56 发表评论
]]>
[转] Servlet,Filter的url-pattern详解http://www.aygfsteel.com/zpuser/archive/2007/01/30/96761.html阿卜阿卜Tue, 30 Jan 2007 09:01:00 GMThttp://www.aygfsteel.com/zpuser/archive/2007/01/30/96761.htmlhttp://www.aygfsteel.com/zpuser/comments/96761.htmlhttp://www.aygfsteel.com/zpuser/archive/2007/01/30/96761.html#Feedback0http://www.aygfsteel.com/zpuser/comments/commentRss/96761.htmlhttp://www.aygfsteel.com/zpuser/services/trackbacks/96761.html Servlet ?/span> filter ?/span> J2EE 开发中常用的技术,使用方便Q配|简单,老少皆宜。估计大多数朋友都是直接配置用,也没有关心过具体的细节,今天遇到一个问题,上网查了 servlet 的规范才发现Q?/span> servlet ?/span> filter 中的 url-pattern q是有一些文章在里面的,ȝ了一些东西,攑և来供大家参考,以免遇到问题又要费旉?/span>

    一Q?/font> servlet 容器?/span> url 的匹配过E:

     

当一个请求发送到 servlet 容器的时候,容器先会请求的 url 减去当前应用上下文的 路径 作ؓ servlet 的映?/span> url Q比如我讉K的是 http://localhost/test/aaa.html Q我的应用上下文?/span> test Q容器会?/span> http://localhost/test LQ剩下的 /aaa.html 部分拿来?/span> servlet 的映匹配。这个映匹配过E是有顺序的Q而且当有一?/span> servlet 匚w成功以后Q就不会ȝ会剩下的 servlet 了( filter 不同Q后文会提到Q。其匚w规则和顺序如下:

1.     _路径匚w。例子:比如 servletA ?/span> url-pattern ?/span> /test Q?/span> servletB ?/span> url-pattern ?/span> /* Q这个时候,如果我访问的 url ?/span> http://localhost/test Q这个时候容器就会先 q行_路径匚wQ发?/span> /test 正好?/span> servletA _匚wQ那么就去调?/span> servletA Q也不会ȝ会其他的 servlet 了?/span>

2.     最长\径匹配。例子: servletA ?/span> url-pattern ?/span> /test/* Q?/span> servletB ?/span> url-pattern ?/span> /test/a/* Q此时访?/span> http://localhost/test/a Ӟ容器会选择路径最长的 servlet 来匹配,也就是这里的 servletB ?/span>

3.     扩展匚wQ如?/span> url 最后一D包含扩展,容器会Ҏ扩展选择合适的 servlet 。例子: servletA ?/span> url-pattern Q?/span> *.action

4.     如果前面三条规则都没有找C?/span> servlet Q容器会Ҏ url 选择对应的请求资源。如果应用定义了一?/span> default servlet Q则容器会将h丢给 default servlet Q什么是 default servlet Q后面会Ԍ ?/span>

      Ҏq个规则表,p很清楚的知道 servlet 的匹配过E,所以定?/span> servlet 的时候也要考虑 url-pattern 的写法,以免出错?/span>

      对于 filter Q不会像 servlet 那样只匹配一?/span> servlet Q因?/span> filter 的集合是一个链Q所以只会有处理的顺序不同,而不会出现只选择一?/span> filter ?/span> Filter 的处理顺序和 filter-mapping ?/span> web.xml 中定义的序相同?/span>

    二,url-pattern 详解

         ?/span> web.xml 文g中,以下语法用于定义映射Q?/span>

l  ?/span> ??/span> 开头和?/span> ?*?/span> l尾的是用来做\径映的?/span>

l  以前~ ?.?/span> 开头的是用来做扩展映射的?/span>

l  ?? 是用来定?/span> default servlet 映射的?/span>

l  剩下的都是用来定义详l映的。比如: /aa/bb/cc.action

所以,Z么定?/span> ?*.action?/span> q样一个看h很正常的匚w会错Q因个匹配即属于路径映射Q也属于扩展映射Q导致容器无法判断?/span>



阿卜 2007-01-30 17:01 发表评论
]]>
MyEclipse各版本破解源代码http://www.aygfsteel.com/zpuser/archive/2007/01/04/91833.html阿卜阿卜Thu, 04 Jan 2007 12:20:00 GMThttp://www.aygfsteel.com/zpuser/archive/2007/01/04/91833.htmlhttp://www.aygfsteel.com/zpuser/comments/91833.htmlhttp://www.aygfsteel.com/zpuser/archive/2007/01/04/91833.html#Feedback0http://www.aygfsteel.com/zpuser/comments/commentRss/91833.htmlhttp://www.aygfsteel.com/zpuser/services/trackbacks/91833.html public   class  Main {
    
private   static   final  String L  =   " Decompiling this copyrighted software" + "is a violation of both your" +  "license agreement and the Digital Millenium Copyright Act of 1998" +  "(http://www.loc.gov/copyright/legislation/dmca.pdf)." + "Under section 1204 of the DMCA, penalties range up to" + "a $500,000 fine or up to five years imprisonment for "+ "a first offense. Think about it; pay for a license,"+ "avoid prosecution, and feel better about yourself. " ;

    
public   static   void  main(String[] args) {
        String userId 
=   " zhangpu " ; // mLR8ZC-056-55-4467865306604733
        
//  MyEclipse4.1 GA
        
//  其中491(4.9.1)/400(4.0)/401(4.1)/501(5.1.0)Q?)内ؓ版本P9912310代表注册码过期时?099/12/31
        String need  =  userId.substring( 0 1 +   " YE3MP-501-00-9912310 " ;
        
//  MyEclipse4.0.0 GA
        
//  String need = userId.substring(0,1) + "YE3MP-400-01-9912310";
        
//  MyEclipse4.9.1
        
//  String need = userId.substring(0,1) + "YE3MP-491-01-9912310";
        
//  MyEclipse5.1.0 GA
        
//  String need = userId.substring(0,1) + "YE3MP-501-00-9912310";
        String dx  =  need  +  L  +  userId;
        
int  suf  =  decode(dx);
        
//  System.out.println("SUF:"+suf);
        String code  =  need  +  suf;
        System.out.println(change(code));
    }

    
static   int  decode(String s) {
        
int  i  =   0 ;
        
char  ac[]  =  s.toCharArray();
        
int  j  =   0 ;
        
for  ( int  k  =  ac.length; j  <  k; j ++ ) {
            i 
=   31   *  i  +  ac[j];
        }
        
return  Math.abs(i);
    }

    
static  String change(String s) {
        
byte  abyte0[]  =  s.getBytes();
        
char  ac[]  =   new   char [s.length()];
        
int  i  =   0 ;
        
for  ( int  k  =  abyte0.length; i  <  k; i ++ ) {
            
int  j  =  abyte0[i];
            
if  (j  >=   48   &&  j  <=   57 )
                j 
=  ((j  -   48 +   5 %   10   +   48 ;
            
else   if  (j  >=   65   &&  j  <=   90 )
                j 
=  ((j  -   65 +   13 %   26   +   65 ;
            
else   if  (j  >=   97   &&  j  <=   122 )
                j 
=  ((j  -   97 +   13 %   26   +   97 ;
            ac[i] 
=  ( char ) j;
        }
        
return  String.valueOf(ac);
    }
}



阿卜 2007-01-04 20:20 发表评论
]]>
【原创】装饰模式Decoratorhttp://www.aygfsteel.com/zpuser/archive/2006/12/24/89742.html阿卜阿卜Sun, 24 Dec 2006 06:36:00 GMThttp://www.aygfsteel.com/zpuser/archive/2006/12/24/89742.htmlhttp://www.aygfsteel.com/zpuser/comments/89742.htmlhttp://www.aygfsteel.com/zpuser/archive/2006/12/24/89742.html#Feedback0http://www.aygfsteel.com/zpuser/comments/commentRss/89742.htmlhttp://www.aygfsteel.com/zpuser/services/trackbacks/89742.html
1.什么时候?/b>
  1. 需要动态的扩展一个类Q这些扩展也可以动态的撤销Qƈ保持原有cȝ静态定义的情况?/li>
  2. 需要增加由一些基本功能排列组合贰产生的非常强大的功能Qƈ使承关pd得不实现Q典型的Wrapper应用?/li>
模拟cdQ?br />

在装饰模式中的各个角色有Q?/p>

  • 抽象构gQComponentQ角Ԍl出一个抽象接口,以规范准备接攉加责ȝ对象?
  • 具体构gQConcrete ComponentQ角Ԍ定义一个将要接攉加责ȝcR?
  • 装饰QDecoratorQ角Ԍ持有一个构ӞComponentQ对象的实例Qƈ定义一个与抽象构g接口一致的接口?
  • 具体装饰QConcrete DecoratorQ角Ԍ负责l构件对?贴上"附加的责仅R?/li>

2.CZ代码

在一个实际的目中,l部分用户增加了一个网l硬盘的服务。要对原来的用户注册Ҏq行扩展完成注册的时候给用户开通和l定|络盘的功能,又要保持原来注册的功能。我考虑使用decorator模式d一个装饰的用户理cL展原有的理cL实现?br />
/**
 * 用户理抽象接口QComponentQ?br /> 
*/
public interface UserManager{
  
public void register(User user);
}

/**
 *  原有用户理具体c(Concrete ComponentQ?br /> 
*/
public class DefaultUserManager implements UserManager{
   
public void register(User user){
       
//常规注册实现
   }
}

/**
 * 用户理具体装饰cNetDiskManager(只有一个装饰对象的情况Q装饰类和具体装饰类合ƈ)
 
*/
public class NetdiskUserManager implements UserManager{
  
private UserManager userManager;
  
public NetdiskUserManager(UserManager userManager){
    
this.userManager = userManager;
  }

  
public void register(User user){
    bandingNetdisk(user);
    userManager.register(user);
  }
 
  
private void bandingNetdisk(User user){
    
//实现l定|络盘服务?/span>
  }
}


3.在JDK-io包中的应?/b>

在jdk-io包中标准输入输出等相关cd都大量用了Decorator模式。如OutputStream与其相关子类的实现?br />

请参考:http://redlly.blog.hexun.com/2545654_d.html


4.使用装饰模式的优点和~点

使用装饰模式主要有以下的优点Q?/font>

  1. 装饰模式与承关pȝ目的都是要扩展对象的功能Q但是装饰模式可以提供比l承更多的灵zL?
  2. 通过使用不同的具体装饰类以及q些装饰cȝ排列l合Q设计师可以创造出很多不同行ؓ的组合?
  3. q种比承更加灵zL动的Ҏ,也同时意味着装饰模式比承更加易于出错?/li>

使用装饰模式主要有以下的~点Q?/strong>

׃使用装饰模式Q可以比使用l承关系需要较数目的cR用较的c,当然使设计比较易于进行。但是,在另一斚wQ用装饰模式会产生比用承关pL多的对象。更多的对象会得查错变得困难,特别是这些对象看上去都很相像?/p>
5.使用装饰模式的讨?/b>

大多数情况下Q装饰模式的实现都比上面定义中给出的C意性实现要单。对模式q行化时需要注意以下的情况Q?/p>

Q?Q一个装饰类的接口必M被装饰类的接口相宏V?/p>

Q?Q尽量保持Component作ؓ一??c,不要把太多的逻辑和状态放在Componentc里?/p>

Q?Q如果只有一个ConcreteComponentc而没有抽象的Componentc(接口Q,那么Decoratorcȝ常可以是ConcreteComponent的一个子cR?/p>

Q?Q如果只有一个ConcreteDecoratorc,那么没有必要徏立一个单独的Decoratorc,而可以把Decorator和ConcreteDecorator的责dq成一个类?/span>

透明的装饰模?/font>

所谓透明是指对客LE序员来说是针对接口~程Q而不是具体的l承或实现类。引用R博士的《java与模式》的说法是:?span id="lblContent">必须永远把孙悟空的所有变化都当成孙悟I来对待Q而如果把老孙变成的雀儿当成雀儿,而不是老孙Q那p老孙骗了Q而这是不应当发生的?/span>?/p>

下面的做法是对的Q?/p>

Component c = new ConcreteComponent()Q?br />Component c1 = new ConcreteDecorator1(c)Q?br />Component c2 = new ConcreteDecorator(c1)Q?br />

而下面的做法是不对的Q?p>
ConcreteComponent c = new ConcreteDecorator()Q?br />

半透明的装饰模?/font>

然而,Ua的装饰模式很难找到。装饰模式的用意是在不改变接口的前提下,增强所考虑的类的性能。在增强性能的时候,往往需要徏立新的公开的方法。即 便是在孙大圣的系l里Q也需要新的方法。比如齐天大圣类q没有飞行的能力Q而雀儿有。这意味着雀儿应当有一个新的fly()Ҏ?/p>

q就D了大多数的装饰模式的实现都是"半透明"Qsemi-transparentQ的Q而不是完?透明"的。换a之,允许装饰模式改变接口Q? 增加新的Ҏ。即声明ConcreteDecoratorcd的变量,从而可以调用ConcreteDecoratorcM才有的方法:

齐天大圣 c = new 大圣本尊()Q?br />雀儿 bird = new 雀?c)Q?br />bird.fly()Q?/span>

齐天大圣接口Ҏ没有fly()q个ҎQ而雀儿接口里有这个方法?/p>


参考:

《java与模式?/p>

google搜烦Q?java decorator"









阿卜 2006-12-24 14:36 发表评论
]]>
serialVersionUID 是什?/title><link>http://www.aygfsteel.com/zpuser/archive/2006/09/24/71584.html</link><dc:creator>阿卜</dc:creator><author>阿卜</author><pubDate>Sun, 24 Sep 2006 09:54:00 GMT</pubDate><guid>http://www.aygfsteel.com/zpuser/archive/2006/09/24/71584.html</guid><wfw:comment>http://www.aygfsteel.com/zpuser/comments/71584.html</wfw:comment><comments>http://www.aygfsteel.com/zpuser/archive/2006/09/24/71584.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/zpuser/comments/commentRss/71584.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/zpuser/services/trackbacks/71584.html</trackback:ping><description><![CDATA[     摘要: serialVersionUID作用Q?<br>序列化时Z保持版本的兼Ҏ,卛_版本升时反序列化仍保持对象的唯一性?  <a href='http://www.aygfsteel.com/zpuser/archive/2006/09/24/71584.html'>阅读全文</a><img src ="http://www.aygfsteel.com/zpuser/aggbug/71584.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/zpuser/" target="_blank">阿卜</a> 2006-09-24 17:54 <a href="http://www.aygfsteel.com/zpuser/archive/2006/09/24/71584.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【原创】Spring邮g抽象?javamail发送Emailhttp://www.aygfsteel.com/zpuser/archive/2006/07/23/59651.html阿卜阿卜Sun, 23 Jul 2006 07:23:00 GMThttp://www.aygfsteel.com/zpuser/archive/2006/07/23/59651.htmlhttp://www.aygfsteel.com/zpuser/comments/59651.htmlhttp://www.aygfsteel.com/zpuser/archive/2006/07/23/59651.html#Feedback0http://www.aygfsteel.com/zpuser/comments/commentRss/59651.htmlhttp://www.aygfsteel.com/zpuser/services/trackbacks/59651.html在最q的一个网站项目中Q需求要求注册验证用邮Ӟ当然q个很常见哈Q,我们开发用的是spring+hibernate+struts+jstlQ所有我惛_的用spring的邮件抽象层l合javamail来发送邮件。具体的文档说明可以参?a target="_blank">Spring Framework 开发参考手?/a> 的第17章。具体代码如下(实现很简单的发送)Q?br />
1.邮g发送service的接口MailService.java

 1 package  com.justinmobile.payease.base.service;
 2
 3 import  javax.mail.internet.MimeMessage;
 4
 5 import  com.justinmobile.payease.base.PayeaseException;
 6
 7 /**
 8  *TODO
 9  * @author :zpu
10  *2006-7-11 13:40:31
11   */

12
13 public   interface  MailService  {
14     
15      /**
16      * l单个邮发送简单注册验证邮?br /> 17      *  @param  to
18      *  @param  content
19      *  @throws  PayeaseException
20       */

21      public   void  send(String to,String content)  throws  PayeaseException;
22
23      /**
24      * 使用MimeMessage发送邮?br /> 25      *  @param  message
26      *  @throws  PayeaseException
27       */

28      public   void  send(MimeMessage message)  throws  PayeaseException;
29 }

30

2.邮g发送service的接口的实现c:MailServiceImp.java
 1package com.justinmobile.payease.base.service;
 2
 3import javax.mail.internet.MimeMessage;
 4
 5import org.springframework.mail.MailException;
 6import org.springframework.mail.SimpleMailMessage;
 7import org.springframework.mail.javamail.JavaMailSender;
 8
 9import com.justinmobile.payease.base.PayeaseException;
10
11/**
12 *TODO
13 *@author:zpu
14 *2006-7-11 13:47:01
15 */

16
17/**
18 * @author Home.zhang
19 *
20 */

21public class MailServiceImp implements MailService {
22    
23    /** Spring的JavaMail实现 */
24    private JavaMailSender mailSender;
25    /** 单邮件内容对象?/span>*/
26    private SimpleMailMessage mailMessage;
27    
28    public void setMailMessage(SimpleMailMessage mailMessage) {
29        this.mailMessage = mailMessage;
30    }

31
32    public void setMailSender(JavaMailSender mailSender) {
33        this.mailSender = mailSender;
34    }

35
36    public MailServiceImp() {
37        super();
38    }

39
40    public void send(String to, String content) throws PayeaseException {
41        try{
42            mailMessage.setTo(to);
43            mailMessage.setText(content);
44            mailSender.send(mailMessage);
45        }

46        catch(MailException ex) {
47            throw new PayeaseException("base.mailservice.send");            
48        }

49
50    }

51
52    public void send(MimeMessage message) throws PayeaseException {
53        // TODO Auto-generated method stub
54
55    }

56
57}

58

3.spring 的applicationContext.xml中的配置Q?br />
 1    <!-- 邮g发送?/span>-->
 2    <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
 3        <property name="host" value="mail.server.com" />
 4        <property name="username" value="zpuser" />
 5        <property name="password" value="123456" />
 6        <property name="javaMailProperties">
 7            <props>
 8                <prop key="mail.smtp.auth">true</prop>
 9            </props>
10        </property>
11
12    </bean>
13
14    <bean id="mailMessage" class="org.springframework.mail.SimpleMailMessage">
15        <property name="from" value="payease@justinmobile.com" />
16        <property name="subject" value="PAYEASE注册验证" />
17    </bean>
18
19    <bean id="mailService" class="com.justinmobile.payease.base.service.MailServiceImp">
20        <property name="mailSender" ref="mailSender" />
21        <property name="mailMessage" ref="mailMessage" />
22    </bean>

4.Action中调用:
  省略Q?img src ="http://www.aygfsteel.com/zpuser/aggbug/59651.html" width = "1" height = "1" />

阿卜 2006-07-23 15:23 发表评论
]]>
վ֩ģ壺 | | ƽȪ| | Ϫ| ɽ| | | ˼| | üɽ| | ؿ˹| | | ˱| ո| | κ| տ| | ܿ| ɽ| | ˮ| | ׿| | | ͩ®| ³| | ˮ| | | º| | ¡Ң| | | Ҧ|