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框架模式

Model:模型    是应用程序中用于处理应用程序数据逻辑的部分。 通常模型对象负责在数据库中存取数据。

View:视图    是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的。

Contorl:控制器  是应用程序中处理用户交互的部分。 通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

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

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

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

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

看一个具体的例子:

MP3播放器:

1、用户使用操作界面改变要播放的歌曲

2、控制器请求Player模型播放歌曲

3、模型告诉视图状态已经变了

4、用户看到新的状态

看流程图

具体说明如下:

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

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

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

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

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

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

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

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

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

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

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

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

观察者:

策略者:视图和控制器之间的关系

视图只关注表现,控制器关注把用户输入转换为模型上的行为

组合

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

时间: 2024-10-03 13:45:26

Java 设计模式 -- 复合模式之二的相关文章

Java 设计模式 -- 复合模式之一

关于复合模式: 在形式上,复合模式确实是多个模式的组合,但满足了这一条并不一定是复合模式,注意它的定义:将多个模式结合起来形成一个"框架",以解决一般性问题             一提到"框架",可能最容易联想到的就是MVC吧,不过MVC确实是一个经典的复合模式 在进去MVC模式之前 先看一个简单的例子: 例子来自Headfrist 设计模式中的经典鸭鸣:有四种鸭鸣, 绿头鸭,叫声 Quack 红头鸭,叫声 Quack 鸭鸣器,叫声 Kwak 橡皮鸭,叫声 Squ

Java设计模式-代理模式之动态代理(附源码分析)

Java设计模式-代理模式之动态代理(附源码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的区别就是:动态代理是在运行时刻动态的创建出代理类及其对象.上篇中的静态代理是在编译的时候就确定了代理类具体类型,如果有多个类需要代理,那么就得创建多个.还有一点,如果Subject中新增了一个方法,那么对应的实现接口的类中也要相应的实习该方法,不符合设计模式原则. 动态代理的做法:在运行时刻,可以动态创建出一个实现了多个接口的代理类.每个代理类的对象都会关联一个表示内部处理

Java设计模式-代理模式之动态代理(附源代码分析)

Java设计模式-代理模式之动态代理(附源代码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的差别就是:动态代理是在执行时刻动态的创建出代理类及其对象. 上篇中的静态代理是在编译的时候就确定了代理类详细类型.假设有多个类须要代理.那么就得创建多个. 另一点,假设Subject中新增了一个方法,那么相应的实现接口的类中也要相应的实现这些方法. 动态代理的做法:在执行时刻.能够动态创建出一个实现了多个接口的代理类.每一个代理类的对象都会关联一个表示内部处理逻辑的Inv

一起学java设计模式--代理模式(结构型模式)

代理模式 应用软件所提供的桌面快捷方式是快速启动应用程序的代理,桌面快捷方式一般使用一张小图片来表示(Picture),通过调用快捷方式的run()方法将调用应用软件(Application)的run()方法.使用代理模式模拟该过程,绘制类图并编程实现. package ProxyPattern; interface Software { void run(); } class Application implements Software { public void run() { Syste

Java设计模式-代理模式之静态代理

Java设计模式-代理模式之静态代理 概念 为另一个对象提供一个替身或占位符以提供对这个对象的访问,使用代理模式创建代表对象,让代表对象控制某对象的访问,被代理对象可以是远程的对象.创建开销大的对象或需要安全控制的对象 远程代理控制访问远程对象 虚拟代理控制访问创建开销大的资源 保护代理基于权限控制对资源的访问 看如下的类图: 仔细看上面的类图,首先是Subject它为RealSubject和Proxy提供了接口,通过实现同一个接口,Proxy在RealSubject出现的地方取代它,这点和适配

Java设计模式--生成器模式

将一个复杂对象的构建与它的表示分离,使同样的构建过程可以创建不同的表示. Builder Pattern Separate the construction of a complex object from its representation so that the same construction process can create different representations. 类图 模式的结构与使用 生成器模式的结构中包括四个角色. 产品(Product):具体生成器要构造的复

Java设计模式——迭代器模式

概述 网上大部分人说迭代模式的时候,总是以某一种可遍历的对象为例进行介绍.这是可行的,这也是迭代模式的基本原型.当我看到<Head Frist设计模式>中迭代模式的时候,感觉要是能从另一个角度来说明,可能更能够体现迭代模式的威力所在. 本文介绍的这种迭代模式,倒是更像是适配器-迭代器模式.希望于你有益~ 版权说明 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:Coding-Naga发表日期: 2016年3月4日链接:http://blog.csdn.net/lemo

Java设计模式——原型模式

概述 原型模式是为了解决一些不必要的对象创建过程.当Java JDK中提供了Cloneable接口之后,原型模式就变得异常的简单了.虽然由于Cloneable的引入使用程序变得更简单了,不过还是有一些需要说明和注意的东西在里面的.文本就详细讲解一下这些注意事项吧. 版权说明 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:Coding-Naga发表日期: 2016年3月3日链接:http://blog.csdn.net/lemon_tree12138/article/d

Java设计模式学习笔记,二:工厂模式

工厂模式,主要实现了创建者和调用者的分离. 分类:1.简单工厂模式:2.工厂方法模式:3.抽象工厂模式. 核心:实例化对象时,用工厂方法代替new操作. 一.简单工厂模式 也叫静态工厂模式,工厂类中实现静态方法,根据入参,生产不同的产品,工程项目中常用. 工厂类作为类使用,产品类作为接口使用,具体产品实现接口,用来生产同一等级结构中的任意产品,当新增产品时,需要修改已有的代码. 1 package com.corey.factory.simpleFactory; 2 3 /** 4 * 产品类接