前言:不包含动态代理
代理模式
代理模式为其他对象提供一种代理以控制对这个对象的访问。(代理类替代具体的实现类,代理类可根据需求添加内容而不用修改实现类)
- 优缺点
优点:
- 满足了开闭原则
- 可扩展性高(当需求添加内容可通过代理类添加)
- 保护了实现类(可以隐藏并且不用修改),也增强了实现类的功能
缺点:
- 在实现类和调用类之间出现代理类,影响请求速度
- 类的数量增加,程序变得复杂
- 结构
Subject:代理类和实现类的父类
RealSubject:具体的实现类,被代理对象
Proxy:代理类(代理对象,调用时被调用的对象)
- 代码
引用《大话设计模式》中的例子,为人做嫁衣,一位同学想追求李娇娇同学,但是由于含羞,所以请另一位同学代为送礼物
抽出父类
/** * @ Author :fonxi * @ Date :2019/5/13 5:11 * @ Description:代理和被代理对象的共同父类 */ public interface GiveGift { void giveDolls(); void giveFlowers(); void giveChocolate(); }
女孩类
/** * @ Author :fonxi * @ Date :2019/5/13 5:08 * @ Description:女孩 */ public class SchoolGirl { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
被代理对象,实现具体的操作
/** * @ Author :fonxi * @ Date :2019/5/13 5:08 * @ Description:被代理类 追求者类 */ public class Pursuit implements GiveGift{ SchoolGirl mm; public Pursuit(SchoolGirl mm){ this.mm = mm; } @Override public void giveDolls() { System.out.println(mm.getName()+"送你洋娃娃"); } @Override public void giveFlowers() { System.out.println(mm.getName()+"送你鲜花"); } @Override public void giveChocolate() { System.out.println(mm.getName()+"送你巧克力"); } }
代理对象,调用被代理对象的操作,并且可以提供增强的操作
/** * @ Author :fonxi * @ Date :2019/5/13 5:12 * @ Description:代理类 */ public class Proxy implements GiveGift{ Pursuit pursuit; public Proxy(SchoolGirl mm){ pursuit = new Pursuit(mm); } @Override public void giveDolls() { pursuit.giveDolls(); } @Override public void giveFlowers() { pursuit.giveFlowers(); } @Override public void giveChocolate() { pursuit.giveChocolate(); } //代理对象新增的操作 public void giveBook(){ System.out.println("送书"); } }
/** * @ Author :fonxi * @ Date :2019/5/13 5:15 * @ Description:客户端调用类 */ public class TestController { public void print(){ SchoolGirl mm = new SchoolGirl(); mm.setName("李娇娇"); Proxy proxy = new Proxy(mm); proxy.giveDolls(); proxy.giveChocolate(); proxy.giveFlowers(); proxy.giveBook(); } }
- 总结
代理模式可以让具体的操作对象被隐藏,并且可以在不修改操作对象的情况下扩展它的功能。