有半个月没有写博客了,接下跟吉哥一起学习下代理模式。
代理模式包含:静态代理模式和动态代理模式。
包含以下三个角色:
抽象角色:通过接口或抽象类声明真实角色实现的业务方法。
代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。
UML关系图:
1)先创建抽象角色,这里指的是员工IEmployee(项目经理也是员工)。
/**
* 抽象角色(员工)
*/
public interface IEmployee {
void job();
}
2)再创建真实角色,这里指的是程序员Programmer,里面job工作的方法就是代理角色调用的业务逻辑。
/**
* 真实角色(程序员)
*/
public class Programmer implements IEmployee{
@Override
public void job() {
Log.i("Programmer","写代码!");
}
}
3)代理角色这里指项目经理,内部调用程序员的工作,不用跟老板说是哪个程序员做的,并且项目经理还有自己的事情处理。
/**
* 代理角色(经理)
*/
public class Manager implements IEmployee {
Programmer programmer=null;
@Override
public void job() {
arrangeTask();
if(programmer==null){
programmer=new Programmer();
}
programmer.job();
reportTask();
}
public void arrangeTask(){
Log.i("Manager","安排任务");
}
public void reportTask(){
Log.i("Manager","报告任务");
}
}
4)调用处。
private void initProxy() {
IEmployee iEmployee=new Manager();
iEmployee.job();
}
优点:
1、在编译期加入,提前就指定好了谁调用谁,效率高,不用调用端知道细节。
2、可以在不改变原有类的基础上,增加额外的功能,低耦合,符合开闭原则。
缺点:
1、如果要想为多个类进行代理,则需要建立多个代理类,维护难度加大。
适用场合:
在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用,这个时候就可以使用代理。
代理模式包含:静态代理模式和动态代理模式。
包含以下三个角色:
抽象角色:通过接口或抽象类声明真实角色实现的业务方法。
代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。
UML关系图:
静态代理模式UML
故事比喻:公司老板安排任务,要一个程序,安排给项目经理做,项目一个人做不完,因为他有其他工作,所以给程序员做,老板可以不用知道是哪个程序员做的,项目经理安排做完就行。
1)先创建抽象角色,这里指的是员工IEmployee(项目经理也是员工)。
/**
* 抽象角色(员工)
*/
public interface IEmployee {
void job();
}
2)再创建真实角色,这里指的是程序员Programmer,里面job工作的方法就是代理角色调用的业务逻辑。
/**
* 真实角色(程序员)
*/
public class Programmer implements IEmployee{
@Override
public void job() {
Log.i("Programmer","写代码!");
}
}
3)代理角色这里指项目经理,内部调用程序员的工作,不用跟老板说是哪个程序员做的,并且项目经理还有自己的事情处理。
/**
* 代理角色(经理)
*/
public class Manager implements IEmployee {
Programmer programmer=null;
@Override
public void job() {
arrangeTask();
if(programmer==null){
programmer=new Programmer();
}
programmer.job();
reportTask();
}
public void arrangeTask(){
Log.i("Manager","安排任务");
}
public void reportTask(){
Log.i("Manager","报告任务");
}
}
4)调用处。
private void initProxy() {
IEmployee iEmployee=new Manager();
iEmployee.job();
}
优点:
1、在编译期加入,提前就指定好了谁调用谁,效率高,不用调用端知道细节。
2、可以在不改变原有类的基础上,增加额外的功能,低耦合,符合开闭原则。
缺点:
1、如果要想为多个类进行代理,则需要建立多个代理类,维护难度加大。
适用场合:
在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用,这个时候就可以使用代理。