代理模式是结构型模式中的一种,代理模式顾名思义就是我现在太忙了,如果要使用我的功能就去找我的代理,代理知道我会什么,你告诉代理,代理再告诉我,由我来做最后的操作,所以代理和我得实现相同的接口。代理模式一般应用于扩展某个已经实现的类的功能(这符合开闭原则:对扩展开放,对修改关闭”)。
先写一个代理人和被代理人都要实现的接口,我们假定被代理人为一个歌手,歌手的代理则为其经纪人,他们都要实现的接口则为工作接口。
public interface Work {
/**
* 工作就是要唱歌
*/
public void Sing();
}
public class Singer implements Work {
/**
* 歌手唱歌
*/
@Override
public void Sing() {
System.out.println("歌手唱歌");
}
}
public class Agent implements Work {
Work singer;
public Agent(){
singer = new Singer();
}
public Agent(Work worker){
singer = worker;
}
@Override
public void Sing() {
getWorkforSinger();
singer.Sing();
}
private void getWorkforSinger(){
System.out.println("帮歌手接活");
}
}
最后写一个测试类
public class Test {
public static void main(String[] args) {
Work worker = new Agent();
worker.Sing();
}
}
注意上面的Agent类,也就是代理类,其中有一个构造函数的参数是Work接口,也就是说这个经纪人有点吊还可以接私活,可以替其他歌手接活干,我们再来写另一个歌手类
public class AnotherSinger implements Work {
@Override
public void Sing() {
System.out.println("另一个歌手唱歌!!");
}
}
实现类则可以这样使用
public class Test {
public static void main(String[] args) {
/*Work worker = new Agent();
worker.Sing();*/
Work worker = new Agent(new AnotherSinger());
worker.Sing();
}
}
讲到这里应该是已经了解了代理模式,这时候再来联想一下上一篇讲的策略模式的第一种实现方式有点像,策略模式的辅助类和代理模式的代理类都接受一个我们实现的接口,然后对其进行功能扩展,唯一的区别只在于代理类也得实现接口,那么问题来了,为什么一个是行为型模式而一个是结构型模式,区别如下:
代理模式中,代理类知道被代理类的行为,因为代理类与被代理类实现的是同一个接口,因此代理类与被代理类的结构是相同的,之所以启用代理是为了对其他对象提供一种代理以控制对这个对象的访问(不管你是加一个限制还是要怎么样)。
而策略模式中,策略容器并不知道内部策略的详细信息,因为容器并没有实现与内部策略相同的接口,即容器与内部策略只是简单的组合关系,容器只是将内部策略的行为抽取出来,进行了统一的实现。