设计模式从感兴趣的开始

设计模式从感兴趣的开始

学习设计模式不仅需要敲代码,总结、领悟才是最重要的,以前看别人写的,然后尝试着自己去写,现在我想能不能自己写下来看,从头理清思路,开始记录我的开始。第一个设计模式我选择了代理模式,是指由一个代理主题来操作真实主题,真实主题执行具体的业务操作,而代理主题负责其他相关业务的处理,先从静态代理模式开始写。

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、总结一下,每个代理类只为一个接口服务,如果代理接口很多,就会创建许多的代理类,要避免这种情况发生,就需要使用动态代理模式了,通过一个代理类实现所有的代理功能。

猜你喜欢

转载自blog.csdn.net/qq_17495033/article/details/50615477