接着上文的鸭鸣例子:Java
设计模式 -- 复合模式之一
上文中,我们的鸭鸣实现了 装饰者模式 适配器模式 工厂模式的结合
现在,又需要进行改动了,上文,是可以统计一群鸭子的叫声,现在需要能够观察个别鸭子的行为
引入观察者模式:
任何想被观察的Quackable都必须实现下面的接口
public interface QuackObservable
{
public void registerObserver(Observer
observer);
public void notifyobservers();
}
然后确定所有的Quackable都实现上面的接口,复合模式之一中的Quackable是没有实现观察的
public interface Quackable extends QuackObservable{
public void quack();
}
为了确定所有实现Quackable的具体类能够扮演QuackObservable 的角色,需要在每一个类中实现注册和通知,为了实现这个功能,现在一个
Observerable辅助类中实现注册和通知功能,然后和QuackObservable 组合起来
public class Observable implements QuackObservable
{
ArrayList observers = new ArrayList ();
QuackObservable duckObservable ;
public Observable(QuackObservable
duck)
{
this .duckObservable =duck;
}
@Override
public void registerObserver(Observer
observer) {
// TODO Auto-generated
method stub
observers .add(observer);
}
@Override
public void notifyobservers()
{
// TODO Auto-generated
method stub
Iterator iterator= observers.iterator();
while (iterator.hasNext())
{
Observer observer=(Observer)iterator.next();
observer.update( duckObservable );
}
}
}
整合辅助类和Quackable具体类,跟复合模式之一中,实现具体类MallarDuck
public class MallardDuck implements Quackable{
Observable observable ;
public MallardDuck()
{
observable =new Observable( this);
}
@Override
public void quack()
{
// TODO Auto-generated
method stub
System. out .println("Quack!" ); //绿头鸭的叫法
是Quack
notifyobservers();
}
@Override
public void registerObserver(Observer
observer) {
// TODO Auto-generated
method stub
observable .registerObserver(observer);
}
@Override
public void notifyobservers()
{
// TODO Auto-generated
method stub
observable .notifyobservers();
}
}
现在我们几乎已经实现了Observerable所需的一切,仅仅需要一些观察者了,首先定义一个接口
public interface Observer
{
public void update(QuackObservable
duck);
}
具体观察者如下(实现观察者接口):
public class Quackologist implements Observer
{
@Override
public void update(QuackObservable
duck) {
// TODO Auto-generated
method stub
System. out .println("Quackologist
: " +duck+" just qucked." );
}
}
测试代码,跟复合模式之一中类似,定义一些鸭子,不同的是需要顶一个观察者,将鸭子注册到观察者中
Quackologist quackologist= new Quackologist();
flock.registerObserver(quackologist);
有了上面的基础,下面我们来看MVC模式
首先用一张图片来简单了解什么是MVC框架模式
Model:模型 是应用程序中用于处理应用程序数据逻辑的部分。 通常模型对象负责在数据库中存取数据。
View:视图 是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的。
Contorl:控制器 是应用程序中处理用户交互的部分。 通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
那么MVC框架模式又包含了那些设计模式呢?
策略模式:控制器是视图的一个策略,视图可以更换控制器来改变逻辑。
观察者模式:视图是模型的观察者,当模型变化时,视图可以得到通知。
组合模式:视图本身是一个树形结构。我们只需对视图最顶层的组件(比如窗口对象)进行操作,组合会处理我们的请求。
看一个具体的例子:
MP3播放器:
1、用户使用操作界面改变要播放的歌曲
2、控制器请求Player模型播放歌曲
3、模型告诉视图状态已经变了
4、用户看到新的状态
看流程图
具体说明如下:
1、你是用户—你和视图交互
视图是模型的窗口。当你对视图做一些事事(比方说:按下“播放”按钮),视图就告诉控制器你做了什么。控制器会负责处理。
2、控制器要求模型改变状态。
控制器解读你的动作。如果你按下某个按钮,控制器会理解这个动作的意义,并告知模型如何做出对应的动作。
3.控制器也可能要求视图做改变。
当控制器从视图接收到某一动作,结构可能是它也需要告诉视图改变其结果。比方说,控制器可以将界面上的某些按钮或菜单项变成有效或无效。
4.当模型发生改变时,模型会通知视图。
不管是你做了某些动作(比方说按下按钮)还是内部有了某些改变(比方说播放清单的下一首歌开始)只要当模型内的东西改变时,模型都会通知视图它的状态改变了。
5.视图向模型询问状态。
视图直接从模型取得它显示的状态。比方说,当模型通知视图新歌开始播放,视图向模型询问歌名并显示出来。当控制器请求视图改变时,视图也可能向模型询问某些状态。
在这一个mp3播放器中,是如何使用策略、观察、组合模式的
下面在来看看具体观察者和视图以及控制器之间的关系
观察者:
策略者:视图和控制器之间的关系
视图只关注表现,控制器关注把用户输入转换为模型上的行为
组合
视图是GUI组件(标签、窗口、文本输入框等)的组合,顶层的组件包含其他组件,直到叶节点。