简介:
接口隔离原则(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("手机");
补充:
前面的例子中所使用的代理模式是一种静态代理。顾明思议,静态代理是静态的去创建一个代理类。还有种代理模式是动态的去创建代理类,它就是动态代理。其特点是:
- 代理对象不需要实现接口。
- 不需要自己实现代理对象,由虚拟机动态生成(内部通过java反射实现)。
- 动态代理也叫做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("书籍");
在实际的开发过程中往往是动态代理的模式使用的较多。