代理模式的特点:两个子类共同实现一个接口,其中一个子类负责真实业务实现,另一个子类完成辅助真实业务主题的操作。
代理模式其实在我们生活中特别常见,特别是近些年来,大家都喜欢用国外的东西,但又特别贵,特别是女生的化妆品,它贵主要是因为有税和运费,所以大家都喜欢去找代购买化妆品,可以剩下好多钱。
在这个模式中,真实的主题类是你自己,因为掏钱和使用的是你,而代购就是代理类,它只是负责辅助你完成买化妆品这个动作(排队、发快递…)。
例:比如我们要买一台电脑
首先,我们要定义一个业务接口,要定义我们要干什么事,具体是谁来干还不知道,所以要是一个接口。你自己是买电脑的真实客户,但是在买电脑之前和买电脑之后还要干一些事情,但是前后干的这些事和你真实的业务(买电脑)是没有关系的,前和后干的那些事只是辅助操作,所以有一个专门的类来帮你干这些辅助操作,你是买电脑的人,但你不想去排队、取钱、装软件,你想让别人去帮你干这些事,所以才有了代理类。
代理类就是帮你实现真实业务之前和之后的操作。
package www.java.test;
import com.sun.org.apache.xpath.internal.SourceTree;
//业务接口
interface ISubject{
void buyComputer();
}
//真实主题类
class RealSubjectImpl implements ISubject{
public void buyComputer(){
System.out.println("买一台macbookpro");
}
}
//代理类
class ProxySubjectImpl implements ISubject{
private ISubject realSubject;
//构造注入,注入真实主题类,构造函数传入的是接口类型的参数,是因为不知道具体的真实主题类是哪一个,所以传一个接口类型的
public ProxySubjectImpl(ISubject realISubject){
this.realSubject = realISubject;
}
public void beforeSubject(){
System.out.println("去银行取钱、排队");
}
public void afterSubject(){
System.out.println("装各种软件.......");
}
public void buyComputer(){
//购买之前的操作
beforeSubject();
//真正的操作,但这个操作是客户来完成的,所以需要通过构造方法把真实客户传进来,通过真实主题类来完成这个操作
this.realSubject.buyComputer();
//购买之后的操作
afterSubject();
}
}
public class Test{
public static void main(String[] args){
//通过向上转型把真实主题类传进去了
ISubject subject = new ProxySubjectImpl(new RealSubjectImpl());
subject.buyComputer();
}
}