Java设计模式之包装模式
有时候一个对象的方法可能不是我们想要的功能,我们希望能将这个方法覆写。而对于覆写,我们最直白的感觉就是通过子类继承的方式,但是有时候对于使用web开发而言,我们能知道获取对象的实现接口,而真正对象是属于哪个类我们并不知道,例如Connection接口,HttpServletResponse接口这样的,我们并不知道第三方Jar包或者别的框架具体的实现类,那么我们只能通过已知的接口方式来增强或改写某个对象的方法。
通常增强某个对象方法的方式有三种:
⑴ 使用子类继承某个实现类;
⑵ 使用包装设计模式;
⑶ 使用动态代理。
本篇主要讲解包装设计模式,但要知道动态代理是最佳的解决方法。
包装设计模式主要有如下五个步骤:
① 自定义一个类,实现与目标对象(被增强对象)相同的接口。
② 在自定义的类中定义一个成员变量,来记住(指向)目标对象。
③ 定义一个构造函数,用来接收目标对象。
④ 覆盖想增强或改写的方法。
⑤ 对于其他不想增强或改写的方法,使用刚才记住目标对象的成员变量来一一调用目标对象的方法即可。
以数据库连接的Connection接口为例,我们在数据库连接池中给其他方法的Connection对象必须不能是数据库直接提供的Connection对象,因为其close方法会将连接直接销毁,而我们应该返回的是调用close方法能将连接重新放回池子中的Connection对象,所以我们使用一个包装类来封装数据库提供的Connection对象,覆写其close方法,对于其他方法,则直接使用原来的对象去调用,代码如下:
class MyConnection implements Connection{ //包装设计模式的类
private Connection conn;
public MyConnection(Connection conn) { //接收目标对象
this.conn = conn;
} @Override
public void close() throws SQLException {
connectionList.addFirst(this.conn); //调用close方法时只是将连接重新返回池中,而不会销毁
} @Override
public Statement createStatement() throws SQLException {
this.conn.createStatement(); //对于不增强的方法则调用目标对象的方法即可,在MyConnection包装类中其他方法都是这样的
return null;
}
。。。 //以下省略Connection接口中覆写的其他方法,对于不想增强的方法都如上(createStatement方法)所示
} // MyConnection包装类完成
Java设计模式之包装模式的更多相关文章
- JAVA设计模式--装饰器模式
装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰 ...
- java设计模式6--适配器模式(Adapter )
本文地址:http://www.cnblogs.com/archimedes/p/java-adapter-pattern.html,转载请注明源地址. 适配器模式(别名:包装器) 将一个类的接口转换 ...
- Java设计模式——装饰者模式
JAVA 设计模式 装饰者模式 用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式 ...
- 浅析JAVA设计模式之工厂模式(一)
1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...
- 折腾Java设计模式之建造者模式
博文原址:折腾Java设计模式之建造者模式 建造者模式 Separate the construction of a complex object from its representation, a ...
- 折腾Java设计模式之备忘录模式
原文地址:折腾Java设计模式之备忘录模式 备忘录模式 Without violating encapsulation, capture and externalize an object's int ...
- 折腾Java设计模式之状态模式
原文地址 折腾Java设计模式之状态模式 状态模式 在状态模式(State Pattern)中,类的行为是基于它的状态改变的.这种类型的设计模式属于行为型模式.在状态模式中,我们创建表示各种状态的对象 ...
- 折腾Java设计模式之模板方法模式
博客原文地址:折腾Java设计模式之模板方法模式 模板方法模式 Define the skeleton of an algorithm in an operation, deferring some ...
- 折腾Java设计模式之访问者模式
博客原文地址:折腾Java设计模式之访问者模式 访问者模式 Represent an operation to be performed on the elements of an object st ...
随机推荐
- 01--数据库MySQL:【数据库DB】和【数据库管理系统DBMS】 简介
1.数据库DB 数据库:DB(DataBase) 按照一定规则存储在计算机的内部存储设备上被各种用户或者应用共享的数据集合 2.数据库管理系统DBMS 1)数据库管理系统DBMS:DBMS(DataB ...
- Eclipse导入项目常见问题----服务器版本问题02
*有时导入项目时,我们打开build时会看到服务器包上有一个红色的×,和这里JRE System jar包显示的是一个样的,左侧有个红色叉: 解决办法 打开到如下界面,解决步骤如下图: 打开该界面方式 ...
- 模板C++ 03图论算法 1最短路之单源最短路(SPFA)
3.1最短路之单源最短路(SPFA) 松弛:常听人说松弛,一直不懂,后来明白其实就是更新某点到源点最短距离. 邻接表:表示与一个点联通的所有路. 如果从一个点沿着某条路径出发,又回到了自己,而且所经过 ...
- java基础(十四章)
1.Java中的包(package) 2.1 包,对应到磁盘中的文件夹 2.2 新建一个class,默认保存在缺省包中 2.3 声明包的关键字:package package语句,置顶位置 2.4 导 ...
- LoadRunner11_录制Oracle数据库脚本
[oracle环境] ①oracle:无需在本地安装oracle,但是oracle的odbc驱动一定要装:(我的安装路径为 D:\oracle ).安装好后在环境变量 " Path &quo ...
- JAVA优雅停机的实现
最近在项目中需要写一个数据转换引擎服务,每过5分钟同步一次数据.具体实现是启动engine server后会初始化一个ScheduledExecutorService和一个ThreadPoolExec ...
- org.apache.commons.lang3 的随机数生成
apache org.apache.commons.lang3 的随机数生成工具,方便使用. String a12 = RandomStringUtils.random(4, "012345 ...
- jquery $.each 和for 怎么跳出循环
jquery $.each 和for 怎么跳出循环 1.for循环中我们使用continue:终止本次循环计入下一个循环,使用break终止整个循环.2.而在jquery中 $.each则对应的使用r ...
- php Base64编码文件二进制流主要使用
<?php header( "Content-type: image/jpeg"); //$filename='1.jpg'; //$content=file_get_con ...
- cURL的运用,文字替换
<?php /** * 实例描述:在网络上下载一个网页并把内容中的“百度”替换为“谷歌”之后输出 */ $curl_obj = curl_init(); // 初始化 curl_setopt($ ...