盘点android中常见的设计模式(六) -- 代理模式

简介:

接口隔离原则(Interface Segregation Principle):

1、使用多个隔离的接口,比使用单个接口要好。

2、降低类之间的耦合度。

 

代理模式:

在代理模式中,一个类代表着另一个类的功能,其意在为其他对象提供一种代理以控制对这个对象的访问。这种类型的设计模式属于结构型模式。在代理模式中,我们创建具有现有对象的对象,以便于向外界提供功能接口。

 

Android中的使用:

下面我们用一个例子来说明下代理模式是如何使用的,这个例子是这样的:我们现在需要买一些东西,而国内没有,这时候我们就找上了代购,通过代购买到了它。

首先我们需要创建一个购物的接口。

/**
 * 目标接口,抽象购物行为
 */
public interface IShop {

    /**
     * 购物
     * @param str
     */
    void Shop(String str);

}

然后去实现这个接口,并具体实现购物行为。

/**
 * 目标类,具体实现购物行为
 */

public class Shop implements IShop {
    /**
     * 购物行为的具体实现
     * @param str
     */
    @Override
    public void Shop(String str) {
        System.out.println("我想要购买的商品是:"+str);
        System.out.println("但是国内没货了");
    }
}

这个时候我们没法买到该商品,就需要一个代购了。这里我们创建一个代购类,并传入目标类,实现其具体的购物行为。

/**
 * 代理类
 */
public class ProxyShop implements IShop {
    //目标类
    private IShop targetClass;

    public ProxyShop(IShop targetClass) {
        this.targetClass = targetClass;
    }

    /**
     * 实现具体的代购行为
     * @param str
     */
    @Override
    public void Shop(String str) {
        System.out.println("开始代购");
        targetClass.Shop(str);
        System.out.println("通过代购买到了该商品");
    }
}

最后去使用代理模式。

        //自己买
        Shop shopComputer = new Shop();
        shopComputer.Shop("电脑");

        //代购
        Shop shopPhone = new Shop();
        ProxyShop proxyShop = new ProxyShop(shopPhone);
        proxyShop.Shop("手机");

补充:

前面的例子中所使用的代理模式是一种静态代理。顾明思议,静态代理是静态的去创建一个代理类。还有种代理模式是动态的去创建代理类,它就是动态代理。其特点是:

  1. 代理对象不需要实现接口。
  2. 不需要自己实现代理对象,由虚拟机动态生成(内部通过java反射实现)。
  3. 动态代理也叫做JDK代理或接口代理。

接下来我们还是以上面的例子说下动态代理是如何实现的。

        //动态代理
        final Shop shopBook = new Shop();
        IShop proxy = (IShop) Proxy.newProxyInstance(shopBook.getClass().getClassLoader(),
                shopBook.getClass().getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("动态代理 开始");
                        Object returnValue = method.invoke(shopBook,args);
                        System.out.println("动态代理 结束");
                        return returnValue;
                    }
                });
        proxy.Shop("书籍");

在实际的开发过程中往往是动态代理的模式使用的较多。

发布了17 篇原创文章 · 获赞 6 · 访问量 4348

猜你喜欢

转载自blog.csdn.net/ledding/article/details/104920097