作者:刘信坚
链接:http://www.imooc.com/article/details/id/47695
来源:慕课网

首先看看什么是代理模式。

一 代理模式

使用一个代理对象将对象包装起来,然后用该代理对象来取代该对象,任何对原始对象的调用都要通过代理,代理对象决定是否以及何时调用原始对象的方法

二 静态模式

要求被代理类和代理类同时实现相应的一套接口,通过代理类调用重写接口的方法,实际上调用的是原始对象的同样的方法。如下图:

Cilent调用Source的method()方法,实际上是Proxy来调用method()方法,静态代理中Source跟Proxy都要实现接口Sourceable。

三 运行环境

首先是父接口 Animal.java

package com.lxj.proxy;

public interface Animal {

	public void action();
public void breath(); }

Cat.java

package com.lxj.proxy;

//被代理类Cat
public class Cat implements Animal{ @Override
public void action() {
System.out.println("喵喵喵~~~~");
} @Override
public void breath() {
System.out.println("猫式呼吸法~~~~");
}
}

CatProxy.java

package com.lxj.proxy;

//代理类
public class CatProxy implements Animal{ //真正要代理的类
Cat cat; public CatProxy(Cat cat){
this.cat = cat;
} @Override
public void action() {
System.out.println("==========DogProxy 代理类执行开始!=============");
//实质上在代理类中是调用了被代理实现接口的方法
cat.action();
System.out.println("==========DogProxy 代理类执行结束!===========");
} @Override
public void breath() {
System.out.println("==========DogProxy 代理类执行开始!=============");
cat.breath();
System.out.println("==========DogProxy 代理类执行结束!===========");
} }

TestStaticProxy.java

package com.lxj.proxy;

public class TestStaticProxy {

    public static void main(String[] args) {
 //被代理的类Cat,Cat实现了Animal接口
         Cat cat = new Cat();
         //代理类CatProxy,也实现了Animal接口
 CatProxy catProxy = new CatProxy(cat);
         //代理类来调用方法,实际上调用的是Cat的action(),breath()方法
 catProxy.action();
 catProxy.breath();
}
}

运行结果如下:

从运行结果可以看到其实执行的是被代理类的对象.

从这里我们会想,如果我想再创建一个Dog对象,又需要重新为Dog创建一个代理对象,如下:

Dog.java

package com.lxj.proxy;

//被代理类 Dog
public class Dog implements Animal { @Override
public void action() {
        System.out.println("汪汪汪~~~~~");
} @Override
public void breath() {
        System.out.println("狗式呼吸法~~~~");
} }

DogProxy.java

package com.lxj.proxy;

//Dog的代理类
public class DogProxy implements Animal {
   
Dog dog; public DogProxy(Dog dog) {
this.dog = dog;
} @Override
public void action() {
System.out.println("==========DogProxy 代理类执行开始!=============");
dog.action();
System.out.println("==========DogProxy 代理类执行结束!===========");
} @Override
public void breath() {
System.out.println("==========DogProxy 代理类执行开始!=============");
dog.breath();
System.out.println("==========DogProxy 代理类执行结束!===========");
} }

TestStaticProxy.java

package com.lxj.proxy;

public class TestStaticProxy {

    public static void main(String[] args) {
 Cat cat = new Cat();
 CatProxy catProxy = new CatProxy(cat);
 catProxy.action();
 catProxy.breath();
 
 Dog dog = new Dog();
 DogProxy dogProxy = new DogProxy(dog);
 dogProxy.action();
 dogProxy.breath();
}
}

运行结果如下:

JAVA设计模式之静态代理的更多相关文章

  1. JAVA设计模式:静态代理

    一.概念代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关 ...

  2. 用过滤器和装饰者设计模式(静态代理)解决getParameter乱码问题

    post的乱码问题比较好解决,这里主要是对get请求的乱码做处理 解决思路:增强request对象的getParameter方法,使之 getParameter  直接获取到的就是解决乱码后的数据 有 ...

  3. java设计模式之Proxy(代理模式)

    java设计模式之Proxy(代理模式) 2008-03-25 20:30 227人阅读 评论(0) 收藏 举报 设计模式javaauthorizationpermissionsstringclass ...

  4. 黑马程序员:Java基础总结----静态代理模式&动态代理

    黑马程序员:Java基础总结 静态代理模式&动态代理   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 静态代理模式 public  class  Ts {   ...

  5. Java设计模式之《代理模式》及应用场景

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6525527.html 代理模式算是我接触较早的模式,代理就是中介,中间人.法律上也有代理, ...

  6. Java中的静态代理实现方式

    1.编写一个接口类 如:Subject package com.neusoft.pattern.staticProxy; /** * <p>Title:</p> * <p ...

  7. java中的静态代理和动态代理,入门整理

    静态代理和动态代理主要解决的问题是:在直接访问对象时带来的问题,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后 ...

  8. 017 Java中的静态代理、JDK动态代理、cglib动态代理

    一.静态代理 代理模式是常用设计模式的一种,我们在软件设计时常用的代理一般是指静态代理,也就是在代码中显式指定的代理. 静态代理由业务实现类.业务代理类两部分组成.业务实现类负责实现主要的业务方法,业 ...

  9. java设计模式-----11、代理模式

    Proxy模式又叫做代理模式,是构造型的设计模式之一,它可以为其他对象提供一种代理(Proxy)以控制对这个对象的访问. 所谓代理,是指具有与代理元(被代理的对象)具有相同的接口的类,客户端必须通过代 ...

随机推荐

  1. Sublime Text 输入法跟随光标

    通过PackageControl安装“IMESupport”,重启Sublime Text3,即可解决:  注:如项目自述,仅支持Windows.

  2. ffmpeg转码器移植VC的project:ffmpeg for MFC

    本文介绍一个自己做的FFMPEG移植到VC下的开源project:ffmpeg for MFC.本project将ffmpegproject中的ffmpeg转码器(ffmpeg.c)移植到了VC环境下 ...

  3. java生成兑换码礼包码--工具类

    import java.util.HashSet; import java.util.Random; import java.util.Set; public class GenSerial { pr ...

  4. C++ STL堆操作

    /* STL 最大堆.最小堆的应用 */ #include <iostream> #include <vector> #include <algorithm> // ...

  5. IIS 配置详解 请求长度限制调整

    当上传一个超过30M的文件时,服务器会重定向至404.13页面,报错如下: HTTP Error 404.13 - Not Found The request filtering module is ...

  6. js 正则表达式验证网站域名

    正则表达式 ^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9](?:\.[a-zA-Z]{2,})+$

  7. rabbitmq消费端加入精确控频。

    控制频率之前用的是线程池的数量来控制,很难控制.因为做一键事情,做一万次,并不是每次消耗的时间都相同,所以很难推测出到底多少线程并发才刚好不超过指定的频率. 现在在框架中加入控频功能,即使开200线程 ...

  8. 解决Postgres无法连接的问题

    错误信息如下: could not connect to server: Connection refused Is the server running on host host.domain.co ...

  9. Vivado Design Suite用户指南之约束的使用第一部分(介绍部分)

    首先来看目录部分: 首先是介绍部分:这部分讲述的是Migrating From UCF Constraints to XDC Constraints(从UCF约束迁移到XDC约束)和About XDC ...

  10. Golang 笔记 2 函数、结构体、接口、指针

    一.函数 Go中函数是一等(first-class)类型.我们可以把函数当作值来传递和使用.Go中的函数可以返回多个结果.  函数类型字面量由关键字func.由圆括号包裹声明列表.空格以及可以由圆括号 ...