.
代理模式:就是为目标对象提供一种代理已达到控制对象真实对象访问的目的
在一些情况下,一些客户不能直接或不想直接访问目标对象,而代理对象则起到在这两者之间的的"中介人"作用.
=========================================================================================
角色描述:
①代理类和目标类共同的接口
②目标类
③代理类
④测试类(非必须)
=========================================================================================案例分析:
1.共同接口
package com.gyoomi.e_staticproxy;
/**
*
* @ClassName: Subject
* @Description: 代理类和抽象类的共同的接口
* @author gyoomi
* @date 2017年9月18日
*
*/
public interface Subject {
public void eat();
}
2.目标类
package com.gyoomi.e_staticproxy;
/**
*
* @ClassName: RealSubject
* @Description: 目标类
* @author gyoomi
* @date 2017年9月18日
*
*/
public class RealSubject implements Subject {
@Override
public void eat() {
System.out.println("real subject eat somethings");
}
}
3.代理类
package com.gyoomi.e_staticproxy;
/**
*
* @ClassName: ProxySubject
* @Description: 代理类(静态代理--->编译前就已存在)
* @author gyoomi
* @date 2017年9月18日
*
*/
public class ProxySubject implements Subject{
//代理类内部包含对真实类的引用
private RealSubject realSubject = new RealSubject();
@Override
public void eat() {
//真实目标类之前做一些其他操作
this.preEat();
//真实目标类要完成的事情
realSubject.eat();
//真实目标类之后做一些其他操作
this.postEat();
}
//前方法
private void preEat() {
System.out.println("before eating...");
}
//后方法
private void postEat() {
System.out.println("after eating...");
}
}
===================================================================================================================================
4:测试类(非必须):
package com.gyoomi.e_staticproxy;
/**
*
* @ClassName: Client
* @Description:客户端测试类
* @author gyoomi
* @date 2017年9月18日
*
*/
public class Client {
public static void main(String[] args) {
Subject proxy = new ProxySubject();
proxy.eat();
}
}
结论:
按照上述的方式(静态代理)使用代理模式,那么真实角色必须是实现已经存在的,并将其作为代理对象的内部属性。
但是实际使用时,一个真实角色必须对应一个代理角色,但如果大量使用会导致类的急剧膨胀;此外,如果事先并不知道真实角色,该如何使用代理呢?接下来就是JDK的动态 代理!!!