JAVA设计模式之静态代理
作者:刘信坚
链接: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设计模式之静态代理的更多相关文章
- JAVA设计模式:静态代理
一.概念代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关 ...
- 用过滤器和装饰者设计模式(静态代理)解决getParameter乱码问题
post的乱码问题比较好解决,这里主要是对get请求的乱码做处理 解决思路:增强request对象的getParameter方法,使之 getParameter 直接获取到的就是解决乱码后的数据 有 ...
- java设计模式之Proxy(代理模式)
java设计模式之Proxy(代理模式) 2008-03-25 20:30 227人阅读 评论(0) 收藏 举报 设计模式javaauthorizationpermissionsstringclass ...
- 黑马程序员:Java基础总结----静态代理模式&动态代理
黑马程序员:Java基础总结 静态代理模式&动态代理 ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 静态代理模式 public class Ts { ...
- Java设计模式之《代理模式》及应用场景
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6525527.html 代理模式算是我接触较早的模式,代理就是中介,中间人.法律上也有代理, ...
- Java中的静态代理实现方式
1.编写一个接口类 如:Subject package com.neusoft.pattern.staticProxy; /** * <p>Title:</p> * <p ...
- java中的静态代理和动态代理,入门整理
静态代理和动态代理主要解决的问题是:在直接访问对象时带来的问题,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后 ...
- 017 Java中的静态代理、JDK动态代理、cglib动态代理
一.静态代理 代理模式是常用设计模式的一种,我们在软件设计时常用的代理一般是指静态代理,也就是在代码中显式指定的代理. 静态代理由业务实现类.业务代理类两部分组成.业务实现类负责实现主要的业务方法,业 ...
- java设计模式-----11、代理模式
Proxy模式又叫做代理模式,是构造型的设计模式之一,它可以为其他对象提供一种代理(Proxy)以控制对这个对象的访问. 所谓代理,是指具有与代理元(被代理的对象)具有相同的接口的类,客户端必须通过代 ...
随机推荐
- Sublime Text 输入法跟随光标
通过PackageControl安装“IMESupport”,重启Sublime Text3,即可解决: 注:如项目自述,仅支持Windows.
- ffmpeg转码器移植VC的project:ffmpeg for MFC
本文介绍一个自己做的FFMPEG移植到VC下的开源project:ffmpeg for MFC.本project将ffmpegproject中的ffmpeg转码器(ffmpeg.c)移植到了VC环境下 ...
- java生成兑换码礼包码--工具类
import java.util.HashSet; import java.util.Random; import java.util.Set; public class GenSerial { pr ...
- C++ STL堆操作
/* STL 最大堆.最小堆的应用 */ #include <iostream> #include <vector> #include <algorithm> // ...
- IIS 配置详解 请求长度限制调整
当上传一个超过30M的文件时,服务器会重定向至404.13页面,报错如下: HTTP Error 404.13 - Not Found The request filtering module is ...
- js 正则表达式验证网站域名
正则表达式 ^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9](?:\.[a-zA-Z]{2,})+$
- rabbitmq消费端加入精确控频。
控制频率之前用的是线程池的数量来控制,很难控制.因为做一键事情,做一万次,并不是每次消耗的时间都相同,所以很难推测出到底多少线程并发才刚好不超过指定的频率. 现在在框架中加入控频功能,即使开200线程 ...
- 解决Postgres无法连接的问题
错误信息如下: could not connect to server: Connection refused Is the server running on host host.domain.co ...
- Vivado Design Suite用户指南之约束的使用第一部分(介绍部分)
首先来看目录部分: 首先是介绍部分:这部分讲述的是Migrating From UCF Constraints to XDC Constraints(从UCF约束迁移到XDC约束)和About XDC ...
- Golang 笔记 2 函数、结构体、接口、指针
一.函数 Go中函数是一等(first-class)类型.我们可以把函数当作值来传递和使用.Go中的函数可以返回多个结果. 函数类型字面量由关键字func.由圆括号包裹声明列表.空格以及可以由圆括号 ...