概述
- 代理模式是常用的结构型设计模式之一,当无法直接访问某个对象或访问某个对象存在困难时可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,所访问的真实对象与代理对象需要实现相同的接口。根据代理模式的使用目的不同,代理模式又可以分为多种类型,例如保护代理、远程代理、虚拟代理、缓冲代理等,它们应用于不同的场合,满足用户的不同需求。
- 定义:给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问。
- 为其他对象提供一种代理以控制对这个对象的访问。
- 给某一个对象提供一个代理,并由代理对象控制对原对象的引用。
- 在客户端和目标对象之间起到中介的作用,可以通过代理对象去掉客户不能看到的内容和服务或者添加客户需要的额外服务。
- 也叫委托模式
- 代理模式是一种对象结构型模式。
- 学习难度:★★★☆☆
- 使用频率:★★★★☆
优缺点
- 优点
- 职责清晰:真实主题角色实现实际业务,利用代理完善其他的事情。
- 封装性:对外只提供代理的角色功能。
- 缺点
类图
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/a36821f29792761e0af9a4756a67d533.png)
组成角色
- 抽象主题角色(Subject)
- 真实主题角色(RealSubject)
- 代理主题角色(Proxy)
code example
抽象主题角色(Subject)
public interface ITalk {
public void talk(String msg);
}
真实主题角色(RealSubject)
public class PeopleTalk implements ITalk {
public String username;
public String age;
public PeopleTalk(String username, String age) {
this.username = username;
this.age = age;
}
public void talk(String msg) {
System.out.println(msg + "!你好,我是" + username + ",我年龄是" + age);
}
public String getName() {
return username;
}
public void setName(String name) {
this.username = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
代理主题角色(Proxy)
- 代理角色就是实现抽象主题角色,组合真实主题角色,将主题角色功能做转换,并可以附加其他逻辑
public class PeopleTalkProxy implements ITalk {
private ITalk talker;
public PeopleTalkProxy(ITalk talker) {
this.talker = talker;
}
@Override
public void talk(String msg) {
talker.talk(msg);
}
public void talk(String msg, String singname) {
talker.talk(msg);
sing(singname);
}
private void sing(String singname) {
System.out.println("唱歌:" + singname);
}
}
客户端
public class ProxyPattern {
public static void main(String[] args) {
ITalk people = new PeopleTalk("湖海散人", "18");
people.talk("No ProXY Test");
System.out.println("-----------------------------");
PeopleTalkProxy talker = new PeopleTalkProxy(people);
talker.talk("ProXY Test", "七里香");
}
}