代理模式
在代理模式(Proxy Pattern)中,一个类代表另一个类的功能,这种类型的设计模式属于结构型模式。
代理模式通过引入一个代理对象来控制对原对象的访问。代理对象在客户端和目标对象之间充当中介,负责将客户端的请求转发给目标对象,同时可以在转发请求前后进行额外的处理。
在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。
类图示例

举个例子
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| class SchoolGirl{ private String name;
public String getName() { return name; }
public void setName(String name) { this.name = name; } }
interface GiveGift{ void GiveDolls(); void GiveFlowers(); void GiveChocolate(); }
class Pursuit implements GiveGift{ SchoolGirl mm; public Pursuit(SchoolGirl mm){ this.mm = mm; } public void GiveDolls() { System.out.println(mm.getName()+" 送你洋娃娃"); } public void GiveFlowers() { System.out.println(mm.getName()+" 送你鲜花"); } public void GiveChocolate() { System.out.println(mm.getName()+" 送你巧克力"); } }
class ProxyMan implements GiveGift{ Pursuit gg; public ProxyMan(SchoolGirl mm){ this.gg = new Pursuit(mm); } public void GiveDolls() { gg.GiveDolls(); } public void GiveFlowers() { gg.GiveFlowers(); } public void GiveChocolate() { gg.GiveChocolate(); } }
public class Proxy { public static void main(String[] args) { SchoolGirl mm = new SchoolGirl(); mm.setName("zhang3"); ProxyMan li4 = new ProxyMan(mm); li4.GiveDolls(); li4.GiveFlowers(); li4.GiveChocolate(); } }
|
类图

代理模式包含如下角色
- 代理类:实现与真实对象相同的接口,并添加额外的控制逻辑。
- 真实对象:实际执行任务的对象。
模式分析
- 优点
- 职责分离:代理模式将访问控制与业务逻辑分离。
- 扩展性:可以灵活地添加额外的功能或控制。
- 智能化:可以智能地处理访问请求,如延迟加载、缓存等。
- 缺点
- 性能开销:增加了代理层可能会影响请求的处理速度。
- 实现复杂性:某些类型的代理模式实现起来可能较为复杂。