所谓代理,就是做自己没能力做或者不想做的事或者是对一个动作进行加强操作,于是找别人做,整个模式三部分:代理人,被代理人,代理人做的事(被代理人想做的事)
https://blog.csdn.net/GDFHGFHGFH/article/details/113434672这是关于装饰者模式的介绍
代理分为静态代理和动态代理,在这里先介绍一下静态代理,静态代理就是创建一个真实存在的类来帮我们做事,缺点就是代码写死了,不能重复利用
静态代理原则:
1.代理人和被代理人实现同样的接口
2.在代理人中传入被代理人的引用
3.代理人要实现被代理人的功能,可以增强,也可以不增强
这个原则看起来与装饰者模式很像,但实际上目的是不同的,假设一个场景:小红想和小明谈谈理想,需要找个房间,但是碍于面子她不能开房间小明,于是让丫鬟帮她开,然后,小红自己和小明去房间里谈理想,结果就是外人认为小丫鬟在和小明谈理想,小红被隐藏了,所以隐藏原来的目标才是静态代理的主要作用
先写一个接口,定义一个谈理想的方法
public interface Happy {
public abstract void talkDream();
}
定义小红实现接口,重写方法
public class XiaoHong implements Happy{
@Override
public void talkDream() {
System.out.println("小红要和小明谈理想");
}
}
定义丫鬟,做小红需要做的事情,进行代理
public class YaHuan implements Happy {
//
XiaoHong xiaoHong;
public YaHuan(XiaoHong xiaoHong)
{
this.xiaoHong=xiaoHong;
}
@Override
public void talkDream() {
System.out.println("丫鬟在开房间");
System.out.println("小红直接去房间");
System.out.println("丫鬟在门外守着");
//小红和小明 谈理想
xiaoHong.talkDream();
//丫鬟打扫战场
System.out.println("丫鬟打扫战场");
}
}
然后开房谈理想,整个过程变成了在外人看来变成了,丫鬟和小明谈理想
public class Xiaoming {
public static void main(String[] args) {
/**
* 小红想和小明谈理想,小红不能自己主动,于是丫鬟去,丫鬟找好地方,看门,小红进去
*/
XiaoHong xiaoHong=new XiaoHong();
//创建一个代理对象,就是丫鬟
YaHuan yaHuan = new YaHuan(xiaoHong);
yaHuan.talkDream();
}
}
静态代理和装饰者模式的异同:
相同:(1)都要实现与目标类相同的接口(2)在类中都要声明增强目标对象(3)都可以在不修改目标类的前提下增强目标方法
不同:(1)装饰者模式主要是为了是为了增强目标方法(2)静态代理是为了隐藏原始对象,增强不是关键,隐藏才是关键