设计模式学习笔记——代理(Proxy)模式
来源:互联网 发布:淘宝网店管家 编辑:程序博客网 时间:2024/06/05 16:05
设计模式学习笔记——代理(Proxy)模式
@(设计模式)[设计模式, 代理模式, proxy]
- 设计模式学习笔记代理Proxy模式
- 基本介绍
- 代理案例
- 类图
- 实现代码
- Printable接口
- Printer类
- PrinterProxy类
- 测试类
- 运行结果
- 代理模式中的角色
- Subject主体
- Proxy代理人
- RealSubject实际的主体
- Client请求者
- 类图
基本介绍
代理模式可以简单的看作是有个中间人代替你进行工作,当中间人完成不了时,才会由你出马完成。
代理案例
类图
实现代码
Printable接口
package com.pc.proxy.example;/** * 可打印接口 * Created by Switch on 2017/3/31. */public interface Printable { /** * 设置名字 * * @param name 名字 */ void setPrinterName(String name); /** * 获取名字 * * @return 名字 */ String getPrinterName(); /** * 显示文字 * * @param string 文字 */ void print(String string);}
Printer类
package com.pc.proxy.example;/** * 打印类 * Created by Switch on 2017/3/31. */public class Printer implements Printable { /** * 名字 */ private String name; public Printer() { this.heavyJob("正在生成Printer的实例"); } public Printer(String name) { this.name = name; this.heavyJob("正在生成Printer的实例(" + this.name + ")"); } @Override public void setPrinterName(String name) { this.name = name; } @Override public String getPrinterName() { return this.name; } @Override public void print(String string) { System.out.println("===" + this.name + "==="); System.out.println(string); } /** * 工作 * * @param msg 消息 */ private void heavyJob(String msg) { System.out.print(msg); for (int i = 0; i < 5; i++) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.print("."); } System.out.println("结束。"); }}
PrinterProxy类
package com.pc.proxy.example;/** * 打印代理类 * Created by Switch on 2017/3/31. */public class PrinterProxy implements Printable { /** * 名字 */ private String name; /** * 本人 */ private Printer real; public PrinterProxy(String name) { this.name = name; } @Override public synchronized void setPrinterName(String name) { if (this.real != null) { this.real.setPrinterName(name); } this.name = name; } @Override public String getPrinterName() { return this.name; } @Override public void print(String string) { this.realize(); this.real.print(string); } /** * 生成本人 */ private synchronized void realize() { if (this.real == null) { this.real = new Printer(this.name); } }}
测试类
package com.pc.proxy.example.test;import com.pc.proxy.example.Printable;import com.pc.proxy.example.PrinterProxy;import org.junit.Test;/** * PrinterProxy Tester. * * @author Switch * @version 1.0 */public class ProxyTest { /** * 测试代理模式 */ @Test public void testProxy() { Printable p = new PrinterProxy("Alice"); System.out.println("现在的名字是" + p.getPrinterName() + "。"); p.setPrinterName("Bob"); System.out.println("现在的名字是" + p.getPrinterName() + "。"); p.print("Hello, World."); }}
运行结果
现在的名字是Alice。现在的名字是Bob。正在生成Printer的实例(Bob).....结束。===Bob===Hello, World.
代理模式中的角色
Subject(主体)
Subject
角色定义了使Proxy
角色和RealSubject
角色之间具有一致性的接口。由于存在Subject
角色,所以Client
角色不必在意它所使用的究竟是Proxy
角色还是RealSubject
角色。在案例中,由Printable
接口扮演此角色。
Proxy(代理人)
Proxy
角色会尽量处理来自Client
角色的请求。只有当自己不能处理时,它才会将工作交给RealSubject
角色。Proxy
角色只有在必要时才会生成RealSubject
角色。Proxy
角色实现了在Subject
角色中定义的接口(API
)。在案例中,由PrinterProxy
类扮演此角色。
RealSubject(实际的主体)
“本人”RealSubject
角色会在“代理人”Proxy
角色无法胜任工作时出场。它与Proxy
角色一样,也实现了在Subject
角色中定义的接口(API
)。在案例中,由Printer
类扮演此角色。
Client(请求者)
使用Proxy
模式的角色。在GoF
书中,Client
角色并不包含在Proxy
模式中。在案例中,由测试类扮演此角色。
类图
GitHub:DesignPatternStudy
——————参考《图解设计模式》
0 0
- 设计模式学习笔记——代理(Proxy)模式
- 设计模式学习笔记—代理模式(Proxy)
- 设计模式学习笔记--代理(Proxy)模式
- 设计模式学习笔记(十三)——Proxy代理
- 《设计模式》学习笔记--代理Proxy
- [设计模式学习笔记]PROXY(代理)
- 《Java与模式》学习笔记:设计模式——代理(Proxy)模式
- 设计模式学习——Proxy代理模式
- 设计模式学习—代理模式(Proxy Design Pattern)
- 设计模式学习笔记(十三)——Proxy代理模式
- 设计模式学习笔记(十三)——Proxy代理模式
- 设计模式——代理模式(Proxy)
- 【设计模式】—— 代理模式Proxy
- 设计模式学习笔记十三(Proxy代理模式)
- 设计模式学习笔记(五)之代理模式(Proxy)
- java 设计模式学习笔记六 proxy代理模式
- 【设计模式】学习笔记15:代理模式(Proxy Pattern)
- 设计模式--学习笔记--代理模式Proxy--基础篇
- ListBox, ListView, GridView
- JVM命令
- 在 Java 中创建微服务
- 关于PNG图像在CAD中的换算比例
- html a标签 图片边框和点击后虚线框的问题
- 设计模式学习笔记——代理(Proxy)模式
- C#中dynamic的正确用法
- 面试问题
- Minimum Absolute Difference in BST
- Base class does not contain a constructor that takes '0' argument
- CAReplicatorLayer的使用示例
- 阿里云RDS调用存储过程报错ERR1449
- 【工作笔记】从零开始学ExtJs6(二)——登录模块
- Eclipse安装server插件