黑马程序员技术交流社区

标题: 【石家庄校区】谈一谈装饰者模式和动态代理模式 [打印本页]

作者: HeyPeace    时间: 2018-7-15 17:32
标题: 【石家庄校区】谈一谈装饰者模式和动态代理模式
本帖最后由 小石姐姐 于 2018-7-16 11:49 编辑

Java开发中共有23种设计模式,在开发过程中熟练运用不同的模式可以实现不同的功能,也会极大的简化我们的开发,提高工作效率。目前为止,我已经学习到了两种设计模式——装饰者模式和动态代理模式,那么今天我们先一起来学习装饰者模式吧,好了,废话不多说,开整开整!!为什么会用到装饰者模式?
在正式学习装饰者模式之前,我们首先要明白上面这个问题——为什么用到装饰者模式,或者说装饰者模式能做什么?举个例子吧,比如说你去饭店吃饭,所有的服务员都会为你服务,在我们Java中万事万物皆对象,每一个对象都可以创建一个实体类,那么代码就是下面这样子啦:
[Java] 纯文本查看 复制代码
public interface Waiter{
public void service();
}

因为我们实际开发中是面向接口开发的,这样能提高代码的扩展性,所以我先定义了一个接口,接下来我们再定义一个实现类:
[Java] 纯文本查看 复制代码
public class Waitress implement Waiter{
@Override
public void service(){
System.out.println("服务");
}
}

这样的话,是不是服务员就能为我们服务了。嗯,确实是这样。但是今天你去饭店吃饭了,看到了一个超级漂亮的小姐姐,不过小姐姐一副高冷的样子,让想去要联系方式的你望而却步啊。这个时候你就会想了,要是小姐姐对我笑一笑该多好啊,啧啧啧!好了,擦一擦口水,我们继续回来看实现类的代码。编写测试类,调用实现类会在控制台打印“服务”两个字,但是要是想让小姐姐笑一笑,再提供服务要怎么做呢(说白了现在就是要增强waitress类中的service方法啦)
来看一下现在的需求,现在我们是要增强service方法,那么就要用到装饰者模式了。下面我分别介绍下这种方法:
装饰者模式:
使用条件:
1.增强的类和被增强的类要实现相同的集体口
2.在增强的类中要获得被增强类的引用
下面,我们先写一段代码,之后再看代码分析:
[Java] 纯文本查看 复制代码
public class WaitressWrapper implements Waiter{
        private Waiter waiter;
        public WaitressWrapper(Waiter waiter){
                this.waiter = waiter;
}
        public void service(){
                System.out.println(“微笑…”)
                waiter.service();
        }
}

这个时候,我们再编写一个测试类:
[AppleScript] 纯文本查看 复制代码
public void Test{
Waiter waiter = new WaitressWrapper(new Waitress)
waiter.service();
}

这个时候小姐姐是不是对你微笑了呢,不过话说回来,装饰者模式固然好用,它可以增强某个类中的对象,或者方法,但是也是有弊端的,问题就出在增强类要实现的那个接口,既然要实现某个接口就要重写该接口的所有方法,而没有被增强的方法就要原封不动的重新调用一遍。如果该接口中方法少还好,不然也是一项很大的工程呢。好了,今天装饰者模式就说到这里啦,下次我们讲动态代理哦!






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2