Android设计模式-代理模式-结构型-2
创建型模式 (3)
行为型模式 (2)
结构型模式 (3)
- Android设计模式Github项目地址: 点击跳转
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技术生活交流
微信