代理模式
概述:为其他对象提供一种代理以控制对这个对象的访问。
示例
张三想吃蛋炒饭 但是因为各种原因不能自己做饭 所以让王五去做蛋炒饭 即王五做的蛋炒饭张三吃
编写做饭接口 需要被代理事情的类型
public interface Food {
public void Cook();
}
编写需要被代理的具体事物 做蛋炒饭
public class EggFriedRice implements Food{
@Override
public void Cook() {
// TODO 自动生成的方法存根
System.out.println("这是需要做的蛋炒饭");
}
}
王五做蛋炒饭 谁来代理(王五)—> 代理什么(做饭) ---->做什么饭(蛋炒饭)
public class WangWu implements Food{
Food food;
@Override
public void Cook() {
// TODO 自动生成的方法存根
food.Cook();
}
public WangWu() {
System.out.println("王五在做蛋炒饭");
//做蛋炒饭
food = new EggFriedRice();
}
}
张三让王五做蛋炒饭
public class ZhangSan {
public static void main(String[] args) {
Food eggF = new WangWu();
eggF.Cook();
}
}
代理模式小结
意图:为其他对象提供一种代理以控制对这个对象的访问。
主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。
何时使用:想在访问一个类时做一些控制。
如何解决:增加中间层。
关键代码:实现与被代理类组合。
应用场景:
1、Windows 里面的快捷方式。
2、spring框架aop面向切面思想。
优缺点:
优点: 1、职责清晰。2、高扩展性。3、智能化。
缺点: 1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂。