静态代理

三个角色

静态代理的条件至少有三个角色

  1. 真实角色(RealObject)
  2. 代理角色(ProxyObject)
  3. 接口这三个(AbstractObject)

要求

  1. 真实角色与代理角色实现相同的接口。
  2. 代理类要持有真实角色的引用。
    重点:真实角色、代理角色、接口的关系。代理接口实际上是抽象出所有真实角色的共有方法。

用法

1.创建真实角色
2.创建代理角色
3.代理角色.方法()。

注意:代理模式是要让代理类来使用委托类,所以是通过 new 代理类,在代理类中使用委托类,有点像回调函数的用法。

测试方法

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* 功能描述:测试
* @author liukai
* @date 2015年11月13日 下午3:47:33
* @version 1.0
*/
public class Test {
public static void main(String[] args) {
ServiceImpl serviceImpl = new ServiceImpl();
IService iService = (IService) Proxy.getInstance(serviceImpl);
iService.say();
}
}

代理类

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
/**
* 功能描述:代理类
* @author liukai
* @date 2015年11月13日 下午3:47:19
* @version 1.0
*/
public class Proxy implements IService{
private IService iService;

public Proxy() {
}

public Proxy(IService iService) {
this.iService = iService;
}


@Override
public void say() {
System.out.println("Proxy.say()");
iService.say();
}

public static IService getInstance(ServiceImpl object) {
return new Proxy(object);
}
}

实现类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* 功能描述:实现类
* @author liukai
* @date 2015年11月13日 下午3:47:27
* @version 1.0
*/
public class ServiceImpl implements IService{
public ServiceImpl() {
// TODO Auto-generated constructor stub
}

@Override
public void say() {
System.out.println("ServiceImpl.say()");
}
}

接口

1
2
3
4
5
6
7
8
9
/**
* 功能描述:接口
* @author liukai
* @date 2015年11月13日 下午3:47:06
* @version 1.0
*/
public interface IService {
public abstract void say();
}

静态代理类优缺点

  1. 优点:业务类只需要关注业务逻辑本身,保证了业务类的重用性。这是代理的共有优点。

  2. 缺点:

  3. 代理对象的一个接口只服务于一种类型的对象,如果要代理的方法很多,势必要为每一种方法都进行代理,静态代理在程序规模稍大时就无法胜任了。

  4. 如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。增加了代码维护的复杂度。