代理的定义: 对其他对象提供一种代理以控制对这个对象的访问。
主要作用: 对其他对象提供一种代理以控制对这个对象的访问,在某些特定的情况下,一个对象不想或不能直接访问另一个对象,
而代理就可以在客户端和目标对象之间起到中介的作用。
代理思想:是为了提供一些额外的处理和不同的操作而在目标对象和调用者之间插入代理。这些额外的操作会和实际对象进行通信。
应用场景:
例如:同一组对象实现了同一接口,实现了同一方法,而这一组中部分对象需要有单独的方法,怎么办?
以前的笨方法是在每个对象中都加入这个单独的方法,这样的话代码的重用性降低,耦合性高。
如果使用代理就能很好的解决这一问题。
实例:
假设有一个ITalk接口,里面有 talk 方法(说话),所有people 都实现了这个接口,实现了talk ()方法,前段都实例化people 这个
对象,执行talk(),后来发现有部分人不但要说(talk),还要唱(sing),怎么办? 不能在ITalk 接口中加入 sing ()方法,又不能在
每个应用中都加入sing(),这时我们只要增加一个代理类peopleProxy,实现ITalk接口,实现talk()方法,sing()方法,然后在想sing()
方法的前段中访问代理类即可。
代码如下:
/**接口*/
public interface ITalk(){
public void talk();
}
/**实现类*/
public class People implements ITalk(){
private String name;
private int age;
....此处省略set / get 方法;
public People(){}
public People(String name,int age){
this.name = name;
this.age = age;
}
public viod talk(String msg){
System.out.println("你好,我是"+username+",我年龄是"+age+";"+msg);
}
}
/**代理类*/public class peopleProxy implement ITalk(){
private ITalk talk ;
public peopleProxy (ITalk talk){
this.talk = talk;
}
public void talk(String msg){
//System.out.println(msg);
if(talk == null){
talk = new People();
}
talk.talk(msg);
}
public void sing(String msg){
System.out.println(msg);
}
}
public class Test(){
public static void main(String[] args){
People p = new People("琪琪",20);
p.talk("你是谁?我想唱歌。");
//执行额外方法sing
peopleProxy pp = new peopleProxy(p);
pp.talk("去KTV包房。");
pp.sing("《一个人跳舞》");
}
}
动态处理方式: 因为目标对象和代理对象都要同时实现同一个接口,然后通过访问代理调用目标对象,那么动态实现
就是每次为目标对象创建一个代理且实现了共同的接口,再把代理对象返回,使其访问目标对象。
congratulations appreciated future contact grab announce Infrastructure attitude recognized robustness
travelling unfortunately bounce cover Constructors association modifier quarantine eXpurgate announcement
扩展阅读:
1,阎宏著,《java与模式》,
2,Johnson等著《Design Patterns》