代理模式是结构型模式中的一种,代理模式顾名思义就是我现在太忙了,如果要使用我的功能就去找我的代理,代理知道我会什么,你告诉代理,代理再告诉我,由我来做最后的操作,所以代理和我得实现相同的接口。代理模式一般应用于扩展某个已经实现的类的功能(这符合开闭原则:对扩展开放,对修改关闭”)。
先写一个代理人和被代理人都要实现的接口,我们假定被代理人为一个歌手,歌手的代理则为其经纪人,他们都要实现的接口则为工作接口。
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(); } }
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(); } }
代理模式中,代理类知道被代理类的行为,因为代理类与被代理类实现的是同一个接口,因此代理类与被代理类的结构是相同的,之所以启用代理是为了对其他对象提供一种代理以控制对这个对象的访问(不管你是加一个限制还是要怎么样)。
而策略模式中,策略容器并不知道内部策略的详细信息,因为容器并没有实现与内部策略相同的接口,即容器与内部策略只是简单的组合关系,容器只是将内部策略的行为抽取出来,进行了统一的实现。