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)以控制对这个对象的访问. 所谓代理,是指具有与代理元(被代理的对象)具有相同的接口的类,客户端必须通过代 ...
随机推荐
- 我们为什么要在Android中使用RxJava
本文翻译来自–>Why should we use RxJava on Android 另外: 微凉一季 再另外: 微凉一季 感觉RxJava近期风生水起,不学习一下都不好意思了.洒家也是初学R ...
- Vue 创建组件的方式
Vue 创建组件的方式 2018年08月07日 11:10:56 虔诚带着决然 阅读数:1015 版权声明:本文为博主原创文章,未经博主允许不得用做其他商业活动. https://blog.csd ...
- 【Leetcode】收集
万事总要有个开头,来吧. 问题原题看情况,如果我能用中文准确地表述出来的话那就用中文说一下.也有可能完全不说… ■ twoSum 问题: 参数是一个数组nums和一个目标数target,寻找nums中 ...
- nohup.out文件过大解决方法 定时任务清空
0.1和2分别表示标准输入.标准输出和标准错误信息输出,可以用来指定需要重定向的标准输入或输出. 在一般使用时,默认的是标准输出,既1.当我们需要特殊用途时,可以使用其他标号.例如,将某个程序的错误信 ...
- 解决space-between最后一排问题
display:flex + justify-content: space-between 能够实现2端对齐的布局,这种布局在网页中很常见.不过这种布局方式有一个问题.举个例子,我们假设现在一排放4个 ...
- 字符集之在UTF-8中,一个汉字为什么需要三个字节?
(一)在UTF-8中,一个汉字为什么需要三个字节? UNICODE是万能编码,包含了所有符号的编码,它规定了所有符号在计算机底层的二进制的表示顺序.有关Unicode为什么会出现就不叙述了,Unico ...
- 真-关闭win10安全中心(windows defender)
狂客原创,转载请注明.侵权必究 第一 任务管理器 启动项 禁用 第二 使用win+R,打开运行命令输入:gpedit.msc然后点击确定 在管理模块下找到Windows组件,接续打开下拉菜单,找到Wi ...
- 七、Sql Server 基础培训《进度7-笛卡尔积(知识点+实际操作)》
知识点: 1.笛卡尔介绍 笛卡尔,近代法国著名哲学家.物理学家.数学家.神学家. 主要成就概述 笛卡尔在科学上的贡献是多方面的.笛卡尔不仅在哲学领域里开辟了一条新的道路,同时笛卡尔又是一勇于探索的科学 ...
- 给vscode添加右键打开功能
将以下文本存为vscode.reg,然后运行: Windows Registry Editor Version 5.00 ; Open files [HKEY_CLASSES_ROOT\*\shel ...
- xcode8 iOS函数返回值使用警告
没有使用返回值时, 警告 swift: @warn_unused_result func doSomething() -> Bool { return true } OC: - (BOOL)do ...