设计模式的学习与使用在JAVA编写的程序中占有举足轻重的地位,因此笔者今天就简单的说一下设计模式中的代理模式
1.什么是代理模式?(取自《深入浅出设计模式》)
代理模式的定义为:为其他对象提供一种代理以控制对这个对象的访问。说白了就是,在一些情况下客户不想或者不能直接引用一个对象,而大力对象可以再客户和目标对象之间起到中介作用,去掉客户不能看到的内容和服务或者增添客户需要的额外服务。(很难记就是了,但是通过代码来体现他的定义,我认为更加直观和容易记住)
2.一些UML图和结构图(大致看一看就好,了解一个思想)
UML图:
结构图:
我们通过一些代码简单的展示一下代理模式的作用,比如说我们希望通过一个日志记录调用某个方法的一些细节,比如传入的参数,方法执行的时间等等。
如果不使用代理模式,这种日志的记录就会干涉到我们的业务逻辑,如:
这是我们的抽象方法接口:
public interface MyInterface {
//这个方法实现我们的业务逻辑
public void doOperation();
}
这是我们的实现:(我们就单纯的打印一些语句就好)
/*
* 不使用代理类实现接口,只是单纯的实现接口需要做的操作
*/
public class RealClass implements MyInterface{
//在这里实现我们的业务逻辑
@Override
public void doOperation() {
doBefore();//记录方法的开始
System.out.println("doOperation...");
doAfter();//记录方法的结束
}
}
我们调用这个方法时:
public class ProxyTest {
public static void main(String[] args){
//不使用代理模式
RealClass realObj = new RealClass();
realObj.doOperation();
//使用代理模式
//ProxyClass proxyObj = new ProxyClass(new RealClass());
//proxyObj.doOperation();
}
}
很明显,这种实现就会干涉到我们正常的业务逻辑
然而通过代理模式,我们可以这样实现:
public class ProxyClass implements MyInterface{
private MyInterface realObj;
public ProxyClass(MyInterface realObj){
this.realObj = realObj;
}
@Override
public void doOperation() {
doBefore();
realObj.doOperation();
doAfter();
}
//记录方法执行的开始
private void doBefore(){
System.out.println("doBefore");
}
//记录方法执行的结束
private void doAfter(){
System.out.println("doAfter");
}
}
public class ProxyTest {
public static void main(String[] args){
//不使用代理模式
//RealClass realObj = new RealClass();
//realObj.doOperation();
//使用代理模式
ProxyClass proxyObj = new ProxyClass(new RealClass());
proxyObj.doOperation();
}
}
我们看到,尽管看起来是代理类完成了相应的工作,但是实际上在代理类的内部,还是之前的实现类完成了相应的工作,只不过通过代理模式我们剥离出来和业务逻辑无关的方法罢了。
不过,这也是代理模式的一个简单的应用,如果有什么问题,希望大家提出来!