从一个ConnectionPool的实现看design pattern的运用 (二)

原创 2002年07月22日 10:26:00
 

从一个ConnectionPool的实现看design pattern的运用 ()

好啦,现在让我们看看我们是怎样设计这个ConnectionPool的接口的。

Public interface ConnectionPool{

            Connection getConnection();

            Void clear();

}

当然,这只是一个简化的接口。真正实现时也许我们还会有一些其他的方法。如同时支持同步getConnection()和异步getConnection().

同时,这个返回的Connection必须改写close()方法。原来的close()方法是关闭物理连接,但现在,我们要把这个Connection返还到ConnectionPool. 因此,这个Connection对象必须知道它出身的ConnectionPool.

这样,用户仍然调用Connection.close(), 也不用担心把Connection返还到错误的ConnectionPool.

 

再来看看我们的实现:

public class ConnectionPoolImpl: implements ConnectionPool{

            class PooledConnection implements Connection{

                        private final Connection conn;

                        private Boolean closed;

                        public PooledConnection(Connection conn)

throws SQLException{

                                    this.conn = conn;

                                    closed = conn.isClosed();

                      }

                        public void close(){

                                    if(!closed){

//保证重复调用close()不会把一个connection重复返还。

                                                closeConnection(conn);

                                                closed = true;

                                    }

                      }

                        public Boolean isClosed(){return closed;}

                        public Statement createStatement()

                       throws SQLConnection{

                                    if(isClosed()) throw new SQLException(“Connection closed”);

                                    return conn.createStatement();

                      }

                        public void commit()

                       throws SQLConnection{

                                    if(isClosed()) throw new SQLException(“Connection closed”);

                                    conn.commit();

                      }

                        //其他所有的方法都这样做委托。

            }

public synchronized Connection getConnection(){

                        如果pool里有Connection

pool中去掉一个Connection conn;

clients++;

return new PooledConnection(conn);

                        否则,如果clients<maxClients

                                    生成一个新的连接conn

                                    clients++;

                                    return new PooledConnection(conn);

                        否则,wait(),直到pool中有空闲Connection                             

            }

            //其他的实现都和我们第一章里的代码一样。

}

 

好了,这样,通过内部类PooledConnection这样一个wrapper, 我们就可以实现这个能处理ConnectionPoolConnection.

对了,忘了说了,这个PooledConnection其实就是design pattern里的decorator模式。

 

现在让我们再欣赏一下我们的代码吧。ConnectonPoolImpl提供了一种基于简单策略的ConnectionPool的实现。PooledConnection封装了数据库连接,使之能和ConnectionPool协同工作。

完美吧?

 

 

 

不过,慢着!PooledConnection只是和ConnectionPoolImpl协同工作。张三要写ConnectionPool2还得自己重新实现一个decorator.

怎么样能使不同的ConnectionPool的实现重用我们PooledConnection呢?

 

而且,在所有大约二十个委托函数里,我们都有if(isClosed())……, 是不是很眼熟啊?一个Connection一旦被close()之后,只有在涅磐之后(通过ConnectionPool.getConnection()再次返回),才能使用。而所有对关闭了的Connection的调用,返回结果都是一样的.(不行,不行,不行!)

猜到点什么了吗?对啦,state pattern!

 

 

 

Java设计模式之适配器模式(Adapter Pattern)

Adapter Pattern的作用是在不改变功能的前提下转换接口。Adapter分为两类,一类是Object Adapter, 另一类是Class Adapter。由于Class Adapter的实...
  • tracker_w
  • tracker_w
  • 2014年06月17日 03:39
  • 2396

java 编程中使用Pattern+Matcher 从一个大字符串中提取特定文字

String regex="[0-9]{2}\\:[0-9]{2}\\:[0-9]{2}"; // 提取 xx:xx:xx 也就是时间 Pattern pattern=Pattern.compile(...
  • shmcclmm
  • shmcclmm
  • 2013年01月30日 19:42
  • 3387

【Design Pattern】Builder模式的一种实现

应用场景 如果需要根据多个不同的参数来创建某类的不同对象,很常见的方法是定义多个构造器以供不同场合下的调用。但有一种更好的构造方法,我们可以使用Builder模式来实现(前提是多个构造参数)...
  • moxiaomomo
  • moxiaomomo
  • 2013年05月18日 15:10
  • 1327

设计模式(Design Pattern) - 行为型模式(Behavioral Pattern) - 中介者模式(Mediator) - Java实现

设计模式(Design Pattern) - 行为型模式(Behavioral Pattern) - 中介者模式(Mediator) 中介者封装一系列对象操作,使对象之间不需要显式操作,从而实现耦合...
  • achi010
  • achi010
  • 2017年06月20日 23:31
  • 101

设计模式(Design Pattern) - 行为型模式(Behavioral Pattern) - 策略模式(Strategy) - Java实现

设计模式(Design Pattern) - 行为型模式(Behavioral Pattern) - 策略模式(Strategy) 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可...
  • achi010
  • achi010
  • 2017年06月18日 14:48
  • 130

设计模式(Design Pattern) - 行为型模式(Behavioral Pattern) - 责任链模式(Chain of Responsibility) - Java实现

设计模式(Design Pattern) - 行为型模式(Behavioral Pattern) - 责任链模式(Chain of Responsibility) 在责任链模式里,很多对象由每一个对...
  • achi010
  • achi010
  • 2017年06月16日 21:58
  • 89

设计模式(Design Pattern) - 创建型模式(Creational Pattern) - 原型模式(Prototype) - Java实现

设计模式(Design Pattern) - 创建型模式(Creational Pattern) - 原型模式(Prototype) 用原型实例指定创建对象的种类,并且通过复制这些原型,创建新的对象...
  • achi010
  • achi010
  • 2017年07月02日 22:41
  • 90

设计模式(Design Pattern) - 创建型模式(Creational Pattern) - 工厂模式(FactoryMethod) - Java实现

设计模式(Design Pattern) - 创建型模式(Creational Pattern) - 工厂模式(FactoryMethod) 是一种代替new的操作的一种模式。可以给系统带来更大的可...
  • achi010
  • achi010
  • 2017年07月01日 00:16
  • 86

设计模式(Design Pattern) - 行为型模式(Behavioral Pattern) - 访问者模式(Visitor) - Java实现

设计模式(Design Pattern) - 行为型模式(Behavioral Pattern) - 访问者模式(Visitor) 访问者:表示一个作用于某对象结构中的各元素的操作。可以在不改变各元...
  • achi010
  • achi010
  • 2017年06月20日 00:02
  • 86

design pattern

  • 2013年05月10日 23:08
  • 9.54MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:从一个ConnectionPool的实现看design pattern的运用 (二)
举报原因:
原因补充:

(最多只允许输入30个字)