1.代理模式
是一个使用率非常高的模式。代理模式也叫委托模式,他是为其他对象提供一种代理以控制对这个对象的访问
类图:代理主题角色和具体的主题角色具有相同的抽象主题接口
Subject抽象主题角色:
抽象主题类可以是抽象类也可以是接口,是一个最普通的业务类型定义,无特殊要求。
RealSubject具体主题角色:
也叫做被委托角色、被代理角色。它才是冤大头,是业务逻辑的具体执行者。
Proxy代理主题角色:
也叫做委托类、代理类。它负责对真实角色的应用,把所有抽象主题类定义的方法限制。委托给真实主题角色实现,并且在真实主题角色处理完毕前后做预处理和善后处理工作。
2.举个例子
创建一个抽象主题类,常用的是接口
package com.wx.proxypattern.base;
/*
Subject抽象主题角色:
抽象主题类可以是抽象类也可以是接口,是一个最普通的业务类型定义,无特殊要求
*/
public interface Subject {
public void request();
}
创建一个具体主题类,也叫委托类,实现抽象主题类。
扫描二维码关注公众号,回复:
4404659 查看本文章
package com.wx.proxypattern.imp;
import com.wx.proxypattern.base.Subject;
/*
也叫做被委托角色、被代理角色。是业务逻辑的具体执行者。
*/
public class RealSubject implements Subject {
@Override
public void request() {
System.out.println("需要被代理的角色");
}
}
创建一个代理主题角色SubjectProxy,实现抽象主题接口。并通过构造函数来传递代理者。
package com.wx.proxypattern.imp;
import com.wx.proxypattern.base.Subject;
/*
代理主题角色
*/
public class SubjectProxy implements Subject {
//要代理哪个实现类
private Subject subject=null;
//被默认代理者
public SubjectProxy()
{
this.subject=new RealSubject();
}
//通过构造函数传递代理者
public SubjectProxy(Subject subject)
{
this.subject=subject;
}
@Override
public void request() {
this.before();
this.subject.request();
this.after();
}
//预处理
public void before()
{
System.out.println("预处理");
}
//善后处理
public void after()
{
System.out.println("善后处理");
}
}
测试:
package com.wx.proxypattern.test;
import com.wx.proxypattern.base.Subject;
import com.wx.proxypattern.imp.SubjectProxy;
import com.wx.proxypattern.imp.RealSubject;
public class TestProxy {
public static void main(String[] args)
{
Subject subject=new RealSubject();
SubjectProxy proxy = new SubjectProxy(subject);
proxy.request();
}
}
代理模式的优点:
职责清晰
真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理
完成一件事务,附带的结果就是编程简洁清晰。
高扩展性
具体主题角色是随时都会发生变化的,只要它实现了接口,甭管它如何变化,都逃不脱如来佛的手掌(接口),那我们的代理类完全就可以在不做任何修改的情况下使用。