java设计模式之 -代理模式

代理模式(Proxy Pattern)

一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。

举个例子:

跟 MM 在网上聊天,一开头总是 “hi, 你好”,“你从哪儿来呀?”“你多大了?”“身高多少呀?” 这些话,真烦人,写个程序做为我的 Proxy 吧,凡是接收到这些话都设置好了自己的回答,接收到其他的话时再通知我回答,怎么样,酷吧。

代理模式:代理模式给某一个对象提供一个代理对象,并由代理对象控制对源对象的引用。代理就是一个人或一个机构代表另一个人或者一个机构采取行动。某些情况下,客户不想或者不能够直接引用一个对象,代理对象可以在客户和目标对象直接起到中介的作用。

客户端分辨不出代理主题对象与真实主题对象。代理模式可以并不知道真正的被代理对象,而仅仅持有一个被代理对象的接口,这时候代理对象不能够创建被代理对象,被代理对象必须有系统的其他角色代为创建并传入。

 

代理就是中介,中间人。法律上也有代理,比如代理律师之类,委托人将自己的一部分权限委托给代理者,代理者就拥有被代理者(委托人)的部分权限,并且可以以被代理人的名义来实行这些权限(委托模式和代理模式非常的像,区别在与代理类是开放出去供人调用,委托类的执行过程调用者是看不到的)

 

 

此时代理者与委托人等同,当然代理人也可以在实行权限时配合自己的能力来进行,当然不能超出这个权限。

另外代理模式和装饰器模式特别的像,尤其体现在代码上。

总结:1、加以控制 2 、添加功能

 以静态代理举例

一、静态代理

1创建接口 Car

/**
* 总类
*/
public interface Car {
void run();
}

 2、被委托类-被代理类

public class Train implements Car {

    public void pickUpGoods(){
        System.out.println("拉货");
    }

    public void pickUpPeople(){
        System.out.println("拉人");
    }

    @Override
    public void run() {
        System.out.println("火车跑");
    }



}

 

 3、代理类-代理站点

/**
 * 代理站点 --所有的都是来源于Car ,这个代理类代理的是train,以后train的事情都会由TrainCarProxy来进行代理,
 * 你能在使用Train这个类了,这个就是和装饰类最大区别
 */
public class TrainCarProxy implements Car {
    @Override
    public void run() {
        new Train().run();
    }
}

测试类:

  Car car =new TrainCarProxy();
        car.run();

运行结果:

 

 

 

总结: 

原有的类不会暴露出来,不会修改的原有的类可以加以保护。

缺点:因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类,类太多.同时,一旦接口增加方法,目标对象与代理对象都要维护.

 

posted @ 2020-03-27 14:53  AlexZS  Views(210)  Comments(0Edit  收藏  举报