- 定义
- 生活小实例
- UML类图
- 代码演示
1.定义
代理模式:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
2.生活小实例
有一天上课时突然传来几声呼噜声,老师停止了讲课朝着生意方向看到了睡着的小明。”小明快醒醒,还没有下课呢“,可是小明没有醒来,于是老是告诉小明的同桌小红(代理)让她替自己叫醒小明。小红叫了小明几声,小明还是没有醒来,于是自己又拍打了小明几下,这时候小明醒了。主观上想要叫醒小明的是老师,但是老师没有叫醒,于是委托小红叫醒小明,小红为了完成老师的委托加入了自己的动作(拍打小明)。
3.UML类图
抽象角色:通过接口或抽象类声明真实角色实现的业务方法。
代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。
4.代码演示
真实对象和代理需要实现的接口
/**
* Created by cyy on 2017/1/7.
*
* 声明真实角色需要实现的业务方法
*/
public interface IWake {
void wake();
}
真实对象类老师
/**
* Created by cyy on 2017/1/7.
*
* 在讲台上讲课的老师突然听到呼噜声,看到小明在睡觉,准备叫醒他
*/
public class Teacher implements IWake{
@Override
public void wake() {
Log.e(Constant.PROXY_LOG_TAG, "小明快醒醒,还没有下课呢");
}
}
代理类
/**
* Created by cyy on 2017/1/7.
*
* 由于老师没有叫醒小明,让小明的同桌小红(代理)替自己把小明叫醒
*/
public class Proxy implements IWake{
//有一个真实对象的引用
private Teacher teacher;
/**
* 生成代理对象时即生成真实对象
*/
public Proxy(){
teacher = new Teacher();
}
@Override
public void wake() {
//执行真实对象的操作
teacher.wake();
//代理附加的动作
clap();
}
public void clap(){
Log.e(Constant.PROXY_LOG_TAG, "小红边叫边拍打着小明");
}
}
以下是客户端代码
/**
* Created by cyy on 2017/1/7.
*
* 运用代理模式,由于上课时老师叫不醒睡着的小明,就让小明同桌小红(代理)替自己叫醒小明。这里直接对象是老师,间接代理
* 是小红,小红帮助老师完成叫醒小明的任务
*/
public class ProxyActivity extends AppCompatActivity{
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Proxy proxy = new Proxy();
proxy.wake();
}
}
运行结果