24种设计模式--代理模式【Proxy Pattern】
什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢就先找我的代理人吧,那代理人总要知道被代理人能做哪些事情不能做哪些事情吧,那就是两个人具备同一个接口,代理人虽然不能干活,但是被代理的人能干活呀。
比如西门庆找潘金莲,那潘金莲不好意思答复呀,咋办,找那个王婆做代理,表现在程序上这样的:
先定义一种类型的女人:
package com.iadmob.proxy; /**
* @author http://www.cnblogs.com/initial-road/
* 定义一种类型的女人,王婆和潘金莲都属于这个类型的女人
*/ public interface KindWomen { //这种类型的女人能做什么事情呢?
public void makeEyesWithMan(); //抛媚眼 public void happyWithMan(); //happy } 一种类型嘛,那肯定是接口,然后定义潘金莲: package com.iadmob.proxy; /**
* @author http://www.cnblogs.com/initial-road/
* 定一个潘金莲是什么样的人
*/
public class PanJinLian implements KindWomen{ @Override
public void happyWithMan() {
System.out.println("潘金莲在和男人...");
} @Override
public void makeEyesWithMan() {
System.out.println("潘金莲抛媚眼");
} } 再定一个丑陋的王婆: package com.iadmob.proxy; /**
* @author http://www.cnblogs.com/initial-road/
* 王婆这个人老聪明了,她太老了,是个男人都看不上,
* 但是她有智慧有经验,她作为一类女人的代理
*/
public class WangPo implements KindWomen{
private KindWomen kindWomen; public WangPo(){ //默认的话,是潘金莲的代理
this.kindWomen = new PanJinLian();
} //她可以是KindWomen的任何一个女人的代理,只要你是这一类型
public WangPo(KindWomen kindWomen){
this.kindWomen = kindWomen;
} @Override
public void happyWithMan() {
this.kindWomen.happyWithMan(); //自己老了,干不了,可以让年轻的代替
} @Override
public void makeEyesWithMan() {
this.kindWomen.makeEyesWithMan();
} } 两个女主角都上场了,男主角也该出现了: package com.iadmob.proxy; /**
* @author http://www.cnblogs.com/initial-road/
* 定义一个西门庆,这人色中饿鬼
*/
public class XiMenQing {
/**
* 水浒里是这样写的:西门庆被潘金莲用竹竿敲了一下难道,痴迷了
* 被王婆看到了,就开始撮合两人好事,王婆作为潘金莲的代理人
* 收了不少好处费,那我们假设一下
* 如果没有王婆在中间牵线,这两个不要脸的能成吗?难说的很!
*/
public static void main(String[] args) {
//把王婆叫出来
WangPo wangPo = new WangPo();
//然后西门庆就说,我要和潘金莲happy,然后王婆就安排了西门庆丢筷子的哪出戏:
wangPo.makeEyesWithMan(); //看到没,虽然表面上王婆在做,实际上爽的是潘金莲
wangPo.happyWithMan();
}
}
这就是活生生的一个例子,通过代理人实现了某种目的,如果真去掉王婆这个中间环节,直接是西门庆和潘金莲勾搭,估计很难成就武松杀嫂事件。
那我们再考虑一下,水浒里还有没有这类型的女人?有,卢俊义的老婆贾氏(就是和那个固管家苟且的那个),这名字起的:“贾氏”,那我们也让王婆做她的代理:
把贾氏素描出来:
package com.iadmob.proxy;
public class JiaShi implements KindWomen{
@Override
public void happyWithMan() {
System.out.println("贾氏正在Happy中......");
}
@Override
public void makeEyesWithMan() {
System.out.println("贾氏抛媚眼");
}
}
西门庆勾贾氏:
package com.iadmob.proxy; /**
* @author http://www.cnblogs.com/initial-road/
* 定义一个西门庆,这人色中饿鬼
*/
public class XiMenQing {
/**
* 水浒里是这样写的:西门庆被潘金莲用竹竿敲了一下难道,痴迷了
* 被王婆看到了,就开始撮合两人好事,王婆作为潘金莲的代理人
* 收了不少好处费,那我们假设一下
* 如果没有王婆在中间牵线,这两个不要脸的能成吗?难说的很!
*/
public static void main(String[] args) { //改编一下历史,贾氏被西门庆勾走:
JiaShi jiaShi = new JiaShi();
WangPo wangPo = new WangPo(jiaShi); //让王婆作为贾氏的代理人
wangPo.makeEyesWithMan();
wangPo.happyWithMan();
}
}
说完这个故事,总结一下,代理模式主要使用了Java的多态,干活的是被代理类,代理类主要是接活,你让我干活,好,我交给幕后的类去干,你满意就成,那怎么知道被代理类能不能干呢?同根就成,大家知根知底,你能做啥,我能做啥都清除的很,同一个接口呗。
24种设计模式--代理模式【Proxy Pattern】的更多相关文章
- 设计模式 - 代理模式(proxy pattern) 未使用代理模式 具体解释
代理模式(proxy pattern) 未使用代理模式 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 部分代码參考: http://blog.csdn. ...
- 设计模式——代理模式(Proxy Pattern)
代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问. UML图: 模型设计: Subject类: package com.cnblog.clarck; /** * Subject 类 ...
- C#设计模式——代理模式(Proxy Pattern)
一.概述在软件开发中,有些对象由于创建成本高.访问时需要与其它进程交互等原因,直接访问会造成系统速度慢.复杂度增大等问题.这时可以使用代理模式,给系统增加一层间接层,通过间接层访问对象,从而达到隐藏系 ...
- 23种设计模式--代理模式-Proxy
一.代理模式的介绍 代理模式我们脑袋里出现第一个词语就是代购,其实就是这样通过一个中间层这个中间成是属于什么都干什么都买得,俗称"百晓生",在平时得开发中我们经常会听到 ...
- 设计模式 -- 代理模式 (Proxy Pattern)
定义: 为其他对象提供一种代理以控制对这个对象的访问: 角色: 1,抽象主题类,(接口或者抽象类),抽象真实主题和代理的共有方法(如下Subject类): 2,具体实现的主题类,继承或者实现抽象主题类 ...
- 24种设计模式-策略模式(Strategy Pattern)
一.优点: 1. 策略模式提供了管理相关的算法族的办法.策略类的等级结构定义了一个算法或行为族.恰当使用继承可以把公共的代码转移到父类里面,从而避免重复的代码. 2. 策略模式提供了可以替换继承关系的 ...
- 二十四种设计模式:代理模式(Proxy Pattern)
代理模式(Proxy Pattern) 介绍为其他对象提供一个代理以控制对这个对象的访问. 示例有一个Message实体类,某对象对它的操作有Insert()和Get()方法,用一个代理来控制对这个对 ...
- 乐在其中设计模式(C#) - 代理模式(Proxy Pattern)
原文:乐在其中设计模式(C#) - 代理模式(Proxy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 代理模式(Proxy Pattern) 作者:webabcd 介绍 为 ...
- 设计模式系列之代理模式(Proxy Pattern)——对象的间接访问
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
随机推荐
- (转载)在vmware中简单配置vsftpd服务器
(转载)http://blog.chinaunix.net/uid-7453676-id-2625582.html 分类: LINUX 一 试验的前期环境搭建 系统环境:Fedora 2 软件 ...
- 数据结构(分块):[HZOI 2015]easy seq
[题目描述] 给定一个序列,下标从0开始,分别为a0,a1,a2...an−1,有m个询问,每次给出l和r,求满足ai=aj且l<=i<=j<=r时j−i的最大值 本题强制在线,l和 ...
- Windows下的PHP安装文件线程安全和非线程安全的区别
从2000年10月20日发布的第一个Windows版的PHP3.0.17开始的都是线程安全的版本,这是由于与Linux/Unix系统是采用 多进程的工作方式不同的是Windows系统是采用多线程的工作 ...
- [经典] Best Time to Buy and Sell Stock
这一系列求最优值的问题变种挺多 1. Say you have an array for which the ith element is the price of a given stock on ...
- 部署MongoDB扩展并测试使用php简单连接操作之
1,下载MongoDB数据库扩展介质 wget http://pecl.php.net/get/mongo-1.5.1.tgz 2,tar zxvf mongo-1.5.1.tgz &&am ...
- 外显子分析:cutadapt,去除序列adapter详细解析
外显子测序时带有adapt接头,因此我们需要去除adapt接头,cutadapt的作用是去除adapt接头,一般用到如下命令: cutadapt -a AACCGGTT -o output.fastq ...
- w10 系统升级
怎么把电脑升级到w10系统? 下载一个软件,Windows10Upgrade9252.exe, 5M左右,把windows更新开启后,运行即可! 升级后,请把windows.old 文件夹删除,这个文 ...
- mac with windows dirver
S1: find your mac serial number on the back,like Serial No.C02Fn09GDDQW S2: baidu "苹果序列号查询" ...
- poj1673
所谓Exocenter就是垂心.不难证明. #include <iostream> #include <math.h> #include <stdio.h> str ...
- IE8下提示'console'没有定义错误
在开发的过程中因为调试的原因,在代码中增加console.info("xxxx"),而未进行删除 在IE8下測试该代码所在的页面报错,例如以下: 须要注意的是,使用console对 ...