一、包装与继承
* 继承
MyReader //专门用于读取数据的类
|--- MyTextReader
|-- MyBufferTextReader
|-- MyMediaReader
|-- MyBufferMediaReader
|-- MyDataReader
|--MyBufferDataReader
class MyBufferReader
{
MyBufferReade r( MyTextReader text)
{ }
MyBufferReader ( MyMediaReader media)
{ }
}
上面这个类扩展性很差。
* 包装
下面这个类找到其参数的共同类型,通过多态的形式,可以提高扩展性
class MyBufferReader extends MyReader
{
MyBufferReader ( MyReader r)
{ }
}
上面类相应的体系结构如下:
MyReader //专门用于读取数据的类。
|-- MyTextReader
|-- MyMediaReader
|-- MyDataReader
|-- MyBufferReader
包装模式比继承要灵活,避免了继承体系臃肿,且降低了类与类间的关系。
包装类因为增强已有对象,具备的功能和已有的是相同,只不过提供了更强功能,所以包装类和被包装类通常都属于一个体系中。
步骤:
1、定义一个类,实现与被增强相同的接口( 实际通常是继承sun公司已为用户写好的包装类,简化用户代码的书写,参阅filter拦截乱码八 )
2.、在类中定义一个变量,记住被增强对象
3、定义一个构造函数,接收被增强对象
4、覆盖想增强的方法
5、对于不想增强的方法,直接调用目标对象(被增强对象)的方法
实例代码:
Linkedlist list=new LinkedList();
public Connection getConnection() throws SQLException{
if(list.size()<=0){
throw new RuntimeException("数据库线程连接池用完");
}
Connection conn=list.removeFirst(); //用一个线程就减少一个
//增强的关闭线程方法
MyConnection my=new MyConnection(conn);
return my;
//不用线程池时,直接调用Connection.close方法关闭连接,但Connection退回的线程连接并不会退到线程池中,而退到数据库中,所以不能直接用Connection.close(),而要对其方法进行增强。
}
//以下是包装设计模式代码
class MyConnection implements Connection{
private Connection conn;
public MyConnection(Connection conn){
this.conn=conn;
}
public void close(){
list.add(this.conn);
}
/// 5、对于不想增强的方法,直接调用目标对象(被增强对象)的方法
public void commit() throws SQLException{
this.conn.commit();
}
public Statement createStatement() throws SQLException{
return this.conn.createStatement();
}
.。。。。。。。。。。。。。
}
* 继承
MyReader //专门用于读取数据的类
|--- MyTextReader
|-- MyBufferTextReader
|-- MyMediaReader
|-- MyBufferMediaReader
|-- MyDataReader
|--MyBufferDataReader
class MyBufferReader
{
MyBufferReade r( MyTextReader text)
{ }
MyBufferReader ( MyMediaReader media)
{ }
}
上面这个类扩展性很差。
* 包装
下面这个类找到其参数的共同类型,通过多态的形式,可以提高扩展性
class MyBufferReader extends MyReader
{
MyBufferReader ( MyReader r)
{ }
}
上面类相应的体系结构如下:
MyReader //专门用于读取数据的类。
|-- MyTextReader
|-- MyMediaReader
|-- MyDataReader
|-- MyBufferReader
包装模式比继承要灵活,避免了继承体系臃肿,且降低了类与类间的关系。
包装类因为增强已有对象,具备的功能和已有的是相同,只不过提供了更强功能,所以包装类和被包装类通常都属于一个体系中。
步骤:
1、定义一个类,实现与被增强相同的接口( 实际通常是继承sun公司已为用户写好的包装类,简化用户代码的书写,参阅filter拦截乱码八 )
2.、在类中定义一个变量,记住被增强对象
3、定义一个构造函数,接收被增强对象
4、覆盖想增强的方法
5、对于不想增强的方法,直接调用目标对象(被增强对象)的方法
实例代码:
Linkedlist list=new LinkedList();
public Connection getConnection() throws SQLException{
if(list.size()<=0){
throw new RuntimeException("数据库线程连接池用完");
}
Connection conn=list.removeFirst(); //用一个线程就减少一个
//增强的关闭线程方法
MyConnection my=new MyConnection(conn);
return my;
//不用线程池时,直接调用Connection.close方法关闭连接,但Connection退回的线程连接并不会退到线程池中,而退到数据库中,所以不能直接用Connection.close(),而要对其方法进行增强。
}
//以下是包装设计模式代码
class MyConnection implements Connection{
private Connection conn;
public MyConnection(Connection conn){
this.conn=conn;
}
public void close(){
list.add(this.conn);
}
/// 5、对于不想增强的方法,直接调用目标对象(被增强对象)的方法
public void commit() throws SQLException{
this.conn.commit();
}
public Statement createStatement() throws SQLException{
return this.conn.createStatement();
}
.。。。。。。。。。。。。。
}