- 浏览: 407423 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (325)
- 神经网络 (1)
- javascript (11)
- 数据结构 (2)
- 计算机图形学 (11)
- 模式识别 (1)
- 前端开发 (14)
- 机器学习 (11)
- ios开发 (50)
- Python (9)
- HTML5 (4)
- 计算机视觉 (9)
- 数字图像处理 (7)
- 架构设计 (19)
- 数据库设计 (9)
- 算法设计 (59)
- Java (37)
- 其他 (3)
- 游戏开发 (5)
- c++ (17)
- Linux (3)
- TCP/IP (2)
- Flex (41)
- 健康 (6)
- AI (2)
- 工具 (1)
- 数据挖掘 (1)
- 性能优化 (6)
- 综合 (2)
- 网络通信 (12)
- Android (2)
- UML (3)
- 软件设计 (11)
- 编程经验 (7)
- J2EE (1)
- 多媒体技术 (3)
- 数学 (7)
- php (4)
- 设计 (1)
- CS (2)
- 计算机理论 (1)
- 信息安全 (1)
最新评论
-
ahead_zhan:
good good good
flex3控件_ModuleLoader -
lonerzf:
好样的。非常感谢楼主
OpenCV视频教程整理 -
lonerzf:
好样的。谢谢~
OpenCV视频教程整理 -
coding1688:
博主说的不错,我在实现瀑布流布局时也用的masonry插件,有 ...
Javascript 瀑布流式布局及其动态效果的实现 -
snowolf:
除非玩游戏,不然没啥win的事情,或者用win的银行客户端,通 ...
macbook安装操作系统的机理分析
参考:http://www.cnblogs.com/java-my-life/archive/2012/06/20/2554024.html
在阎宏博士的《JAVA与模式》一书中开头是这样描述调停者(Mediator)模式的:
调停者模式是对象的行为模式。调停者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显引用。从而使它们可以较松散地耦合。当这些对象中的某些对象之间的相互作用发生改变时,不会立即影响到其他的一些对象之间的相互作用。从而保证这些相互作用可以彼此独立地变化。
为什么需要调停者
如下图所示,这个示意图中有大量的对象,这些对象既会影响别的对象,又会被别的对象所影响,因此常常叫做同事(Colleague)对象。这些同事对象通过彼此的相互作用形成系统的行为。从图中可以看出,几乎每一个对象都需要与其他的对象发生相互作用,而这种相互作用表现为一个对象与另一个对象的直接耦合。这就是过度耦合的系统。
通过引入调停者对象(Mediator),可以将系统的网状结构变成以中介者为中心的星形结构,如下图所示。在这个星形结构中,同事对象不再通过直接的联系与另一个对象发生相互作用;相反的,它通过调停者对象与另一个对象发生相互作用。调停者对象的存在保证了对象结构上的稳定,也就是说,系统的结构不会因为新对象的引入造成大量的修改工作。
一个好的面向对象的设计可以使对象之间增加协作性(Collaboration),减少耦合度(Couping)。一个深思熟虑的设计会把一个系统分解为一群相互协作的同事对象,然后给每一个同事对象以独特的责任,恰当的配置它们之间的协作关系,使它们可以在一起工作。
如果没有主板
大家都知道,电脑里面各个配件之间的交互,主要是通过主板来完成的。如果电脑里面没有了主板,那么各个配件之间就必须自行相互交互,以互相传送数据。而且由于各个配件的接口不同,相互之间交互时,还必须把数据接口进行转换才能匹配上。
所幸是有了主板,各个配件的交互完全通过主板来完成,每个配件都只需要和主板交互,而主板知道如何跟所有的配件打交道,这样就简单多了。
调停者模式的结构
调停者模式的示意性类图如下所示:
调停者模式包括以下角色:
● 抽象调停者(Mediator)角色:定义出同事对象到调停者对象的接口,其中主要方法是一个(或多个)事件方法。
● 具体调停者(ConcreteMediator)角色:实现了抽象调停者所声明的事件方法。具体调停者知晓所有的具体同事类,并负责具体的协调各同事对象的交互关系。
● 抽象同事类(Colleague)角色:定义出调停者到同事对象的接口。同事对象只知道调停者而不知道其余的同事对象。
● 具体同事类(ConcreteColleague)角色:所有的具体同事类均从抽象同事类继承而来。实现自己的业务,在需要与其他同事通信的时候,就与持有的调停者通信,调停者会负责与其他的同事交互。
源代码
抽象调停者类
public interface Mediator {
/**
* 同事对象在自身改变的时候来通知调停者方法
* 让调停者去负责相应的与其他同事对象的交互
*/
public void changed(Colleague c);
}
具体调停者类
public class ConcreteMediator implements Mediator {
//持有并维护同事A
private ConcreteColleagueA colleagueA;
//持有并维护同事B
private ConcreteColleagueB colleagueB;
public void setColleagueA(ConcreteColleagueA colleagueA) {
this.colleagueA = colleagueA;
}
public void setColleagueB(ConcreteColleagueB colleagueB) {
this.colleagueB = colleagueB;
}
@Override
public void changed(Colleague c) {
/**
* 某一个同事类发生了变化,通常需要与其他同事交互
* 具体协调相应的同事对象来实现协作行为
*/
}
}
抽象同事类
public abstract class Colleague {
//持有一个调停者对象
private Mediator mediator;
/**
* 构造函数
*/
public Colleague(Mediator mediator){
this.mediator = mediator;
}
/**
* 获取当前同事类对应的调停者对象
*/
public Mediator getMediator() {
return mediator;
}
}
具体同事类
public class ConcreteColleagueA extends Colleague {
public ConcreteColleagueA(Mediator mediator) {
super(mediator);
}
/**
* 示意方法,执行某些操作
*/
public void operation(){
//在需要跟其他同事通信的时候,通知调停者对象
getMediator().changed(this);
}
}
public class ConcreteColleagueB extends Colleague {
public ConcreteColleagueB(Mediator mediator) {
super(mediator);
}
/**
* 示意方法,执行某些操作
*/
public void operation(){
//在需要跟其他同事通信的时候,通知调停者对象
getMediator().changed(this);
}
}
使用电脑来看电影
在日常生活中,我们经常使用电脑来看电影,把这个过程描述出来,简化后假定会有如下的交互过程:
(1)首先是光驱要读取光盘上的数据,然后告诉主板,它的状态改变了。
(2)主板去得到光驱的数据,把这些数据交给CPU进行分析处理。
(3)CPU处理完后,把数据分成了视频数据和音频数据,通知主板,它处理完了。
(4)主板去得到CPU处理过后的数据,分别把数据交给显卡和声卡,去显示出视频和发出声音。
要使用调停者模式来实现示例,那就要区分出同事对象和调停者对象。很明显,主板是调停者,而光驱、声卡、CPU、显卡等配件,都是作为同事对象。
源代码
抽象同事类
public abstract class Colleague {
//持有一个调停者对象
private Mediator mediator;
/**
* 构造函数
*/
public Colleague(Mediator mediator){
this.mediator = mediator;
}
/**
* 获取当前同事类对应的调停者对象
*/
public Mediator getMediator() {
return mediator;
}
}
同事类——光驱
public class CDDriver extends Colleague{
//光驱读取出来的数据
private String data = "";
/**
* 构造函数
*/
public CDDriver(Mediator mediator) {
super(mediator);
}
/**
* 获取光盘读取出来的数据
*/
public String getData() {
return data;
}
/**
* 读取光盘
*/
public void readCD(){
//逗号前是视频显示的数据,逗号后是声音
this.data = "One Piece,海贼王我当定了";
//通知主板,自己的状态发生了改变
getMediator().changed(this);
}
}
同事类——CPU
public class CPU extends Colleague {
//分解出来的视频数据
private String videoData = "";
//分解出来的声音数据
private String soundData = "";
/**
* 构造函数
*/
public CPU(Mediator mediator) {
super(mediator);
}
/**
* 获取分解出来的视频数据
*/
public String getVideoData() {
return videoData;
}
/**
* 获取分解出来的声音数据
*/
public String getSoundData() {
return soundData;
}
/**
* 处理数据,把数据分成音频和视频的数据
*/
public void executeData(String data){
//把数据分解开,前面是视频数据,后面是音频数据
String[] array = data.split(",");
this.videoData = array[0];
this.soundData = array[1];
//通知主板,CPU完成工作
getMediator().changed(this);
}
}
同事类——显卡
public class VideoCard extends Colleague {
/**
* 构造函数
*/
public VideoCard(Mediator mediator) {
super(mediator);
}
/**
* 显示视频数据
*/
public void showData(String data){
System.out.println("您正在观看的是:" + data);
}
}
同事类——声卡
public class SoundCard extends Colleague {
/**
* 构造函数
*/
public SoundCard(Mediator mediator) {
super(mediator);
}
/**
* 按照声频数据发出声音
*/
public void soundData(String data){
System.out.println("画外音:" + data);
}
}
抽象调停者类
public interface Mediator {
/**
* 同事对象在自身改变的时候来通知调停者方法
* 让调停者去负责相应的与其他同事对象的交互
*/
public void changed(Colleague c);
}
具体调停者类
public class MainBoard implements Mediator {
//需要知道要交互的同事类——光驱类
private CDDriver cdDriver = null;
//需要知道要交互的同事类——CPU类
private CPU cpu = null;
//需要知道要交互的同事类——显卡类
private VideoCard videoCard = null;
//需要知道要交互的同事类——声卡类
private SoundCard soundCard = null;
public void setCdDriver(CDDriver cdDriver) {
this.cdDriver = cdDriver;
}
public void setCpu(CPU cpu) {
this.cpu = cpu;
}
public void setVideoCard(VideoCard videoCard) {
this.videoCard = videoCard;
}
public void setSoundCard(SoundCard soundCard) {
this.soundCard = soundCard;
}
@Override
public void changed(Colleague c) {
if(c instanceof CDDriver){
//表示光驱读取数据了
this.opeCDDriverReadData((CDDriver)c);
}else if(c instanceof CPU){
this.opeCPU((CPU)c);
}
}
/**
* 处理光驱读取数据以后与其他对象的交互
*/
private void opeCDDriverReadData(CDDriver cd){
//先获取光驱读取的数据
String data = cd.getData();
//把这些数据传递给CPU进行处理
cpu.executeData(data);
}
/**
* 处理CPU处理完数据后与其他对象的交互
*/
private void opeCPU(CPU cpu){
//先获取CPU处理后的数据
String videoData = cpu.getVideoData();
String soundData = cpu.getSoundData();
//把这些数据传递给显卡和声卡展示出来
videoCard.showData(videoData);
soundCard.soundData(soundData);
}
}
客户端类
public class Client {
public static void main(String[] args) {
//创建调停者——主板
MainBoard mediator = new MainBoard();
//创建同事类
CDDriver cd = new CDDriver(mediator);
CPU cpu = new CPU(mediator);
VideoCard vc = new VideoCard(mediator);
SoundCard sc = new SoundCard(mediator);
//让调停者知道所有同事
mediator.setCdDriver(cd);
mediator.setCpu(cpu);
mediator.setVideoCard(vc);
mediator.setSoundCard(sc);
//开始看电影,把光盘放入光驱,光驱开始读盘
cd.readCD();
}
}
运行结果如下:
调停者模式的优点
● 松散耦合
调停者模式通过把多个同事对象之间的交互封装到调停者对象里面,从而使得同事对象之间松散耦合,基本上可以做到互补依赖。这样一来,同事对象就可以独立地变化和复用,而不再像以前那样“牵一处而动全身”了。
● 集中控制交互
多个同事对象的交互,被封装在调停者对象里面集中管理,使得这些交互行为发生变化的时候,只需要修改调停者对象就可以了,当然如果是已经做好的系统,那么就扩展调停者对象,而各个同事类不需要做修改。
● 多对多变成一对多
没有使用调停者模式的时候,同事对象之间的关系通常是多对多的,引入调停者对象以后,调停者对象和同事对象的关系通常变成双向的一对多,这会让对象的关系更容易理解和实现。
调停者模式的缺点
调停者模式的一个潜在缺点是,过度集中化。如果同事对象的交互非常多,而且比较复杂,当这些复杂性全部集中到调停者的时候,会导致调停者对象变得十分复杂,而且难于管理和维护。
public interface Mediator { /** * 同事对象在自身改变的时候来通知调停者方法 * 让调停者去负责相应的与其他同事对象的交互 */ public void changed(Colleague c); }
public class ConcreteMediator implements Mediator { //持有并维护同事A private ConcreteColleagueA colleagueA; //持有并维护同事B private ConcreteColleagueB colleagueB; public void setColleagueA(ConcreteColleagueA colleagueA) { this.colleagueA = colleagueA; } public void setColleagueB(ConcreteColleagueB colleagueB) { this.colleagueB = colleagueB; } @Override public void changed(Colleague c) { /** * 某一个同事类发生了变化,通常需要与其他同事交互 * 具体协调相应的同事对象来实现协作行为 */ } }
public abstract class Colleague { //持有一个调停者对象 private Mediator mediator; /** * 构造函数 */ public Colleague(Mediator mediator){ this.mediator = mediator; } /** * 获取当前同事类对应的调停者对象 */ public Mediator getMediator() { return mediator; } }
public class ConcreteColleagueA extends Colleague { public ConcreteColleagueA(Mediator mediator) { super(mediator); } /** * 示意方法,执行某些操作 */ public void operation(){ //在需要跟其他同事通信的时候,通知调停者对象 getMediator().changed(this); } }
public class ConcreteColleagueB extends Colleague { public ConcreteColleagueB(Mediator mediator) { super(mediator); } /** * 示意方法,执行某些操作 */ public void operation(){ //在需要跟其他同事通信的时候,通知调停者对象 getMediator().changed(this); } }
public abstract class Colleague { //持有一个调停者对象 private Mediator mediator; /** * 构造函数 */ public Colleague(Mediator mediator){ this.mediator = mediator; } /** * 获取当前同事类对应的调停者对象 */ public Mediator getMediator() { return mediator; } }
public class CDDriver extends Colleague{ //光驱读取出来的数据 private String data = ""; /** * 构造函数 */ public CDDriver(Mediator mediator) { super(mediator); } /** * 获取光盘读取出来的数据 */ public String getData() { return data; } /** * 读取光盘 */ public void readCD(){ //逗号前是视频显示的数据,逗号后是声音 this.data = "One Piece,海贼王我当定了"; //通知主板,自己的状态发生了改变 getMediator().changed(this); } }
public class CPU extends Colleague { //分解出来的视频数据 private String videoData = ""; //分解出来的声音数据 private String soundData = ""; /** * 构造函数 */ public CPU(Mediator mediator) { super(mediator); } /** * 获取分解出来的视频数据 */ public String getVideoData() { return videoData; } /** * 获取分解出来的声音数据 */ public String getSoundData() { return soundData; } /** * 处理数据,把数据分成音频和视频的数据 */ public void executeData(String data){ //把数据分解开,前面是视频数据,后面是音频数据 String[] array = data.split(","); this.videoData = array[0]; this.soundData = array[1]; //通知主板,CPU完成工作 getMediator().changed(this); } }
public class VideoCard extends Colleague { /** * 构造函数 */ public VideoCard(Mediator mediator) { super(mediator); } /** * 显示视频数据 */ public void showData(String data){ System.out.println("您正在观看的是:" + data); } }
public class SoundCard extends Colleague { /** * 构造函数 */ public SoundCard(Mediator mediator) { super(mediator); } /** * 按照声频数据发出声音 */ public void soundData(String data){ System.out.println("画外音:" + data); } }
public interface Mediator { /** * 同事对象在自身改变的时候来通知调停者方法 * 让调停者去负责相应的与其他同事对象的交互 */ public void changed(Colleague c); }
public class MainBoard implements Mediator { //需要知道要交互的同事类——光驱类 private CDDriver cdDriver = null; //需要知道要交互的同事类——CPU类 private CPU cpu = null; //需要知道要交互的同事类——显卡类 private VideoCard videoCard = null; //需要知道要交互的同事类——声卡类 private SoundCard soundCard = null; public void setCdDriver(CDDriver cdDriver) { this.cdDriver = cdDriver; } public void setCpu(CPU cpu) { this.cpu = cpu; } public void setVideoCard(VideoCard videoCard) { this.videoCard = videoCard; } public void setSoundCard(SoundCard soundCard) { this.soundCard = soundCard; } @Override public void changed(Colleague c) { if(c instanceof CDDriver){ //表示光驱读取数据了 this.opeCDDriverReadData((CDDriver)c); }else if(c instanceof CPU){ this.opeCPU((CPU)c); } } /** * 处理光驱读取数据以后与其他对象的交互 */ private void opeCDDriverReadData(CDDriver cd){ //先获取光驱读取的数据 String data = cd.getData(); //把这些数据传递给CPU进行处理 cpu.executeData(data); } /** * 处理CPU处理完数据后与其他对象的交互 */ private void opeCPU(CPU cpu){ //先获取CPU处理后的数据 String videoData = cpu.getVideoData(); String soundData = cpu.getSoundData(); //把这些数据传递给显卡和声卡展示出来 videoCard.showData(videoData); soundCard.soundData(soundData); } }
public class Client { public static void main(String[] args) { //创建调停者——主板 MainBoard mediator = new MainBoard(); //创建同事类 CDDriver cd = new CDDriver(mediator); CPU cpu = new CPU(mediator); VideoCard vc = new VideoCard(mediator); SoundCard sc = new SoundCard(mediator); //让调停者知道所有同事 mediator.setCdDriver(cd); mediator.setCpu(cpu); mediator.setVideoCard(vc); mediator.setSoundCard(sc); //开始看电影,把光盘放入光驱,光驱开始读盘 cd.readCD(); } }
发表评论
-
多种加密算法实现(JAVA)
2013-10-24 09:18 1618有短句“Sun Yat-sen University is ... -
断点续传的原理
2013-05-07 19:53 828转自:http://www.ibm.com/develope ... -
Java 线程池的原理与实现
2011-10-23 15:48 692参考: http://www.blogjava.ne ... -
Java中读取字节流并按指定编码转换成字符串的方法
2011-05-21 11:22 1448参考: http://www.blogjava.net/pen ... -
字节流编码获取原来这么复杂,但也很简单
2011-05-21 11:02 1498参考:http://www.cnblogs ... -
使用Java.util.zip下的zipOutStream和zipInStream对字节流进行压缩和解压缩
2011-05-21 10:08 1716参考:http://www.blogjava.net/ushe ... -
ActionScript与Java类型对应表
2011-05-21 09:46 1029当你使用AMF格式进行RemoteObject 调用时,肯定会 ... -
基于red5的在线视频录制实例和详细注释
2011-05-14 23:03 1576参考:http://www.ccvita.com/130.ht ... -
Java 中几种查找算法
2011-05-12 10:31 1464顺序查找说明:顺序查找适合于存储结构为顺序存储或链接存储的线性 ... -
Converting data from Java to ActionScript
2011-05-07 14:23 980On the client side, the ide ... -
java大整数相加及相乘
2011-05-04 18:34 1484import java.io.BufferedInputStr ... -
.org.hibernate.ObjectNotFoundException: No row with the given identifier exists
2011-04-20 18:09 1131说到底,就是外键关联引起的问题。 问题产生原因:有一个 ... -
java.util.ConcurrentModificationException
2011-04-19 10:07 573一般来说这个异常是容器类在遍历的时候被修改时抛出的。比 ... -
Spring+Hibernate+Flex,update、delete操作无法持久到数据库的解决办法
2011-04-17 21:42 1412这个解决办法就是才有事务机制了。。。 我是spring ... -
hibernate 注解 一对多 唯一索引
2011-04-17 02:00 2824今天被hibernate和mysql整了一下,切身感受到索引的 ... -
精通Hibernate——映射一对多关联关系
2011-04-17 01:38 1011在域模型(实体域)中,关联关系是类与类之间最普遍的关系。根据U ... -
junit实现opensessionInView保持session
2011-04-11 10:00 825参考:http://allenwei.iteye.com/bl ... -
Hibernate中cascade与inverse属性详解
2011-04-07 10:57 1048原文: 忘记存了..... ... -
HIbernate注解
2011-04-07 10:37 895Hibernate注解 文章分类:Web前端 @o ... -
Flex 通过Blazeds上传文件
2011-03-30 21:59 953本文讲的是通过Blazeds实现Flex文件上传,关于Blaz ...
相关推荐
在Java中,调停者模式通过引入一个中介对象,也就是调停者,来协调多个对象之间的交互,避免对象之间直接引用,从而形成松散耦合的关系。 在实际场景中,例如电脑硬件系统,主板就是一个典型的调停者,它连接着CPU...
在Java设计模式中,调停者模式常被应用于多对象间的复杂通信场景,例如在用户界面设计、分布式系统协调以及复杂的业务流程管理中。 #### 意图 调停者模式的主要意图是用一个中介对象来封装一系列的对象交互。在...
第10章 调停者(mediator)模式 85 第11章 代理(proxy)模式 97 第12章 职责链(chain of responsibility)模式 115 第13章 享元(flyweight)模式 122 第14章 构造型模式介绍 130 第15章 构建者(builder)模式 134 第16章 ...
所涉及的设计模式包括工厂模式、单例模式、建造模式、原型模式、适配器模式、桥梁模式、组合模式、装饰模式、门面模式、享元模式、代理模式、责任链模式、命令模式、解释器模式、迭代器模式、调停者模式、备忘录模式...
调停者模式用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式的内部表示。这种模式使得对象交互可以灵活地变化。 15. 备忘录模式(Memento) 备忘录模式在不破坏封装性的前提下,捕获一个对象的...
java和设计模式ppt包含工厂模式、建造模式、原始模型模式、单例模式、结构模式、适配器、桥梁模式、合成模式、装饰模式、门面模式、享元模式、代理模式、行为模式、解释器模式、迭代子模式、调停者模式、备忘录模式...
Java模式与设计概念是软件开发中的核心...24. **调停者模式**:通过中介对象协调多个对象间的交互,减少对象间的耦合。 这些模式和原则是软件设计的基石,理解和应用它们能够帮助我们编写出更优雅、更健壮的Java代码。
14. 调停者模式(Mediator):通过中介对象协调多个对象之间的交互,降低对象间的耦合度。 15. 备忘录模式(Memento):在不破坏封装的前提下,保存对象的状态,以便后续恢复。 16. 观察者模式(Observer):定义...
14. 调停者模式(Mediator):调停者模式通过一个中介对象协调多个对象之间的交互,降低对象间的耦合度。 15. 备忘录模式(Memento):备忘录模式用于在不破坏封装的前提下,保存对象的状态,以便在需要时恢复。 ...
调停者模式 备忘录模式 解释器模式 迭代器模式 状态模式 责任链模式 访问者模式 结构与算法 基础概念 稀疏数组与二维数组 队列和栈结构 单向链表和双向链表 排序与查找算法 二叉树与多叉树 应用场景 RSA算法签名...
14. **调停者模式**(Mediator) - **模式名称**:调停者模式 - **问题**:多个对象之间的交互过于复杂。 - **解决方案**:引入一个中介对象来协调这些对象之间的交互。 - **效果**:降低了对象之间的耦合度,...
15. **调停者模式**:调停者模式用于降低多个对象间的耦合,将多个对象间的交互集中到一个调停者对象上,使得对象间的关系更加清晰,代码更加易于维护。 以上设计模式在实际开发中都有广泛的应用,理解并合理使用...
- **行为型模式**:包括命令模式、解释器模式、访问者模式、迭代器模式、调停者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式和责任链模式。这些模式关注于对象之间的职责分配以及如何更好地组织...
14. 调停者模式:通过一个中间对象协调多个对象的交互,降低对象间的耦合度,使得对象之间的关系更清晰。 15. 备忘录模式:在不破坏封装的前提下,保存对象的内部状态,以便在需要时恢复。常用于游戏存档、撤销/...
com.javapatterns.mediator 调停者模式 com.javapatterns.memento 备忘录模式 com.javapatterns.multilingual 专题 com.javapatterns.observer 观察者模式 com.javapatterns.observerawt 专题:观察者模式与AWT...
#### 调停者模式(Mediator) - **问题**:如何降低多个对象之间的通信复杂度? - **解决方案**:使用一个中介对象封装对象间的交互。 - **效果**:降低了对象之间的耦合度,提高了系统的可维护性。 #### 备忘录...
这部分则关注于类的行为,如职责链模式、命令模式、解释器模式、迭代器模式、调停者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式和访问者模式等,主要目的是定义对象之间怎样交互以及怎样分配...
Model 通常是一个调停者,可以采用 Mediator Pattern 来实现。 在 J2EE 架构中,MVC 三个部分的位置分别是:View 处于 Web Tier 或者说是 Client Tier,通常是 JSP/Servlet,即页面显示部分。Controller 也处于 Web...
第23章 左右逢源:调停者模式 (Mediator) 第24章 白纸黑字:备忘录模式 (Memento) 第25章 周而复始:迭代器模式 (Iterator) 第26章 望文生义:解释器模式 (Interpreter) 第27章 无招胜有招:如何在设计中应用设计...