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 ...
随机推荐
- 开源解析库 - JSON
Json及其实现 JSON作为一种轻量级的数据交换格式,多被用于跨语言通信(比如CPP与PHP之间的数据交互). 至于何为JSON,其详细解释参考 官网. 既然是一种格式,那便必然有相应的编码实现.在 ...
- 从零开始的JS生活(一)——JS简介、变量及基本结构
本K在经过三个静态站制作的狂风暴雨之后,终于开始了JavaScript的学习.作为一只从来没有正儿八经接受过计算机语言的小白,居然能够跟上浩哥的课程进度,我的内心都被我的才智震惊到了,果然本K是天生丽 ...
- linux下mysql重置密码
如果忘记mysql的root密码可以采取下面的步骤重新设置 1.kill掉所有mysql的进程 2.使用--skip-grant-tables的参数启动mysql shell> mysqld_s ...
- blog界面自己写了css,参考了网站设计,想要的自己拿
junhey这就把界面的代码公布下来,可以自己修改额~(ps:麻烦加个友链http://www.cnblogs.com/junhey/ 谢谢) /* 初始化样式 */ html, body, div, ...
- python之numpy库[2]
python-numpy csv文件的写入和存取 写入csv文件 CSV (Comma‐Separated Value, 逗号分隔值),是一种常见的文件格式,用来存储批量数据. 写入csv文件 np. ...
- Android应用安全学习笔记前言
Android是基于Linux kernel的一个自由及开放源代码的操作系统,主要用于移动设备.在2011年第一季度超越了塞班系统跃居了全球第一.本系列作为分享的东西吧.比较基础. 文章也不知道会分为 ...
- [BZOJ4907]柠檬
4709: [Jsoi2011]柠檬 Time Limit: 10 Sec Memory Limit: 128 MB Description Flute 很喜欢柠檬.它准备了一串用树枝串起来的贝壳, ...
- js获取页面宽高
网页可见区域宽:document.body.clientWidth网页可见区域高:document.body.clientHeight网页可见区域宽:document.body.offsetWidth ...
- docker 内部组件结构 -- docker daemon, container,runC
Docker, Containerd, RunC : 从 Docker 1.11 开始, docker 容器运行已经不是简单地通过 Docker Daemon 来启动, 而是集成了Container, ...
- 获取当前 系统时间 + 获取当前URL 键值;
一://系统当前时间 function show(){ var mydate = new Date(); var str = "" + mydate.getFullYear() + ...