美文网首页
设计模式(2) 代理模式 静态代理

设计模式(2) 代理模式 静态代理

作者: 风雨雾凇 | 来源:发表于2018-01-14 12:32 被阅读0次
  • 需求:设计一个车类,具有方法run,现需要设计一个方案计算它的前后行驶时间。

  • 一般来说该类可以这样写

public class car{
    long start,end;
    private void before(){
        start=System.currentTimeMillis();
        System.out.println("开车前时间:"+start);
    }
    private void after(){
        end=System.currentTimeMillis();
        System.out.println("开车后时间:"+end+".\n总耗时:"+(end-start)+"毫秒");
    }
    pubic void run(){
        try {
            after();
            System.out.println("正在开车~~~");
            Thread.sleep((int)(Math.random()*100));
            before();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
  • 结果为:

开车前时间:1503127134747
正在开车~~~
开车后时间:1503127135124.
总耗时:377毫秒

Process finished with exit code 0

但是为了可以扩展,一般采取写法
Icar.java (汽车接口)

package cn.niriqiang.demo;

/**
 * Created by fengyuwusong on 2017/8/19 14:53.
 */
public interface ICar {
    public void run();
}

CarImpl 汽车实现类

package cn.niriqiang.demo;

/**
 * Created by fengyuwusong on 2017/8/19 14:54.
 */
public class CarImpl implements ICar{
    @Override
    public void run() {
        try {
            System.out.println("正在开车~~~");
            Thread.sleep((int)(Math.random()*1000));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

CarProxy 汽车计时功能代理

package cn.niriqiang.demo;

/**
 * Created by fengyuwusong on 2017/8/19 14:58.
 */
public class Carproxy implements ICar{
    private ICar car;
    long start,end;
    public Carproxy(ICar car) {
        this.car = car;
    }

    @Override
    public void run() {
        before();
        car.run();
        after();

    }

    private void before(){
        start=System.currentTimeMillis();
        System.out.println("开车前时间:"+start);

    }

    private void after(){
        end=System.currentTimeMillis();
        System.out.println("开车后时间:"+end+".\n总耗时:"+(end-start)+"毫秒");
    }
}

main 测试方法

package cn.niriqiang.demo;

/**
 * Created by fengyuwusong on 2017/8/19 14:55.
 */
public class main {

    public static void main(String[] args) {
        ICar car=new CarImpl();
        Carproxy carproxy=new Carproxy(car);
        carproxy.run();
    }
}

以上写法即为代理模式的静态代理,这样的好处是加入需求改变,需要在汽车行驶前后添加新功能时,我们可以根据功能给汽车添加新的代理,例如:

CarLogProxy.java 给汽车添加日志功能

package cn.niriqiang.demo;

/**
 * Created by fengyuwusong on 2017/8/19 15:27.
 */
public class CarLogProxy implements ICar{
    ICar car;

    public CarLogProxy(ICar car) {
        this.car = car;
    }


    private void before(){
        System.out.println("开车前日志:xxxxx...");
    }

    private void after(){
        System.out.println("开车后日志:xxxxx...");
    }

    @Override
    public void run() {
        before();
        car.run();
        after();
    }
}

我们给man方法稍作改变即可得到新功能(既添加了计时又添加了日志功能的汽车)

package cn.niriqiang.demo;

/**
 * Created by fengyuwusong on 2017/8/19 14:55.
 */
public class main {

    public static void main(String[] args) {
        ICar car=new CarImpl();
        Carproxy carproxy=new Carproxy(car);
        CarLogProxy carLogProxy=new CarLogProxy(carproxy);
        carLogProxy.run();
    }
}

结果

开车前日志:xxxxx...
开车前时间:1503127842768
正在开车~~~
开车后时间:1503127842835.
总耗时:67毫秒
开车后日志:xxxxx...

相关文章

  • 带你初识Java的代理模式

    Spring AOP是基于动态代理设计模式实现的,相对的就有静态代理 动态代理和静态代理 静态代理 对于静态代理,...

  • 理解代理模式

    原创博客地址 简介 代理模式,也叫做委托模式,分为:静态代理动态代理 代理模式也是平时比较常用的设计模式之一,代理...

  • Java设计模式之代理模式

    Java设计模式之代理模式 代理模式 静态代理 动态代理 为什么需要代理 通过代理,我们能够不用知道委托人是谁,而...

  • 设计模式总结

    相似设计模式的区别 装饰器和静态代理 1、装饰器模式:客户端决定装饰谁(对比静态代理) 2、静态代理:客户端不关心...

  • JDK和Cglib动态代理

    1.代理模式(静态代理) 代理模式是常用设计模式的一种,我们在软件设计时常用的代理一般是指静态代理,也就是在代码中...

  • 说说Java代理模式

    在平时写代码时,经常会用到各种设计模式,其中一种就是代理模式,代理实现可以分为静态代理和动态代理。 静态代理 静态...

  • 静态/动态代理模式

    代理, 顾名思义就是让别人替你完成或处理事情。 在Java设计模式中,代理模式又可分为静态代理和动态代理模式。静态...

  • 代理模式

    代理模式感觉是一个复杂的设计模式,变种很多,如:远程代理、虚拟代理、静态代理、动态代理、安全代理等; 定义### ...

  • 设计模式-动态代理模式

    之前介绍了代理模式,大家也都了解了代理模式,不过之前介绍的代理模式是静态代理,静态代理什么意思?静态代理指的是代理...

  • 动态代理

    先说静态代理,静态代理就是设计模式中的代理模式,形式上与装饰模式一致,但是涵义不同,装饰模式注重新加的修饰功能,代...

网友评论

      本文标题:设计模式(2) 代理模式 静态代理

      本文链接:https://www.haomeiwen.com/subject/dcskoxtx.html