1.什么是代理模式?
提到静态代理模式,就需要了解代理设计模式:
就拿明星与经纪人的关系来说,明星就好比被代理类,明星只需要负责唱歌,表演或给粉丝签名等事务,而类似签合同,面谈,计划日程安排等经纪事务都不需要明星个人去做,可以交给其经纪人来代理完成;
2.代理模式的分类:
- 静态代理模式(静态的定义代理类,编译前定义好):涉及接口的使用
- 动态代理模式(动态的生成代理类):涉及接口,反射,Proxy类的相关api
3.代理模式的应用场景:
- 安全代理:对外隐藏真实的调用者
- 远程代理:通过代理类处理远程方法调用(RMI)
- 延迟加载
4.静态代理模式的实现要求:
- 提供两个真实的具体的类,代理类与被代理类;
- 两个类同时实现同一个接口,接口中定义多个抽象方法(提取代理类,被代理各自的行为任务)
- 代理类一定要由被代理对象的引用,为了能在代理类中调用被代理类的重写接口中的方法
5.具体的代码实现:
- 提供接口:
package Proxy; public interface IStar { //个人签名 void personSignature(); //表演 void show(); //订票 void bookTickets(); //签合同 void signContract(); //日程安排 void schedule(); //面谈 void interview(); }
- 提供被代理类:
package Proxy; //明星类 public class Star implements IStar{ //这里方法体直接写具体了 @Override public void personSignature() { System.out.println("Akun个人限量签名照"); } @Override public void show() { System.out.println("sing dance rap basketball music:Chicken you are so beautiful"); } @Override public void bookTickets() { // TODO Auto-generated method stub } @Override public void signContract() { // TODO Auto-generated method stub } @Override public void schedule() { // TODO Auto-generated method stub } @Override public void interview() { // TODO Auto-generated method stub } }
3.提供代理类:
package Proxy;
//经纪人
public class Agent implements IStar{
private Star star;
public Agent(Star star) {
this.star = star;
}
public Agent() {
}
@Override
public void personSignature() {
star.personSignature();
}
@Override
public void show() {
star.show();
}
@Override
public void bookTickets() {
System.out.println("经纪人预定车票");
}
@Override
public void signContract() {
System.out.println("经纪人谈合同");
}
@Override
public void schedule() {
System.out.println("经纪人安排演唱会");
}
@Override
public void interview() {
System.out.println("经纪人面谈");
}
}
4.测试:
package Proxy;
public class StaticProxyTest {
public static void main(String[] args) {
Agent agent = new Agent(new Star());
agent.personSignature();
agent.show();
agent.interview();
agent.schedule();
agent.signContract();
agent.bookTickets();
}
}