装饰者模式
今天在看数据库连接池的时候,里面讲到了装饰者模式的实现过程,个人第一次接触设计模式,所以将思路记录下来。
装饰者模式是什么?
装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。(来自百度)
在代码中怎么实现的?
首先,我们先写一个接口:
public interface Waiter {
void service();
}
这个接口有一个service方法,接下来,我们通过一个类实现这个接口,这个类叫Waitress:
public class Waitress implements Waiter{
@Override
public void service() {
System.out.println("在服务......");
}
}
我们在service中打印出“在服务…”
那么现在我们有一个想法,就是当我们调用service这个方法的时候,不仅让它打印出在服务,还想让它打印出其它的东西,假设我们不知道Waitress这个类在哪里,那么我们就可以使用装饰者模式来实现这个需求。我们需要先创建一个新的类,名字叫做WaitressWrap:
public class WaitressWrap implements Waiter {
Waiter watier1 = null;
public WaitressWrap(Waiter watier) {
this.watier1 = watier;//把接口Waiter中的watier,赋给现在这个类中新建的waiter1
}
@Override
public void service() {
System.out.println("微笑:::");
watier1.service();
}
}
在public的那段代码中,我们将接口Waiter中的watier,赋给现在这个类中新建的waiter1,现在当我们使用WaitressWrap中的service方法的时候,可以发现,我们将会先打印出“微笑:::”,然后再进行原有的service方法。
在测试页面中的代码:
public class MainTest {
public static void main(String[] args){
/*把Waitress传到WaitressWrap中,再调用waitressWrap中的service方法,而waitressWrap中的service方法
在service前面,加了一个System.out.println();
*/
WaitressWrap waitressWrap = new WaitressWrap(new Waitress());
waitressWrap.service();
}
}
运行结果如下所示: