`
teamojiao
  • 浏览: 345407 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

从设计模式Observer的实现看OOD的设计——浅谈“多态”的设计原则

阅读更多
package com.jeff.observer;

public interface Subject {
	
	void  register(Observer obs);
	
	void unregister(Observer obs);
	
	void inform_all(String message);

}

 

Observer.java

package com.jeff.observer;

public abstract class Observer {
	
	public void register(Observer obs){
		obs.register(this);
	}
	
	public void unregister(Observer obs){
		obs.unregister(this);
	}
	
	public void inform(String msg){};

}
package com.jeff.observer;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class WeatherData implements Subject {
	
	private List<Observer> users=new ArrayList<Observer>();

	public void inform_all(String message) {

		for (Iterator user = users.iterator(); user.hasNext();) {
			Observer obs = (Observer) user.next();
			obs.inform(message);
			
		}
	}

	public void register(Observer obs) {
		users.add(obs);

	}

	public void unregister(Observer obs) {
		users.remove(obs);
	}

}

 UserA.java

package com.jeff.observer;

public class UserA extends Observer {

	@Override
	public void inform(String msg) {

	System.out.println("UserA have got weather message: "+msg);
	
	}
	

}

 UserB.java

package com.jeff.observer;

public class UserB extends Observer {

	@Override
	public void inform(String msg) {

	System.out.println("UserB have got weather message: "+msg);
	
	}
	

}

 

Demo.java

 
package com.jeff.observer;

public class Demo {
	
	public static void main(String[] args) {
		
		Subject weatherData= new WeatherData();
		
		UserA usera=new UserA();
		
		UserB userb=new UserB();
		
		weatherData.register(usera);
		
		weatherData.register(userb);
		
		
		weatherData.inform_all("date 2009/08/24;weather:cloudy;temperature:33");
		weatherData.inform_all("date 2009/08/25;weather:sunny;temperature:34");
		
		weatherData.unregister(usera);
		
		weatherData.inform_all("date 2009/08/26;weather:rain;temperature:26");
	}

}

 运行结果:

UserA have got weather message: date 2009/08/24;weather:cloudy;temperature:33
UserB have got weather message: date 2009/08/24;weather:cloudy;temperature:33
UserA have got weather message: date 2009/08/25;weather:sunny;temperature:34
UserB have got weather message: date 2009/08/25;weather:sunny;temperature:34
UserB have got weather message: date 2009/08/26;weather:rain;temperature:26

 

  在这个简单的 Observer 设计模式的实现中,我们主要分析 demo.java 这个文件。在 demo 类的应用中,我们不难看出,我们在实例化对象 weatherData userA userB 的时候,类型选用的是接口类和抽象类。为什么不用实体类来定义呢?这就是多态的意义所在。其实,如果用实体类来定义这些实例化对象,结果是完全一样的。这个差别从 userA userB 的定义可以找到答案。对于 demo 类的应用者来说,我们只需要关心 Observer 类的抽象定义就知道如何调用 userA userB 的功能,而不用去关心 UserA UserB 这两个类的具体实现,也许还有 UserC UserD 等等很多种不同形态的类。对于程序设计而言,如果我们要一一关注这些具体类的实现,那么无疑增加了开发者的工作量。还有一点,当 UserA UserB ……等子类的实现发生改变的时候,其他部分的代码都可以不用改变。譬如 UserA 改变 inform 函数的实现:

    @Override

    public void inform(String msg){

       System. out .println( “This is new york city.” );

       System. out .println( “UserA have got weather message: “ + msg);

    }

也许采用 Observer 这个模式来解释多态的优异特性不是很适合。下次我再用一个更能说明多态的优点的设计来谈一下(不套用设计模式了,呵呵)。在这里专门用到 Observer 这个模式,算是对设计模式的一个引子,抛砖引玉,希望大家以后能多多的探讨这个方面的问题。

分享到:
评论

相关推荐

    Observer设计模式实例

    Observer设计模式是一种经典的设计模式,在GOF 23种设计模式种 比较常用于实际。主要是有类指针传递并引用方法和消息传递响应的方法来实现。

    人人都懂设计模式 人人都懂设计模式

    在本书中,作者罗伟富通过 Python 实现了 23 种经典设计模式,包括 Singleton 模式、Factory 模式、Observer 模式等。这些模式可以帮助开发者更好地解决软件开发中的常见问题,例如对象的创建、结构的设计、行为的...

    设计模式C++学习之观察者模式(Observer)

    设计模式C++学习之观察者模式(Observer)

    深入浅出设计模式(中文版)

    5.7ObserverPattern(观察者模式) 236 5.7.1定义 236 5.7.2现实例子——拉登现身了 238 5.7.3C#实例——猫和老鼠 238 5.7.4C#实例——股票变化 241 5.7.5Java实例——监控系统 245 5.7.6优势和缺陷 248 ...

    HeadFirst设计模式(中文版)

    第1章到第11章陆续介绍的设计模式为Strategy、Observer、Decorator、Abstract Factory、Factory Method、Singleton,Command、Adapter、Facade、TemplateMethod、Iterator、Composite、State、Proxy。最后三章比较...

    设计模式--可复用面向对象软件的基础

    5.7 OBSERVER(观察者)——对象行为型模式 5.8 STATE(状态)——对象行为型模式 5.9 STRATEGY(策略)——对象行为型模式 5.10 TEMPLATE METHOD(模板方法)——类行为型模式 5.11 VISITOR(访问者)——对象行为...

    设计模式(23种)与设计原则(6种)

    详细描述全部(23种)设计模式与设计原则(6种)。 (一)设计原则包括: 1、开闭原则 2、里氏代换原则 3、依赖转换原则 4、接口隔离原则 5、合成/聚合复用原则 6、最少知识原则 (二)设计模式 1)工厂模式...

    设计模式精解 译者:熊节 程序员必看书籍之一 part2

    设计模式精解(Design Patterns Explained) ...如何实现关键模式——Strategy(策略)、Observer(观察者)、Bridge(桥接)、Decorator(装饰)等等。 共同点/变化点分析、设计模式以及它们如何帮助理解抽象类。

    C#面向对象设计模式纵横谈(19):(行为型模式) Observer 观察者模式 (Level 300)

    C#面向对象设计模式纵横谈(19):(行为型模式) Observer 观察者模式 (Level 300)

    OBserver模式设计实现

    Head First模式设计用的是Java,实现观察者模式使用C++

    C#面向对象设计模式纵横谈(视频与源码)

    C#面向对象设计模式纵横谈(1):面向对象设计模式与原则 C#面向对象设计模式纵横谈(2):Singleton 单件(创建型模式) C#面向对象设计模式纵横谈(3):Abstract Factory 抽象工厂模式(创建型模式) C#面向对象设计...

    Head First设计模式

    第1章到第11章陆续介绍的设计模式为Strategy、Observer、Decorator、AbstractFactory、FactoryMethod、Singleton,Command、Adapter、Facade、TemplateMethod、Iterator、Composite、State、Proxy。最后三章比较特别...

    深入浅出设计模式(中文版电子版)

    5.7ObserverPattern(观察者模式) 236 5.7.1定义 236 5.7.2现实例子——拉登现身了 238 5.7.3C#实例——猫和老鼠 238 5.7.4C#实例——股票变化 241 5.7.5Java实例——监控系统 245 5.7.6优势和缺陷 248 ...

    设计模式可复用面向对象软件的基础.zip

    本书设计实例从面向对象的设计中精选出23个设计模式,总结了面向对象设计中最有价值的经验,并且用简洁可复用的形式表达出来。本书分类描述了一组设计良好,表达清楚的软件设计模式,这些模式在实用环境下有特别有用...

    大优惠Head First 设计模式

    第1章到第11章陆续介绍的设计模式为Strategy、Observer、Decorator、Abstract Factory、Factory Method、Singleton,Command、Adapter、Facade、TemplateMethod、Iterator、Composite、State、Proxy。最后三章比较...

    Java设计模式 设计模式介绍

    1、爪哇语言结构性模式之变压器模式介绍 2、爪哇语言抽象工厂创立性模式介绍 3、工厂方法创立性模式介绍 4、单态创立性模式介绍 5、单态创立性模式介绍 6、观察者模式介绍7、责任链模式 8、设计模式之Observer 9、...

    设计模式精解-GoF 23 种设计模式解析附 C++实现源码 单最常用的设计模式入门,比如AbstractFactory模式、Adapater模式、Composite模式、Decorator模式、Factory模式、Observer模式、Strategy模式、Template模式等

    设计模式体现的是一种思想,而思想则是指导行为的一切,理解和掌握了设计模式,并不是说记住了23种(或更多)设计场景和解决策略(实际上这也是很重要的一笔财富),实际接受的是一种思想的熏陶和洗礼,等这种思想...

    Head First 设计模式(中文版)

    第1章到第11章陆续介绍的设计模式为Strategy、Observer、Decorator、Abstract Factory、Factory Method、Singleton,Command、Adapter、Facade、TemplateMethod、Iterator、Composite、State、Proxy。最后三章比较...

    JAVA设计模式chm文档

    设计模式之Observer 设计模式之Chain of Responsibility(职责链) 设计模式之Command 设计模式之State 设计模式之Strategy(策略) 设计模式之Mediator(中介者) 设计模式之Interpreter(解释器) 设计模式之Visitor

    head first 设计模式

    第1章到第11章陆续介绍的设计模式为Strategy、Observer、Decorator、Abstract Factory、Factory Method、Singleton,Command、Adapter、Facade、TemplateMethod、Iterator、Composite、State、Proxy。最后三章比较...

Global site tag (gtag.js) - Google Analytics