设计模式(22)-----代理设计模式-----静态代理

一:用继承实现静态代理

1 package com.DesignPatterns.al.Dynamic1;
2
3 public interface Moveable {
4     public void move();
5 }
package com.DesignPatterns.al.Dynamic1;

import java.util.Random;

public class Tank implements Moveable {

    @Override
    public void move() {

        System.out.println("坦克在移动");
        try {
            Thread.sleep(new Random().nextInt(1000));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}
package com.DesignPatterns.al.Dynamic1;

/**
 * 用继承计算tank中move的运行时间
 *
 * @author qingruihappy
 * @data 2018年10月31日 下午11:19:43
 * @说明:
 */
public class Tank1 extends Tank {

    @Override
    public void move() {
        long startTime = System.currentTimeMillis();
        super.move();
        long endTime = System.currentTimeMillis();
        System.out.println("tank总共花费时间是" + (endTime - startTime));
    }

}
 1 package com.DesignPatterns.al.Dynamic1;
 2 /**
 3  * 用继承实现静态代理
 4  * @author qingruihappy
 5  * @data   2018年11月1日 上午1:05:36
 6  * @说明:
 7  */
 8 public class Test {
 9     public static void main(String[] args) {
10         Moveable m=new Tank1();
11         m.move();
12     }
13
14 }

二,用聚合实现静态代理

package com.DesignPatterns.al.Dynamic2;

public interface Moveable {
    public void move();
}
package com.DesignPatterns.al.Dynamic2;

import java.util.Random;

public class Tank implements Moveable {

    @Override
    public void move() {

        System.out.println("坦克在移动");
        try {
            Thread.sleep(new Random().nextInt(1000));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}
package com.DesignPatterns.al.Dynamic2;

/**
 * 聚合实现: 聚合:在一个类中有另一个类的实现,站在代理的角度来说就是当前类是代理类,里面的另一个类就是目标类,调用代理类的时候就是调用目标类的方法。
 * Tank2中有Tank的类,操作的就是Tank相关的方法。
 *
 * @author qingruihappy
 * @data 2018年10月31日 下午11:26:45
 * @说明:
 */
public class Tank2 implements Moveable {
    Tank t;

    public Tank2(Tank t) {
        super();
        this.t = t;
    }

    @Override
    public void move() {
        long startTime = System.currentTimeMillis();
        t.move();
        long endTime = System.currentTimeMillis();
        System.out.println("tank总共花费时间是" + (endTime - startTime));
    }

}
package com.DesignPatterns.al.Dynamic2;

public class Test {
    public static void main(String[] args) {
        Moveable m=new Tank2(new Tank());
        m.move();
    }

}

三,继承和聚合的对比

package com.DesignPatterns.al.Dynamic3;

public interface Moveable {
    public void move();
}
package com.DesignPatterns.al.Dynamic3;

import java.util.Random;

public class Tank implements Moveable {

    @Override
    public void move() {

        System.out.println("坦克在移动");
        try {
            Thread.sleep(new Random().nextInt(1000));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}
package com.DesignPatterns.al.Dynamic3;

/**
 * 现在我们来说一下为什么用实现(聚合),不用继承。
 * 最概要的说法就是实现解耦,因为设计模式的要义是面向抽象编程而不是实现编程
 * 设计模式还有一个要义就是:少用继承,多用组合。
 * 下面我们举例来说明。
 *
 * @author qingruihappy
 * @data 2018年10月31日 下午11:26:45
 * @说明:
 */
public class TankLog implements Moveable {
    Moveable t;

    public TankLog(Moveable t) {
        super();
        this.t = t;
    }

    @Override
    public void move() {
        System.out.println("tank开始打印日志");
        t.move();
        System.out.println("tank开始打印结束");
    }

}
package com.DesignPatterns.al.Dynamic3;

/**
 * 现在我们来说一下为什么用实现(聚合),不用继承。
 * 最概要的说法就是实现解耦,因为设计模式的要义是面向抽象编程而不是实现编程
 * 设计模式还有一个要义就是:少用继承,多用组合。
 * 下面我们举例来说明。
 *
 * @author qingruihappy
 * @data 2018年10月31日 下午11:26:45
 * @说明:
 */
public class TankTime implements Moveable {
    Moveable t;

    public TankTime(Moveable t) {
        super();
        this.t = t;
    }

    @Override
    public void move() {
        System.out.println("tank开始打印开始时间");
        long startTime = System.currentTimeMillis();
        t.move();
        long endTime = System.currentTimeMillis();
        System.out.println("tank开始打印结束时间");
        System.out.println("tank总共花费时间是" + (endTime - startTime));
    }

}
package com.DesignPatterns.al.Dynamic3;
/**
 * 现在假如我们有一个打印日志的代理,一个打印时间的代理(甚至还有事物的代理,还比如说我检查当前的人有没有运行我这个方法的权限等等)。
 * 假如我们用继承的话会怎么办呢,我们就的让打印日志的代理继承目标,再让打印时间的代理继承时间的类,让事物的代理继承代理时间的类,让运行权限的代理继承事物的代理......
 *。还有就是假如现在我们换了顺序了,先出打印日志的代理,然后在用时间的代理继承时间的代理,那么又会多出来两个代理类,想想都是一件恐怖的事情,类太多了。
 *
 * 但是我们用接口(聚合呢,我们来看这个例子。)
 * 聚合有点类似于装饰着设计模式:在这里我们要注意这几模式其实更看重的是使用场景,而不是具体细节的用法。
 * 其实设计模式多多少少都想多态,但是我们注意设计模式更看重的是语义上的而不是语法上的。
 *
 *
 * 现在静态的代理已经将完了,但是我们来看这个代理有什么缺陷,首先代理类和目标类必须继承相同的接口(虽然是缺点但是可以接受)
 * 但是还有一个就是,假如现在有其它的类加car也需要实现打印时间的代理,那我们怎么做的,你说好说,在写一个car的代理呗。
 * 那假如现在有自行车,火车,货车,电瓶车,小推车,等等100多个都要求实现时间的代理,是不是需要些100多个类呢。
 *
 * 下面就引出了动态代理。
 * @author qingruihappy
 * @data   2018年11月1日 上午12:39:35
 * @说明:
 */
public class Test {
    public static void main(String[] args) {
    /*    TankTime m=new TankTime(new Tank());
        TankLog n=new TankLog(m);
        n.move();*/

        TankLog m=new TankLog(new Tank());
        TankTime n=new TankTime(m);
        n.move();
    }

}
tank开始打印日志
tank开始打印开始时间
坦克在移动
tank开始打印结束时间
tank总共花费时间是636
tank开始打印结束
tank开始打印开始时间
tank开始打印日志
坦克在移动
tank开始打印结束
tank开始打印结束时间
tank总共花费时间是270

原文地址:https://www.cnblogs.com/qingruihappy/p/9887094.html

时间: 2024-10-17 04:05:51

设计模式(22)-----代理设计模式-----静态代理的相关文章

JAVA设计模式——代理(静态代理)

定义 为其它的对象提供一种代理,以控制这个对象的访问 使用场景 当不想直接访问某个对象的时候,就可以通过代理 1.不想买午餐,同事帮忙带 2.买车不用去厂里,去4s店 3.去代理点买火车票,不用去车站 UML 介绍下上面的UML图的意思,以购买火车票为例: 定义代理的接口,买票 (1)IProxy 代理的对象,完成代理的任务,设置具体的代理,调用具体的代理方法等 (2)ProxyObject 被代理对象,处理具体的业务逻辑 (3)RealObject 代码实现 上面我们已经很清晰的明白了他们之间

java 基础 --- 动态代理和静态代理

问题  : 代理的应用场景是什么 动态代理的底层原理是什么,为什么只能继承接口 概述 代理模式是设计模式的一种,简单地说就是调用代理类的方法实际就是调用真实类的方法.这种模式在AOP (切面编程)中非常常见,使用的场景比如事务,网络代理等.他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.本文将会介绍代理的两种方式 : 静态代理和动态代理. 静态代理 :由程序员创建或特定工具自动生成源代码,也就是在编译时就已经将接口,被代理

Atitit 代理CGLIB 动态代理 AspectJ静态代理区别

Atitit 代理CGLIB 动态代理 AspectJ静态代理区别 1.1. AOP 代理主要分为静态代理和动态代理两大类,静态代理以 AspectJ 为代表:而动态代理则以 spring AOP 为代表 1 1.2. JDK动态代理是模拟接口实现的方式,cglib是模拟子类继承的方式1 1.3. CGLIB代理模式的缺点 在static和final方法上应用横切关注点也是无法做到的.2 1.1. AOP 代理主要分为静态代理和动态代理两大类,静态代理以 AspectJ 为代表:而动态代理则以 

【Java】代处理?代理模式 - 静态代理,动态代理

>不用代理 有时候,我希望在一些方法前后都打印一些日志,于是有了如下代码. 这是一个处理float类型加法的方法,我想在调用它前打印一下参数,调用后打印下计算结果.(至于为什么不直接用+号运算,见[Java]Float计算不准确) package com.nicchagil.study.java.demo.No09代理.No01不用代理; import java.math.BigDecimal; public class FloatCalculator { public float add(fl

Java代理模式——静态代理模式

一:代理模式 代理模式的作用是:为其他对象提供一种代理以控制这个对象的访问.在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 二:代理模式设计到的角色 抽象角色:声明真是对象和代理对象的共同接口(抽象类或接口). 代理角色:代理对象角色内部含有对真是对象的引用,从而可以操作真是对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能够代替真是对象.同时,代理对象可以在执行真实对象的操作时,附加其他操作,相当于对真是对象进行封装. 真实

代理模式-静态代理与动态代理

简介 首先感谢沽泡学院 tom 老师 代理模式是一种结构型模式 代理模式就是代理对象帮被代理对象处理一些问题, 类似中介, 客户只要结果, 中介怎么搞是他的事儿, 他可能再处理过程中赚外快什么的 代理模式的应用: spring中的aop, 日常工作中记录日志, 统计时间,权限控制等 这里我们使用一个客户端代理访问google举例, 具体细节可能不合适, 意会.意会.意会... 静态代理 /** * 一个服务器接口, 服务器有很多功能, 可以用来路由, 建站等... */ public inter

关于动态代理和静态代理的区别

静态代理: 简单来说就是:通过真实的实现类A和proxy代理实现同一个接口,然后在proxy代理里引入A对象的引用. 这样做的目的,就是为了可以实现一些其他的功能,但是不会让真实类变得膨胀. 优点: 代理使客户端不需要知道实现类是什么,怎么做的,而客户端只需知道代理即可(解耦合),对于如上的客户端代码,newUserManagerImpl()可以应用工厂将它隐藏,如上只是举个例子而已. 缺点: 1)代理类和委托类实现了相同的接口,代理类通过委托类实现了相同的方法.这样就出现了大量的代码重复.如果

设计模式(一) 静态代理

1.1.简单理解代理模式 代理(Proxy)是一种设计模式, 提供了对目标对象另外的访问方式:即通过代理访问目标对象. 这样好处: 可以在目标对象实现的基础上,增强额外的功能操作,扩展目标对象的功能.列如:我们有的时候打官司,我们需要请律师,因为律师在法律方面有专长,可以替我们进行打赢官司的操作,表达我们的想法.在这个列子中,我们就是目标对象,而律师就是代理对象,帮助我们完成我们所想的事情.当然打赢官司与打不赢这就是另外一回事了. 代理模式的关键点: 代理对象 与 目标对象. 1.2.静态代理

java 设计模式 - 代理模式 - 静态代理

代理模式:使用环境无法直接使用对象A(委托对象),可以使用对象B(代理对象)调用对象A已达到直接调用对象A的效果,就成为代理模式. 其中A为委托对象,B为代理对象. 静态代理的优缺点: 优点: 1.代码只管,可以清楚理解委托雷以及代理类. 2.在编译期加入,提前就指定好了委托类,代理类,效率高. 缺点: 1.静态代理很麻烦,需要大量的代理类,不易于代码维护等 当我们有多个目标对象需要代理时,我就需要建立多个代理类,改变原有的代码,改的多了就很有可能出问题,必须要重新测试. 2.重复的代码会出现在

[z]Java代理(jdk静态代理、动态代理和cglib动态代理)

一.代理是Java常用的设计模式,代理类通过调用被代理类的相关方法,并对相关方法进行增强.加入一些非业务性代码,比如事务.日志.报警发邮件等操作. 二.jdk静态代理 1.业务接口 1 2 3 4 5 6 7 8 9 10 11 12 13 /**  * 业务接口  * @author pc  *  */ public interface UserService {          // 增加一个用户     public void addUser();     // 编辑账户     pub