设计模式——代理模式

概念

在代理模式中,一个类代表另一个类的功能,在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。主要为其他对象提供一种代理以控制对这个对象的访问。

针对的问题

在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。

何时使用:想在访问一个类时做一些控制。

如何解决:增加中间层。

和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。

涉及角色

抽象角色:声明真实对象和代理对象的共同接口;

代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。

真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。

举例

周杰伦想说话,代理类代理周杰伦说话,表面上是经纪人说话,实际说话的周杰伦。

1
2
3
4
5
//抽象角色
public interface Star
{
public void shuohua();
}
1
2
3
4
5
6
7
8
//真实角色
public class Jay implements Star
{
public void shuohua()
{
System.out.println(" 我是周杰伦");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//代理角色
public class jinjiren implements Star
{
//代理角色里有 star的引用,
private Star star;
public jingjiren()
{ //默认的话就是周杰伦的经纪人。
this.star =new Jay();
}
public jingjiren(Star star)
{
//也可以是任何明星的经纪人
this.star = star;
}
public void shuohua()
{
//经纪人说话就是代理明星说话。
this.star.shuohua();
}
}
1
2
3
4
5
6
7
8
9
public class test
{
public static void main(String[] args)
{
jinjiren proxy =new jinjiren(); //默认是周杰伦的经纪人(代理类)
//虽然说话的经纪人,但是实际是周杰伦在说话。
proxy.shuohua();
}
}

代理模式主要使用了java的多态,实际说话的是被代理类,代理类主要是接活,你让我干活,好,我交给幕后的类去干,你满意就成,那怎么知道被代理类能不能说话呢?只要继承同一个接口就好。