设计模式从感兴趣的开始
学习设计模式不仅需要敲代码,总结、领悟才是最重要的,以前看别人写的,然后尝试着自己去写,现在我想能不能自己写下来看,从头理清思路,开始记录我的开始。第一个设计模式我选择了代理模式,是指由一个代理主题来操作真实主题,真实主题执行具体的业务操作,而代理主题负责其他相关业务的处理,先从静态代理模式开始写。
1、 首先要明白代理模式的3个角色,被代理对象target, 代理对象proxy, 处理对象proxyHandler;
2、那我们先从target类开始写起,写好接口、target类
package com.xl.day01;
/**主题,抽象出被代理对象的某个行为
* @author xule
*
*/
public interface Subject {
void method();
}`
package com.xl.day01;
/**
* 被代理类,实现主题类的方法
*
* @author xule
*
*/
public class Target implements Subject {
@Override
public void method() {
System.out.println("目标执行方法");
}
}
3、接下来开始写代理类proxy,proxy要代理目标对象target,首先想到的是构造传参,调用被代理对象的方法
package com.xl.day01;
/**代理类,也要实现被代理类抽象出的行为接口
* @author xule
*
*/
public class Proxy implements Subject{
//同时要传入被代理对象
private Target target;
//代理处理类
private ProxyHandler handler;
//构造时传入被代理对象,以及处理对象
public Proxy(Target target,ProxyHandler handler) {
this.target = target;
this.handler = handler;
}
@Override
public void method() {
//代理类执行方法
handler.handleBeforMethod();
//被代理对象执行方法(调用的传入对象的方法)
target.method();
//代理类执行方法
handler.handleAfterMethod();
}
}
4、这里我把抽象了处理类proxyHandler
package com.xl.day01;
public interface ProxyHandler {
void handleBeforMethod();
void handleAfterMethod();
}
package com.xl.day01;
public class CustomHandler implements ProxyHandler{
@Override
public void handleBeforMethod() {
System.out.println("执行前方法");
}
@Override
public void handleAfterMethod() {
System.out.println("执行后方法");
}
}
5、写个main方法测试一下
package com.xl.day01;
/**静态代理模式
* @author xule
*
*/
public class day_01 {
public static void main(String[] args) {
Target target = new Target();
Proxy proxy = new Proxy(target, new CustomHandler());
proxy.method();
}
}
/*运行结果如下:
执行前方法
目标执行方法
执行后方法
*/
6、总结一下,每个代理类只为一个接口服务,如果代理接口很多,就会创建许多的代理类,要避免这种情况发生,就需要使用动态代理模式了,通过一个代理类实现所有的代理功能。