什么是静态代理模式?
为其他对象提供一种代理,以控制对这个对象的访问(例如火车票代售处,就是火车站的代理)。代理对象起到中介作用,可去掉功能服务(退票服务)或增加额外的服务(手续费)。
下面通过代驾这个行为来学习静态代理
1、普通的方式实现静态代理
代码如下:
package com.yuan;
/*
* 实现静态代理对比Thread
* */
//静态代理
public class StaticProxy {
public static void main(String[] args) {
//代理对象 代理 真实对象
Drivers drivers = new Drivers(new You());
drivers.goHome();
}
}
//真实对象:你
class You implements Home{
@Override
public void goHome(){
System.out.println("喝多了,我要回家");
}
}
//代理对象:代驾
class Drivers implements Home{
//代驾需要有你这个人 ,代理对象需要代理一个真实对象
private Home target;
public Drivers(Home target) {
this.target = target;
}
@Override
public void goHome() {
before();
this.target.goHome();//这就是真实对象
after();
}
public void before(){
System.out.println("喝的烂醉如泥");
}
public void after(){
System.out.println("安全到家");
}
}
//共同的接口:家
interface Home{
void goHome();
}
2、通过线程实现静态代理
package com.yuan;
/*
* 实现静态代理对比Thread
* */
//静态代理
public class StaticProxy {
public static void main(String[] args) {
You you = new You();
//使用了lambda表达式
new Thread(()-> System.out.println("喝酒不开车")).start();
new Drivers(you).goHome();
}
}
//真实对象:你
class You implements Home{
@Override
public void goHome(){
System.out.println("喝多了,我要回家");
}
}
//代理对象:代驾
class Drivers implements Home{
//代驾需要有你这个人 ,代理对象需要代理一个真实对象
private Home target;
public Drivers(Home target) {
this.target = target;
}
@Override
public void goHome() {
before();
this.target.goHome();//这就是真实对象
after();
}
public void before(){
System.out.println("喝的烂醉如泥");
}
public void after(){
System.out.println("安全到家");
}
}
//共同的接口:家
interface Home{
void goHome();
}
总结:
真实对象和代理对象都要实现同一个接口。代理对象要代理真实角色。
好处:代理对象可以做很多真实对象做不了的事儿。可以使真实对象可以专注做自己的事情。