大话设计模式--第七章 代理模式
时间:2022-07-25
本文章向大家介绍大话设计模式--第七章 代理模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
代理模式
场景描述:
1. 卓贾易喜欢娇娇, 但是, 娇娇并不认识卓贾易, 那么他给娇娇送花, 送巧克力,送洋娃娃
2. 卓贾易也可以不这么做, 他喜欢娇娇, 找一个人, 让这个人吧鲜花, 巧克力和洋娃娃送给娇娇.
这是两种方式, 但达到的目的是一样的。我们下面来看看这两个代码的实现:
第一种: 卓贾易喜欢娇娇, 那么他给娇娇送花, 送巧克力,送洋娃娃
追求者
package com.designModel.chapter7_proxyModel.step1;
/**
* 追求者
*/
public class Pursuit {
//追求的对象
private SchoolGril sg;
public Pursuit(SchoolGril sg){
this.sg = sg;
}
// 行为: 给被追求者送花,送巧克力, 送洋娃娃
public void sendFllower(){
System.out.println(sg.getName() + " 送你鲜花");
}
public void sendDolls(){
System.out.println(sg.getName() + " 送你洋娃娃");
}
public void sendChocolate(){
System.out.println(sg.getName() + " 送你巧克力");
}
}
被追求者
package com.designModel.chapter7_proxyModel.step1;
/**
* 被追求者
*/
public class SchoolGril {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
客户端
public static void main(String[] args) {
SchoolGril sg = new SchoolGril();
sg.setName("娇娇");
Pursuit pursuit = new Pursuit(sg);
pursuit.sendChocolate();
pursuit.sendDolls();
pursuit.sendFllower();
}
从代码来看, 卓贾易和娇娇是认识的. 并且, 卓贾易直接把鲜花, 巧克力, 洋娃娃送给了娇娇.
而实际上, 卓贾易和娇娇可能是不认识的. 这时候, 卓贾易也不好直接把鲜花, 巧克力, 洋娃娃送给娇娇. 于是, 就找了一个和娇娇熟悉的人戴励, 把礼物送给娇娇.
这时候, 戴励就是一个中间的代理. 他替卓贾易送礼品, 但实际上礼品是卓贾易买的. 找戴励送过去的. 这个代码怎么实现呢?注意一下几点:
1. 戴励和卓贾易的行为是一样的. 送礼物
2. 戴励送的礼物是卓贾易买的
既然戴励和卓贾易的行为都是一样的. 用面向对象的思想考虑. 肯定要把变化点抽象出来了. 结构图如下:
首先有一个父类: 送礼物.
代理和追求者都实现了送礼物这个类, 代理还关联追求者类。
代码实现如下:
礼物抽象类
package com.designModel.chapter7_proxyModel.step2;
/**
* 送礼物抽象类
*/
public abstract class SendGift {
public abstract void sendDolls();
public abstract void sendChocolate();
public abstract void sendFlower();
}
追求者
package com.designModel.chapter7_proxyModel.step2;
/**
* 追求者
*/
public class Pursuit extends SendGift {
private SchoolGril sg;
public Pursuit(SchoolGril sg) {
this.sg = sg;
}
// 行为: 给被追求者送花,送巧克力, 送洋娃娃
@Override
public void sendFlower(){
System.out.println(sg.getName() + " 送你鲜花");
}
@Override
public void sendDolls(){
System.out.println(sg.getName() + " 送你洋娃娃");
}
@Override
public void sendChocolate(){
System.out.println(sg.getName() + " 送你巧克力");
}
}
代理
package com.designModel.chapter7_proxyModel.step2;
public class Proxy extends SendGift {
private Pursuit pu;
public Proxy(SchoolGril sg){
pu = new Pursuit(sg);
}
@Override
public void sendDolls() {
pu.sendDolls();
}
@Override
public void sendChocolate() {
pu.sendChocolate();
}
@Override
public void sendFlower() {
pu.sendFlower();
}
}
被追求者
package com.designModel.chapter7_proxyModel.step2;
/**
* 被追求者
*/
public class SchoolGril {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
客户端
public static void main(String[] args) {
SchoolGril sg = new SchoolGril();
sg.setName("娇娇");
Proxy proxy = new Proxy(sg);
proxy.sendChocolate();
proxy.sendDolls();
proxy.sendFlower();
}
运行结果:
娇娇 送你巧克力
娇娇 送你洋娃娃
娇娇 送你鲜花
- 中国造机器人突破新高,将大量挤压就业空间,明天在哪里打工?
- 嵌入式数据库Perst
- USB 设备的PID-Product ID,VID-Vendor ID
- Asp.Net4.0/VS2010新变化(3):webform中也可以直接url路由
- IIS7上部署Asp.Net4.0时UrlRouting的若干问题
- As3.0中的反射
- 域名yg.cc以10.2万元的价格结拍,可搭建“摇滚”音乐平台
- 修改 Windows Host 文件工具
- win7下恢复“经典任务栏”/“快速启动栏”,关闭“窗口自动最大化”
- WCF和ASP.NET Web API 接口执行时间监控
- 额的神啊:AS3中Button被disable了,也会触发Click事件!
- [原创]CI持续集成系统环境---部署gerrit环境完整记录
- CentOS设置Mono环境变量
- 分布式监控系统Zabbix-3.0.3-完整安装记录(2)-添加mysql监控
- 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 数组属性和方法
- 团体程序设计天梯赛-练习集 L1-056 猜数字
- PAT (Basic Level) Practice (中文)1001 害死人不偿命的(3n+1)猜想
- PAT (Basic Level) Practice (中文)1002 写出这个数
- PAT (Basic Level) Practice (中文)1004 成绩排名
- PAT (Basic Level) Practice (中文)1006 换个格式输出整数
- PAT (Basic Level) Practice (中文)1008 数组元素循环右移问题
- Ceph分布式存储日常运维管理手册
- MyBatis为了解决二级缓存脏读问题,究竟做了那些骚操作!
- PAT (Basic Level) Practice (中文)1009 说反话
- PAT (Basic Level) Practice (中文)1011 A+B 和 C
- PAT (Basic Level) Practice (中文)1013 数素数
- PAT (Basic Level) Practice (中文)1012 数字分类
- PAT (Basic Level) Practice (中文)1016 部分A+B
- PAT (Basic Level) Practice (中文)1086 就不告诉你
- PAT (Basic Level) Practice (中文)1061 判断题