※ 静态代理模式
- 先定义一个接口;
- 真实对象和代理对象都要实现同一个接口;
- 代理对象要代理真实对象
- (就是将真实对象作为参数传入代理对象的构造方法)
- 代理对象可以做很多真实对象做不了的事;
- 真实对象可以专注做自己的事;
定义一个宠物类为真实对象,而主人类是代理对象,用主人类代理宠物类的方法:
public class StaticProxy {
public static void main(String[] args) {
Master master = new Master(new Pet());
master.play();
}
}
interface Happy{
//接口定义一个“玩”方法
void play();
}
//真实角色 宠物
class Pet implements Happy{
@Override
public void play() {
System.out.println("拼命拼命耍");
}
}
//代理角色 宠物的主人
class Master implements Happy{
//代理谁(代理的真实角色)
private Happy who;
public Master(Happy who){
this.who = who;//真实对象
}
private void before() {
System.out.println("带狗出门");
}
private void after() {
System.out.println("回家给狗洗澡");
}
@Override
public void play() {
before();
this.who.play();
after();
}
}
/*
输出:
带狗出门
拼命拼命耍
回家给狗洗澡
/*
对于 多线程 的应用:
//创建一个Thread 静态代理Runnable接口
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("今天去哪里玩了呀")
}
}).start();
等同于如下:(使用lambda表达式)
//使用lambda表达式
new Thread(()-> System.out.println("今天去哪里玩了呀")).start();
1.Thread是代理角色;
2.Runnable接口是真实角色;
3.Thread也实现Runnable接口;
3.所以Thread代理Runnable接口实现方法start();
new Thread(()-> System.out.println("今天去哪里玩了呀")).start();
相当于:
new Master(new Pet()).play();
Thread 和 Master 都是代理对象
Runnable 和 Pet 是真实对象