废话一下
上一篇我们说到代理模式,通过 代理模式来实现对实际执行类的保护。如果实际执行类不能满足我们的需求怎么办呢?我需要做一些额外的处理。今天来看看装饰者模式是如何来实现的,同是我们来对比下代理模式和装饰者模式的区别
装饰者模式
1、定义:
动态地给一个对象添加一些额外的职责。就增加功能来说,装饰者模式相比生成子类更为灵活
怎么来理解它呢?举个例子吧,就上篇的代理模式来举例,我想在加载图片前后添加一些额外的处理,这些额外的处理不是ImageLoader的功能,而是我们自主添加的处理,从一定程度上增强或消弱了ImageLoader的功能。
我们来写下代码(咱们仍然沿用上一篇的例子,大家来对比一下区别)
2、步骤
a. 定义一个ImageLoader接口
public interface ImageLoader {
void load(String url);
}
b. 用glide来实现图片加载
public class GlideImageLoader implements ImageLoader {
@Override
public void load(String url) {
//这里实现具体的逻辑
//Glide.with(context).into(imageView)
}
}
c.定义一个ImageLoaderManager
public class ImageLoaderManager implements ImageLoader{
private ImageLoader imageLoader;
public ImageLoaderManager() {
this.imageLoader=new GlideImageLoader();
}
@override
public void loadImage(String url){
//将图片加载转交给ImageLoader的实现类来操作
beforeMethod(url);
if (imageLoader!=null) {
imageLoader.load(url);
}
afterMethod(url);
}
public void beforeMethod(String url){
System.out.println("输出一下图片地址"+url)
}
public void afterMethod(){
System.out.println("随意输出吧")
}
}
d.测试类
public class Test {
public static void main(String[] args){
ImageLoaderManager imageLoaderManager=new ImageLoaderManager();
imageLoaderManager.loadImage("url");
}
}
e.与代理模式对比
- [ ] 1、ImageLoaderManager
//代理模式
public class ImageLoaderManager implements ImageLoader {
private ImageLoader imageLoader;
//代理模式中 ImagerLoader是在ImageLoaderManager中实例化的
//即用户实际上并不需要知道,你用的是什么方式
//当然你在调用处进行初始化也可以啊,不过就与代理模式的初衷违背了
public ImageLoaderManager() {
imageLoader=new GlideImageLoader();
}
@override
public void load(String url){
//将图片加载转交给ImageLoader的实现类来操作
if (imageLoader!=null) {
imageLoader.load(url);
}
}
}
- [ ] 3.差异分析
装饰者模式与代理模式对比:
1、多了两个方法,分别在图片加载前后,我们分别输出了两次日志(为了方便哈,勿怪)
2、其他都一致
关注点
静态代理的关注点是什么?是对于实际实现类的一种保护,
而装饰者模式的关注点是对原有类的增强或消弱
小结
装饰者的思想在于增强/消弱被装饰类的功能,那么我们是否可以直接将被装饰者的实现给替换呢?这又是什么模式呢?我将在下一篇来分享一下 适配器模式