设计模式之代理模式

前面的几篇文章讲了简单工厂模式、工厂模式、建造者模式几种设计模式,其中这几种设计模式分创建型
设计模式。设计模式分为三大类:
第一类:创建型设计模式,常见的有单例模式、简单工厂模式、工厂模式(抽象工厂模式),建造者模式......
第二类:结构型设计模式,常见的适配器模式、装饰模式、代理模式、外观模式......
第三类:行为型设计模式,策略模式,模板方法模式,观察者模式、迭代器模式......
今天的话我们来讲解一下结构型设计模式中的代理模式。

代理模式比较好理解,也可以称为委托模式,在我们平常生活中的代理场景也很多,比如代理上网、代购、
请律师打官司,这些都属于代理的场景。
一样的,我们先来看看它的定义:
定义:为其他对象提供一种代理以控制对这个对象的访问。
代理模式中有如下角色:
Basic:基本接口,声明委托类和代理类共同的接口方法。
Delegator:委托类,实现基本接口,真正进行操作。客户端通过代理类间接的调用真实委托类的方法。
Proxy:代理类,持有委托类的引用,在其实现的接口方法中调用真实委托类实现的接口方法。
Client:客户端。
接下来我们用一个例子来看看代码。

比如我最近想买一部switch,但是内地的话会比香港的贵,平时上班也忙,刚好有个朋友就想过去香港,这样
子的话,我就委托了他帮我买部switch。
因为我想买,然后不方便去,最后就委托了朋友去帮我买。到这里,我们就可以定义出一个基本接口了。

public interface IBuySwitch{
    void buy();
}

委托类:

public class LinLiYing implements IBuySwitch{


    public void work(){
        Log.e("TAG","上班没空");
    }

    @Override
    public void buy() {
        Log.e("TAG","掏钱买买买Switch");
    }
}

代理类:

public class Proxy implements IBuySwitch{
    private IBuySwitch iBuySwitch;

    public Proxy(IBuySwitch iBuySwitch){
        this.iBuySwitch = iBuySwitch;
    }
    @Override
    public void buy() {
        iBuySwitch.buy();
    }
}

客户端实际使用:

public class Client{
    public static void main(String [] args){
        IBuySwitch linliying = new LinLiYing();
        IBuySwitch proxy = new Proxy(linliying);
        proxy.buy();
    }
}

在这个例子中,我自己本身是属于委托类,真正掏钱和真正想买switch的是我。所以我就是委托类:
我的朋友属于代理类,持有我的引用,在接口方法中调用了委托者实现的接口方法。
我们看看客户端如何去调用。

 

代理模式很简单,只要记住以下关键点,简单易实现:
(1)代理类与委托类实现同一接口
(2)在委托类中实现功能,在代理类的方法中中引用委托类的同名方法
(3)外部类调用委托类某个方法时,直接以接口指向代理类的实例,
这正是代理的意义所在:屏蔽。
代理模式场景描述:
(1)当我们想要隐藏某个类时,可以为其提供代理类
(2)当一个类需要对不同的调用者提供不同的调用权限时,可以使用代理类来实现
(代理类不一定只有一个,我们可以建立多个代理类来实现,也可以在一个代理类中金进行权限判断来进行
不同权限的功能调用)
(3)当我们要扩展某个类的某个功能时,可以使用代理模式,在代理类中进行简单扩展(只针对简单扩展,
可在引用委托类的语句之前与之后进行)
代理模式虽然实现了调用者与委托类之间的强耦合,但是却增加了代理类与委托类之间的强耦合
(在代理类中显式调用委托类的方法),而且增加代理类之后明显会增加处理时间,拖慢处理时间。

 

再累再苦,只当自己是二百五,再艰再险,只当自己是二皮脸。与君共勉~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值