代理模式
/**
*
*/
/**
* 代理模式
* 代理模式又叫委托模式,是为某个对象提供一个代理对象,并且由代理对象控制对原对象的访问。
* 使用场景
* 代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后对返回结果的处理等。代理类本身并不真正实现服务,而是通过调用委托类的相关方法,来提供特定的服务。真正的业务功能还是由委托类来实现,但是可以在业务功能执行的前后加入一些公共的服务。例如我们想给项目加入缓存、日志这些功能,我们就可以使用代理类来完成,而没必要打开已经封装好的委托类。
*
* 代理模式优点
* 职责清晰:具体角色是实现具体的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件事务,代码清晰。在某些情况下,一个客户类不想或者不能直接引用一个委托对象,而代理类对象可以在客户类和委托对象之间起到中介的作用,其特征是代理类和委托类实现相同的接口。
* 高扩展性:具体角色随时会发生变化,但是只要实现了接口,接口不变,代理类就可以不做任何修改继续使用,符合“开闭原则”。
*
* 代理模式的多种实现方式
* 静态代理:由程序员创建或特定工具自动生成源代码,再对其进行编译。在程序运行之前,代理类.class文件就已经被创建,代理类和委托类的关系在运行前就确定。
* 动态代理:动态代理类的源码是在程序运行期间由JVM根据反射等机制动态的生成,所以不存在代理类的字节码文件。代理类和委托类的关系是在程序运行时确定。
*
* 总结:
* 代理模式使用广泛,尤其是动态代理在大型开发框架中,应用较多并且高效。特别是使用AOP,实现代理模式就更方便了,比如使用Spring AOP这样的工具。
*
*
*
* @author
*
*/
场景引入
在校园里向小姐姐表白送礼物,可以找与她熟悉的人作为中介。
不使用代理模式
//不使用代理模式
public class Test1 {
public static void main(String[] args) {
Girl girl = new Girl("小美");
Pursuit xiaoming = new Pursuit(girl);
xiaoming.Rose();
xiaoming.Chocolate();
xiaoming.Dolls();
}
}
class Girl{
private String name;
public Girl(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class Pursuit{
Girl girl;
public Pursuit(Girl girl) {
this.girl=girl;
}
public void Dolls() {
System.out.println(girl.getName()+" 送你洋娃娃");
}
public void Rose() {
System.out.println(girl.getName()+" 送你玫瑰花");
}
public void Chocolate() {
System.out.println(girl.getName()+" 送你巧克力");
}
}
/**
* 问题:
* 小明和小美并不认识,这样写就成了他们两个人认识,所以需要找一个代理
*/
只有代理
//只有代理
public class Test2 {
public static void main(String[] args) {
Girl2 girl = new Girl2("小美");
Proxy xiaogang = new Proxy(girl);
xiaogang.Chocolate();
xiaogang.Dolls();
xiaogang.Rose();
}
}
class Girl2 {
private String name;
public Girl2(String name) {
this.name=name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class Proxy{
Girl2 girl;
public Proxy(Girl2 girl) {
this.girl=girl;
}
public void Dolls() {
System.out.println(girl.getName()+" 送你洋娃娃");
}
public void Rose() {
System.out.println(girl.getName()+" 送你玫瑰花");
}
public void Chocolate() {
System.out.println(girl.getName()+" 送你巧克力");
}
}
/**
* 问题:
* 只有代理的情况下,变成了代理直接给被追求者送礼物,而不是追求者。
*
*/
符合实际的代码
//符合实际的代码
public class Test3 {
public static void main(String[] args) {
Girl3 girl = new Girl3("小美");
Proxy2 xiaogang = new Proxy2(girl);
xiaogang.Chocolate();
xiaogang.Rose();
xiaogang.Dolls();
}
}
class Girl3 {
private String name;
public Girl3(String name) {
this.name=name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
interface Gift{
void Rose();
void Dolls();
void Chocolate();
}
class Proxy2 implements Gift{
Girl3 girl;
public Proxy2(Girl3 girl) {
this.girl=girl;
}
public void Dolls() {
System.out.println(girl.getName()+" 送你洋娃娃");
}
public void Rose() {
System.out.println(girl.getName()+" 送你玫瑰花");
}
public void Chocolate() {
System.out.println(girl.getName()+" 送你巧克力");
}
}
class Pursuit2 implements Gift{
Girl girl;
public Pursuit2(Girl girl) {
this.girl=girl;
}
public void Dolls() {
System.out.println(girl.getName()+" 送你洋娃娃");
}
public void Rose() {
System.out.println(girl.getName()+" 送你玫瑰花");
}
public void Chocolate() {
System.out.println(girl.getName()+" 送你巧克力");
}
}