IDOL的代理模式
时间:2022-06-23
本文章向大家介绍IDOL的代理模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
代理模式
代理模式 Proxy Pattern
- 代理模式属于GoF23种设计模式之一,是结构型模式的一种。
- 代理模式是为一个真实的对象提供一个代理从而通过代理控制对这个真实对象的访问的设计模式。
- 简单的理解代理模式,就是理解代理两个字,何为代理,就是为自己找一个代理人,比如明星有着自己的经纪人,被告原告有着自己的律师,亦或是总经理级别的,董事长级别的大佬们有着自己的秘书,等等,都是代理的现实体现。
代理模式的组成
代理模式分为了三个角色:
- 抽象角色:一个接口或者抽象类,声明的是真实对象需要实现的方法。
- 真实对象角色:实现了抽象角色并且实现了自己需要实现的功能,用以提供给代理调用。
- 代理:实现了抽象角色并含有一个真实对象角色的引用,是真实对象角色的代理,通过对真实对象的业务逻辑有条件性的控制来实际处理的逻辑。
代理模式的特点
- 代理模式最为重要的就是在客户和真实对象之间有着一种类似于中介的作用,对真实对象进行了很大的保护作用。
- 对于真实对象来说也就不需要关心其他,只需要实现好自己的功能即可。
来个小案例
情景:娱乐行业的发展在现今是极为迅猛的,五花八门的各种电影,电视剧,综艺节目充斥在我们的周围,很多很多的人都有着自己心目中的IDOL,每个明星都有着自己的特殊技巧在娱乐业中发光,每位明星都有着自己的经纪人或者是自己的团队,对于各种邀约,商家们首先需要找的不是明星本人而是她的经纪人们洽谈,但是最后需要实际作用的还是明星自己本人呢! 于是我们就可以开始编写我们的小栗子啦!
- 对于情景中的各个角色进行定位分配 抽象角色:明星自身会的功能抽象集合,案例中为Abilities接口。 真实对象:明星,案例中为IDOL类。 代理:经纪人,案例中为Agent类。
- 来一张UML类图梳理关系
UML类图
- 抽象接口角色的定义
/**
* 代理模式案例
* 抽象角色 接口的定义部分
* @author WQ
*/
public interface Abilities {
void sing();
void dance();
void rap();
}
- 真实对象角色的定义
/**
* 代理模式案例
* 真实对象角色 IDOL类实现部分
* @author WQ
*/
public class IDOL implements Abilities{
@Override
public void sing() {
System.out.println("唱歌!");
}
@Override
public void dance() {
System.out.println("跳舞!");
}
@Override
public void rap() {
System.out.println("Rap 饶舌!");
}
}
- 代理的定义
/**
* 代理模式案例
* 代理 经纪人类实现部分
* @author WQ
*/
public class Agent implements Abilities{
private IDOL idol;
private float money;
/*
* 通过字段money来对唱歌,跳舞,rao进行控制!
* 到了一定的金额才有相应的功能会被触发!
*/
@Override
public void sing() {
if (money >= 20000){
idol.sing();
}else {
System.out.println("钱不够,本家IDOL不提供唱歌服务!");
}
}
@Override
public void dance() {
if (money >= 80000){
idol.dance();
}else {
System.out.println("钱不够,本家IDOL不提供跳舞服务!");
}
}
@Override
public void rap() {
if (money >= 100000){
idol.rap();
}else {
System.out.println("钱不够,本家IDOL不提供rap服务!");
}
}
public float getMoney() {
return money;
}
public void setMoney(float money) {
this.money = money;
}
public Agent() {
}
public Agent(IDOL idol) {
this.idol = idol;
}
public Agent(IDOL idol, float money) {
this.idol = idol;
this.money = money;
}
}
- 测试类的编写
/**
* 代理模式案例
* 测试案例 客户端实现部分
* @author WQ
*/
public class Test {
public static void main(String[] args){
// 真实对象
IDOL idol = new IDOL();
// 将真实对象提供给代理
Agent agent = new Agent(idol);
//客户第一次出价为9K
System.out.println("第一次测试:");
agent.setMoney(9000f);
agent.sing();
agent.dance();
agent.rap();
//客户第二次出价为11W
System.out.println("第二次测试:");
agent.setMoney(110000f);
agent.sing();
agent.dance();
agent.rap();
}
}
- 运行结果截图
测试结果
代理模式的介绍就到这里啦!!! 上述的代理模式的实现方式也称为静态代理的实现模式,除了静态代理,还有JDK的动态代理和通过CGLIB的动态代理实现模式。
- R完成--决策树分类 一个使用rpart完成决策树分类的例子如下:
- Apollo的数据开放平台介绍
- 手把手教你运行apollo
- 归档模式下四种完全恢复的场景(r6笔记第8天)
- Git与Repo快速入门
- 10g,11g中的数据库克隆安装(r6笔记第7天)
- CVE-2017-16943 Exim UAF漏洞分析——后续
- “盲”逆向:iOS 应用 Blind 寻踪
- 根据时间字段导入数据的问题总结 (r6笔记第6天)
- Gnuboard 漏洞分析
- 一次数据库宕机问题的分析(r6笔记第5天)
- PWN学习之house of系列(一)
- 清理session的小插曲(二) (r6笔记第4天)
- 3.训练模型之在GPU上训练的环境安装
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- dotnet 关于 SmartSql 的 SQL 语句的属性替换前缀说明
- 为什么java初学者要学习一点前端技术?
- Expedition (POJ 2431)
- java JVM 报C [libresolv.so.2+0x7e7d] __libc_res_nquery+0x4dd 解决
- Fence Repair (PKU 3253)
- JAVA 初学者的编码规范一:命名风格与代码格式
- Leetcode No.11 盛最多水的容器
- OpenCV图像拼接函数vconcat()&hconcat()
- JAVA自定义注解
- [ 物联网篇 ] 28 - Linux ES7210 Driver 调试
- [ 利器篇 ] - Microsoft Surface Pro 系列安装 Ubuntu 16.04 系统
- 如何优雅的打造 All-in One 仓库
- matplotlib绘图教程:设置标签与图例
- 企业是如何从头开发一个商业项目的?
- 基于Haproxy的高可用实战