代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问。
代理分类:
1:远程代理,就是为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实。
2:虚拟代理,根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象。这样可以达到性能优化的目的,比如你打开一个很大的HTML网页,里面有很多文字和图片,但是你可以很快的打开它,此时你看到的是所有的文字,单图片却是一张一张的加载出来的,这就算通过虚拟代理来代替了真实图片,虚拟代理存储了真实照片的路径和尺寸。
3:安全代理,用来控制真实对象访问时的权限,一般用于对象应该有不同的访问权限的时候。
4:智能指引,是指当调用真实的对象时,代理处理另外一些事。
实例UML图:
代码如下:
/**
* @author Shuyu.Wang
* @package:com.shuyu.proxy
* @description:代理接口
* @date 2018-11-12 22:18
**/
public interface IGiveGift {
void giveDolis();
void giveFlowers();
void giveChocolate();
}
/**
* @author Shuyu.Wang
* @package:com.shuyu.proxy
* @description:
* @date 2018-11-12 22:21
**/
@Data
public class SchoolGirl {
private String name;
}
/**
* @author Shuyu.Wang
* @package:com.shuyu.proxy
* @description:代理类锁代理的真实实体
* @date 2018-11-12 22:20
**/
@Slf4j
public class Pursuit implements IGiveGift {
SchoolGirl schoolGirl;
public Pursuit(SchoolGirl schoolGirl) {
this.schoolGirl = schoolGirl;
}
@Override
public void giveDolis() {
log.info(schoolGirl.getName() + "送你洋娃娃");
}
@Override
public void giveFlowers() {
log.info(schoolGirl.getName() + "送你鲜花");
}
@Override
public void giveChocolate() {
log.info(schoolGirl.getName() + "送你巧克力");
}
}
/**
* @author Shuyu.Wang
* @package:com.shuyu.proxy
* @description:代理类
* @date 2018-11-12 22:25
**/
@Slf4j
public class Proxy implements IGiveGift {
Pursuit pursuit;
public Proxy(SchoolGirl schoolGirl) {
pursuit = new Pursuit(schoolGirl);
}
@Override
public void giveDolis() {
pursuit.giveDolis();
}
@Override
public void giveFlowers() {
pursuit.giveFlowers();
}
@Override
public void giveChocolate() {
pursuit.giveChocolate();
}
}
测试类:
@RunWith(SpringRunner.class)
@SpringBootTest
public class ProxyApplicationTests {
@Test
public void contextLoads() {
SchoolGirl schoolGirl=new SchoolGirl();
schoolGirl.setName("测试代理");
Proxy proxy=new Proxy(schoolGirl);
proxy.giveDolis();
proxy.giveFlowers();
proxy.giveChocolate();
}
}
执行结果如下:
2018-11-12 22:34:28.072 INFO 20868 --- [ main] com.shuyu.proxy.Pursuit : 测试代理送你洋娃娃
2018-11-12 22:34:28.072 INFO 20868 --- [ main] com.shuyu.proxy.Pursuit : 测试代理送你鲜花
2018-11-12 22:34:28.072 INFO 20868 --- [ main] com.shuyu.proxy.Pursuit : 测试代理送你巧克力
代码git地址:https://github.com/iot-wangshuyu/designpatterns/tree/master/proxy