静态代理可以在不改变原有代码的情况下,增加新的功能和操作,对原有对象进行扩展。
静态代理要求真实对象和代理对象都实现同一个接口,由代理对象代理真实角色的接口实现,并在实现前后增加新的操作。

public class StaticProxy{
  public static void main(String[] args){
    Person person = new Person("张三");
    //由代理对象代理真实对象的方法
    new WeddingCompany(person).happyMarry();
  }
}
//要实现的接口
interface Marry{ void happyMarry();}

//真实对象
class Person implements Marry{
  private String name;
  public Person(String name){this.name = name;}
  public void happyMarry(){ //实现接口
    System.out.println(this.name + " is gonna married, Happy!");
  }
}
//代理对象
class WeddingCompany implements Marry{
  private Person person;
  public void WeddingCompany(Person person){ this.person = person; }

  public void happyMarry(){//实现接口的方法
    before();  //代理过程中额外添加的操作
    person.happyMarry();  //真实对象的操作
    after();  //代理过程中额外添加的操作
  }

  public void before(){System.out.println("Before wedding, set up the scene...")}
  public void after(){System.out.println("After wedding, clean up after...");}
}

StaticProxy

在之前的笔记(11)中已经出现过静态代理了,创建多线程的方法中,提到的第一种方法是直接继承Thread类,第二种方法是实现Runnable接口,然后创建Thread类,将待执行线程作为参数传递进去,调用start()方法启动。

public static void main(String[] args) {
        TestThread testThread = new TestThread();//创建真实对象
        new Thread(testThread).start();//由代理对象代理执行
        for (int i = 0; i < 5; i++) {
            System.out.println("main 方法线程: " + i);
        }
    }

实际上这就是静态代理了,TestThread是真实对象,Thread是代理对象,二者都实现了Runnable接口,由Thread类代理执行待执行线程。
静态代理可以做很多真实对象做不了的事情,而真实对象可以专注做自己的事情。