Java设计模式之复合模式(二)

接着上文的鸭鸣例子: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框架模式

Java设计模式之复合模式(二)

Model:模型    是应用程序中用于处理应用程序数据逻辑的部分。 通常模型对象负责在数据库中存取数据。
View:视图    是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的。
Contorl:控制器  是应用程序中处理用户交互的部分。 通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

那么MVC框架模式又包含了那些设计模式呢?

策略模式:控制器是视图的一个策略,视图可以更换控制器来改变逻辑。

观察者模式:视图是模型的观察者,当模型变化时,视图可以得到通知。

组合模式:视图本身是一个树形结构。我们只需对视图最顶层的组件(比如窗口对象)进行操作,组合会处理我们的请求。


看一个具体的例子:

MP3播放器:

1、用户使用操作界面改变要播放的歌曲
2、控制器请求Player模型播放歌曲
3、模型告诉视图状态已经变了
4、用户看到新的状态

看流程图

Java设计模式之复合模式(二)


具体说明如下:

1、你是用户—你和视图交互

视图是模型的窗口。当你对视图做一些事事(比方说:按下“播放”按钮),视图就告诉控制器你做了什么。控制器会负责处理。

2、控制器要求模型改变状态

控制器解读你的动作。如果你按下某个按钮,控制器会理解这个动作的意义,并告知模型如何做出对应的动作。

3.控制器也可能要求视图做改变。

当控制器从视图接收到某一动作,结构可能是它也需要告诉视图改变其结果。比方说,控制器可以将界面上的某些按钮或菜单项变成有效或无效。

4.当模型发生改变时,模型会通知视图。

不管是你做了某些动作(比方说按下按钮)还是内部有了某些改变(比方说播放清单的下一首歌开始)只要当模型内的东西改变时,模型都会通知视图它的状态改变了。

5.视图向模型询问状态。

视图直接从模型取得它显示的状态。比方说,当模型通知视图新歌开始播放,视图向模型询问歌名并显示出来。当控制器请求视图改变时,视图也可能向模型询问某些状态。


在这一个mp3播放器中,是如何使用策略、观察、组合模式的

Java设计模式之复合模式(二)

下面在来看看具体观察者和视图以及控制器之间的关系

观察者:

Java设计模式之复合模式(二)

策略者:视图和控制器之间的关系
视图只关注表现,控制器关注把用户输入转换为模型上的行为

Java设计模式之复合模式(二)
             

组合

视图是GUI组件(标签、窗口、文本输入框等)的组合,顶层的组件包含其他组件,直到叶节点。

Java设计模式之复合模式(二)

博客转载于:https://blog.csdn.net/yujin753/article/details/45920933