Android与设计模式——代理(Proxy)模式

在阎宏博士的《JAVA与模式》一书中开头是这样描述代理(Proxy)模式的:

  代理模式是对象的结构模式。代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。

代理模式的结构。

  所谓代理,就是一个人或者机构代表另一个人或者机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

  代理模式类图如下:

  在代理模式中的角色:

  ●抽象对象角色(Phone):声明了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象的地方都可以使用代理对象。

  ●目标对象角色(PhoneBase):定义了代理对象所代表的目标对象。

  ●代理对象角色(PhoneProxy):代理对象内部含有目标对象的引用,从而可以在任何时候操作目标对象;代理对象提供一个与目标对象相同的接口,以便可以在任何时候替代目标对象。代理对象通常在客户端调用传递给目标对象之前或之后,执行某个操作,而不是单纯地将调用传递给目标对象。

上图的代理模式图使用的是Android Phone管理的例子,从图中可以看到,之所以要使用代理模式,就是为了管理不同类型的Phone,访问者不需要知道Android系统想要什么类型的Phone,直接使用PhoneProxy对象就可。下面看看它的大概实现:

抽象对象角色(Phone):

public interface Phone {
    .....
    /**
     * Get the current ServiceState. Use
     * <code>registerForServiceStateChanged</code> to be informed of
     * updates.
     */
    ServiceState getServiceState();

    /**
     * Get the current CellLocation.
     */
    CellLocation getCellLocation();

    /**
     * @return all available cell information or null if none.
     */
    public List<CellInfo> getAllCellInfo();
    ......

}

目标对象角色(PhoneBase(PhoneBase的具体实现体现在其子类中,以GSMPhone为例)):

public class GSMPhone extends PhoneBase {
    ......
        @Override
    public ServiceState
    getServiceState() {
        if (mSST != null) {
            return mSST.mSS;
        } else {
            // avoid potential NPE in EmergencyCallHelper during Phone switch
            return new ServiceState();
        }
    }

    @Override
    public CellLocation getCellLocation() {
        return mSST.getCellLocation();
    }

    @Override
    public PhoneConstants.State getState() {
        return mCT.mState;
    }

    @Override
    public int getPhoneType() {
        return PhoneConstants.PHONE_TYPE_GSM;
    }

    ......

}

代理对象角色(PhoneProxy):

public class PhoneProxy extends Handler implements Phone {
    ......
    private Phone mActivePhone;
    private CommandsInterface mCommandsInterface;
    private IccSmsInterfaceManager mIccSmsInterfaceManager;
    private IccPhoneBookInterfaceManagerProxy mIccPhoneBookInterfaceManagerProxy;
    private PhoneSubInfoProxy mPhoneSubInfoProxy;
    private IccCardProxy mIccCardProxy;
    ......
    public PhoneProxy(PhoneBase phone) {
        ......
        mActivePhone = phone; //具体对象传进来了
        ......
        mCommandsInterface = ((PhoneBase)mActivePhone).mCi; //使用具体对象(这里是GSMPhone的对象)的对象
        .......
    }

