Android设计模式-代理模式-结构型-(2)

创建型模式 (3)

简单工厂、工厂法、抽象工厂模式单例模式建造者模式

行为型模式 (2)

观察者模式策略模式

结构型模式 (3)

适配器模式代理模式装饰模式


0. 什么是代理模式?

给一个对象添加一个代理对象,客户端可以通过代理对象,对原对象进行控制。通俗点讲就是我们所谓的中介
例如人们买特斯拉,都会去自己家附近的4S店进行购买,而不会垮个城市跑去总部。所以此刻4S店就充当了代理对象,(代理了实际特斯拉总部对象)。我们只需要在4S店挑选自己喜欢的车,付款就可以了。其他的由4S店与总部进行沟通,处理,查询现货,调运等等一系列事情。

代理模式的结构

角色类别说明
interace抽象方法代理 和 原 对象都要实现的接口
real原对象实现抽象方法接口
proxy代理对象拥有原对象的引用,并可以通过自定义一些方法,封装对原对象数据的一些操作

1. 优缺点

优点:

1、职责清晰。
2、高扩展性。
3、智能化。

缺点:

1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。
2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

为什么要用代理模式?

1、中介隔离作用:在某些情况下,一个客户类不想或者不能直接引用一个委托对象,而代理类对象可以在客户类和委托对象之间起到中介的作用,其特征是代理类和委托类实现相同的接口。
2、开闭原则,增加功能:代理类除了是客户类和委托类的中介之外,我们还可以通过给代理类增加额外的功能来扩展委托类的功能,这样做我们只需要修改代理类而不需要再修改委托类,符合代码设计的开闭原则。代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后对返回结果的处理等。代理类本身并不真正实现服务,而是同过调用委托类的相关方法,来提供特定的服务。真正的业务功能还是由委托类来实现,但是可以在业务功能执行的前后加入一些公共的服务。例如我们想给项目加入缓存、日志这些功能,我们就可以使用代理类来完成,而没必要打开已经封装好的委托类。

应用实例:

1、在家附近城市的4S店买汽车,不用去总部购买
2、在家附近的售票站购买火车票,而不用特意跑去火车总站
3、一张支票或银行存单是账户中资金的代理。支票在市场交易中用来代替现金,并提供对签发人账号上资金的控制。
4、电脑的快捷方式

2. 哪些库或方法使用代理模式来实现的?

AIDL、Binder
静态代理、动态代理
Proxy、Cglib
ActivityManagerProxy代理ActivityManagerService


3. 举例说明-小明前往车票代售点购买车票

小明在松江大学城上学,过年回家买车票,距离虹桥太远了,于是跑到附近的火车代售点购买。

代理对象: 松江售票点
实际对象: 虹桥火车站售票点
接口: 代理对象,和实际对象均要实现的抽象方法接口。

Conductor 抽象接口
ProxyConductor 代理售票点 - 松江
RealConductor 实际售票点 - 虹桥
ProxyPatternActivity activity

  • 1.Conductor
public interface Conductor {
     String where(); //售票地点在哪
     int ticketAmount(); //剩余多少张票
}
  • 2.RealConductor
public class RealConductor implements Conductor{
    @Override
    public String where() {
        return "上海虹桥火车站";
    }
    @Override
    public int ticketAmount() {
        return 10;
    }
}
  • 3.ProxyConductor
public class ProxyConductor implements Conductor{
    private RealConductor realConductor;

    /**
     * 持用真正售票员的引用
     * @param realConductor
     */
    public ProxyConductor(RealConductor realConductor){
        this.realConductor = realConductor;
    }
    @Override
    public String where() {
        return "松江大学生火车票代售点";
    }

    @Override
    public int ticketAmount() {
        return realConductor.ticketAmount();
    }

    /**
     * 提供出售火车票的方法
     * @param whereToGo
     * @param ticketNum
     */
    public void purchase(String whereToGo, int ticketNum){
        System.out.println(ProxyPatternActivity.TAG+"您好,这里是 "+where()+" 。您购买了 "+ticketNum+"张,前往 "+whereToGo+" 的票");
    }
    /**
     * 提供总售票处的地点
     */
    public void askWhereIsMainConductor(){
        System.out.println(ProxyPatternActivity.TAG+"小明询问:请问你们的总售票处在哪啊?");
        System.out.println(ProxyPatternActivity.TAG+"代理售票员回答道:总售票处在: "+realConductor.where());
    }
}
  • 4.ProxyPatternActivity
public class ProxyPatternActivity extends AppCompatActivity {
    public static String TAG = "代理模式:>> ";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_proxy_pattern);

        //小明在上海松江大学上学,没空去虹桥火车站买票,于是通过代理的方式购买
        System.out.println(TAG +"小明前往家附近的售票点买票:>> ");
        //创建一个总售票站
        RealConductor realConductor = new RealConductor();
        //创建一个代理售票站,拥有总售票站的所有信息(例如还有多少张票)
        ProxyConductor proxyConductor = new ProxyConductor(realConductor);
        //小明开始购票(通过代理售票站提供的方法)
        proxyConductor.purchase("北京",2);
        //小明询问总售票站在哪(通过代理售票站提供的方法,由于代理售票站有总售票站的所有信息,所以可以回答)
        proxyConductor.askWhereIsMainConductor();
    }
}

运行后的结果是:
在这里插入图片描述


4. Android技术生活交流

微信



[1]* 参考文章
[2]* 参考文章
[3]* 参考文章
[4]* 参考文章
[5]* 参考文章

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值