自结java (动态)代理模式

  代理的定义: 对其他对象提供一种代理以控制对这个对象的访问。

    主要作用: 对其他对象提供一种代理以控制对这个对象的访问,在某些特定的情况下,一个对象不想或不能直接访问另一个对象,

而代理就可以在客户端和目标对象之间起到中介的作用。

    代理思想:是为了提供一些额外的处理和不同的操作而在目标对象和调用者之间插入代理。这些额外的操作会和实际对象进行通信。

应用场景

例如:同一组对象实现了同一接口,实现了同一方法,而这一组中部分对象需要有单独的方法,怎么办?

以前的笨方法是在每个对象中都加入这个单独的方法,这样的话代码的重用性降低,耦合性高。

如果使用代理就能很好的解决这一问题。

实例:

假设有一个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》






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值