    @Override
    public ServiceState getServiceState() {
        return mActivePhone.getServiceState(); //调用具体对象(这里是GSMPhone的对象)的方法完成功能<pre name="code" class="java" style="line-height: 32px;"><span style="font-family: Arial, Helvetica, sans-serif;">    }</span>

@Override public CellLocation getCellLocation() { return mActivePhone.getCellLocation(); } /** * @return all available cell information or null if none. */ @Override public List<CellInfo> getAllCellInfo() { return mActivePhone.getAllCellInfo();
} /** * {@inheritDoc} */ @Override public void setCellInfoListRate(int rateInMillis) { mActivePhone.setCellInfoListRate(rateInMillis); } .....}


我们看看客户端是怎么使用的:

public class PhoneFactory {
    static private Phone sProxyPhone = null;
    ......
    public static void makeDefaultPhone(Context context) {
    ......
                int phoneType = TelephonyManager.getPhoneType(networkMode);
                if (phoneType == PhoneConstants.PHONE_TYPE_GSM) {
                    Log.i(LOG_TAG, "Creating GSMPhone");
                    sProxyPhone = new PhoneProxy(new GSMPhone(context,
                            sCommandsInterface, sPhoneNotifier));//我要制造GSM手机
                } else if (phoneType == PhoneConstants.PHONE_TYPE_CDMA) {
                    switch (TelephonyManager.getLteOnCdmaModeStatic()) {
                        case PhoneConstants.LTE_ON_CDMA_TRUE:
                            Log.i(LOG_TAG, "Creating CDMALTEPhone");
                            sProxyPhone = new PhoneProxy(new CDMALTEPhone(context,
                                sCommandsInterface, sPhoneNotifier));//我要制造4G CDMA手机
                            break;
                        case PhoneConstants.LTE_ON_CDMA_FALSE:
                        default:
                            Log.i(LOG_TAG, "Creating CDMAPhone");
                            sProxyPhone = new PhoneProxy(new CDMAPhone(context,
                                    sCommandsInterface, sPhoneNotifier));//我要制造3G CDMA手机
                            break;
                    }
                }
    ......
}
    ......
}

未完待续,有不对的地方,请指正。

时间: 2024-10-13 16:05:23

Android与设计模式——代理(Proxy)模式的相关文章

Android中的代理(Proxy)模式

一. Proxy模式定义 Proxy模式,也称代理模式,是经典设计模式中的一种结构型模式,其定义是为其他对象提供一种代理以控制对这个对象的访问,简单的说就是在访问和被访问对象中间加上的一个间接层,以隔离访问者和被访问者的实现细节. 二. Proxy模式理解 当无法或者不想直接访问某个对象, 或者访问某个对象存在困难时, 可以通过一个代理对象来间接访问, 为了保证客户端使用的透明性, 委托对象与代理对象需要实现相同的接口. 例如,ActivityManager 作为客户端要访问 AMS,AMS 不

设计模式--代理(Proxy)模式

在公司,经常性听到采购部的人说采购某样东材料,采购不了,需要通过代理商才可以.以前Insus.NET也做有一个练习<找人办事,代理设计模式(Proxy)>http://www.cnblogs.com/insus/archive/2013/02/27/2935081.html .理解起来跟公司的采购员找代理商采购是一样的道理. 统一的行为,就是采购,不管是公司的采购员还是代理商: 公司的采购员: 代理商: OK,实现环境: 演示: 代理模式实际环境中很多.比如我们想租或买房,均可以让代码帮助我们

设计模式 之代理(Proxy)模式

为什么这里要定义代理呢?所谓代理代理,当然就是你不想做的事,找别人去做,这就是代理.所以,当你写代码的时候,你想保持类的简单性.重用性,你就可以把事件尽量都交给其它类去做,自己只管做好自己的事.也就是SRP,单一职责原则.如果一个类关注的点过多,做的事情太多.这些事情不管是你直接做的,还是调用别的对象去完成的.这都不行,自己做这些事,那就会使类的功能复杂化,维护不方便.而过多地调用其它对象来完成一些事情,表面上看起来好像不错,实际上是过度耦合了.我们编写类的原则应该是追求高内聚,低耦合的.可能你

Android学习——ActivityManager与Proxy模式的运用

Android学习--ActivityManager与Proxy模式的运用 - Dufresne - 博客园 一 Proxy模式 意图: ?????? 为其他对象提供一种代理以控制这个对象的访问. 适用性: l? 远程代理( Remote Proxy ): 为一个对象在不同的地址空间提供局部代表. l? 虚代理(Virtual Proxy)根据需要创建开销很大的对象.使用一个代理对象作为代表,在真正的需要时进行创建. l? 保护代理(Protection Proxy):控制对原始对象的访问.保护

设计模式之Proxy模式(代理模式)

代理模式很容易理解,就是代替别人去做某一件事,打个比方,我们需要买水果,一般是去超市或者水果店买水果,很少有人去果园买水果,果园是生产水果的地方,但很少出售水果,在这里,水果店,超市就成了代理. 首先定义一个抽象类,提供所有的函数接口. 定义卖水果的抽象类,也就是接口,果园与超市都要继承这个类. #pragma once class CSellFruits//定义一个抽象类 { public: CSellFruits(void); virtual ~CSellFruits(void); virt

设计模式之Proxy模式(笔记)

代理模式:为其他对象提供一种代理以控制对这个对象的访问 代理模式适用场合:第一,远程代理,也就是为一个对象在不同的地址空间提供局部代理,例如webservice应用:第二.虚拟代理,根据需要创建开销很大的对象.通过它来存放实例化需要很长时间的真实对象:第三.安全代理,用来控制真实对象访问时的权限:第四.智能指引,是指当调用真实的对象时,代理处理另外一些事. 举个实例:大鹏出差在外,柳岩今天过生日,为了不让自己的女友扫兴,大鹏拖快递员帮忙送花,送娃娃,送巧克力,为柳岩庆生. 定义一个公共接口 IG

行为模式--代理Proxy模式(Java)

代理(AOP切面的雏形): 题记:顾名思义就是将某件事,某个东西的使用权进行为让授权转移.代理相当于中介(不同于中介者模式),在原本操作的类之间添加了一个桥梁.但代理不能去修改原有目标.比如:一个人要买       房,让中介帮忙给看个房,但中介不能将原有看房这件事变更为看车.他可以对看房提出各种要求和咨询. 回到程序的角度,调用者将调用某些共性类的处理交由代理类处理,代理类根据调用者的要求即满足什么情况可以调用,什么情况不能调用,(卖房者委托中介100万以上卖,100万以下不卖)对处理做前后的

代理(Proxy)模式

代理模式的类图如下所示: 客户端想调用的是RealSubject,由于某种考虑或原因,只能直接访问到ProxySubject,再由ProxySubject去调用RealSubject,这就完成了一次代理的活动. 代理模式的时序图如下: 从上面可以看出,ProxySubject不仅可以完成对RealSubject的调用,在调用前后还可以完成一些事情,这就是代理模式的优点. 代理模式按照使用的分类,可以分为以下几类: 远程代理:为一个不同地址空间的对象提供一个局域代表对象. 虚拟代理:根据需求创建一

Java 实现代理(Proxy)模式

/** * 游戏者接口 * @author stone * */ public interface IGamePlayer { // 登录游戏 public void login(String user, String password); // 杀怪,网络游戏的主要特色 public void killBoss(); // 升级 public void upgrade(); } /** * 游戏者 * @author stone * */ public class GamePlayer imp