【代理】代理模式之静态代理

代理模式(Proxy Pattern)是程序设计中的一种常见的设计模式,为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不合适或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

UML类图:

 

组成:

抽象角色:通过接口或抽象类声明真实角色实现的业务方法。如图中Subject。

代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。

真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。
示例:
抽象角色(接口):
1 package com.demo;
2 
3 public interface Subject {
4     
5     public void select();
6     
7     public void save();
8 }

真实角色:

 1 package com.demo;
 2 
 3 public class RealSubject implements Subject {
 4 
 5     @Override
 6     public void select() {
 7         System.out.println("正在执行真实实现类的select()方法");
 8     }
 9 
10     @Override
11     public void save() {
12         System.out.println("正在执行真实实现类的save()方法");
13     }
14  }

代理角色:

 1 package com.demo;
 2 
 3 public class Proxy implements Subject {
 4 
 5     Subject target;
 6 
 7     public Proxy(Subject target) {
 8         this.target = target;
 9     }
10 
11     @Override
12     public void select() {
13         target.select();
14     }
15 
16     @Override
17     public void save() {
18         target.save();
19         System.out.println("正在执行增强实现.....");
20     }
21 }

测试类:

1 package com.demo;
2 
3 public interface ProxyTest {
4     public static void main(String[] args) {
5         Subject subject = new Proxy(new RealSubject());
6         subject.select();
7         subject.save();
8     }
9 }

运行结果:

总结:
优点:
代理对象将客户端与目标对象分离,目标对象只需要关注自身业务逻辑,在一定程度上降低了系统的耦合度。
代理对象可以在客户端和目标对象中启一个中介对象,可以对目标对象进行一定的保护,也可以对功能进行一定的扩展增强。
缺点:
代理对象的一个接口只服务于一种类型的对象,如果要代理的类型很多,势必要为每一种类型的方法都进行代理,静态代理在程序规模稍大时就无法胜任了。
如果接口增加一个方法,除了所有的实现类需要实现这个方法外,所有代理类也需要实现此方法,增加了代码的可维护性。
但是以上缺点,可由动态代理解决。
posted @ 2020-03-13 20:33  墨猴  阅读(267)  评论(0编辑  收藏  举报