`
teamojiao
  • 浏览: 350375 次
  • 性别: 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 这个模式,算是对设计模式的一个引子,抛砖引玉,希望大家以后能多多的探讨这个方面的问题。

分享到:
评论

相关推荐

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

    《设计模式:可复用面向对象软件的基础》一书是软件工程领域的重要参考资料,它深入探讨了如何通过设计模式来提升面向对象设计的质量,增强软件的重用性和健壮性。设计模式是解决常见问题的经验总结,是软件开发中的...

    Oriented_Design_&_Patterns_2nd_Edition_Cay_Horstmann

    这本书深入浅出地介绍了面向对象设计的基本原理和设计模式的应用,旨在为学生提供一个易于理解且实践性强的学习平台。以下是本书中涵盖的一些关键知识点: ### 面向对象设计的基本概念 面向对象设计(Object-...

    邵维忠面向对象分析与设计课件

    邵维忠的课件可能讲解了设计模式(Design Patterns),如工厂模式(Factory Pattern)、单例模式(Singleton Pattern)和观察者模式(Observer Pattern),这些都是OOD中常用的技术。 3. **5面向对象设计.pdf 和 6...

    摩托罗拉C++面试题

    OOD,OOP从根本上改变了程序设计模式和设计思想,具备重大和深远的意义。 类的三大最基本的特征:封装,继承,多态. 14.C++特点是什么,如何实现多态?画出基类和子类在内存中的相互关系。 多态的基础是继承,需要...

    ACCP 5.0 S2 项目 (门禁系统的面向对象设计)

    7. **设计模式的应用**:在门禁系统中,可能会用到观察者模式(Observer)来实现实时的事件通知,如当用户通过门时,系统自动记录事件并向相关人员发送通知。工厂模式(Factory)可以用来创建不同类型的卡片或门。 ...

    Fudan Univ-Object Oriented Design Lecture Notes

    - **设计模式**:介绍了常见的设计模式,例如单例模式(Singleton)、命令模式(Command)、迭代器模式(Iterator)等,每种模式都解决了特定的设计问题,提供了经过验证的解决方案。 - **案例研究**:通过具体案例来分析...

    OOD-Java

    "OOD-Java"涵盖了Java编程中的核心面向对象设计原则和实践,包括类与对象、封装、继承、多态、抽象等概念,以及如何利用设计模式解决实际问题。学习和掌握这些知识,对于提升Java编程能力,编写出高效、可扩展和易于...

    zoo_ood

    5. 设计模式的应用:面向对象设计模式是解决特定问题的模板,如工厂模式(Factory Method)可以用来创建动物对象,观察者模式(Observer)可以用于通知管理员有关动物状态的改变。在"zoo_ood"项目中,我们可以寻找...

    ACCP5.0门禁系统PPT及源码

    5. **设计模式的应用**:在门禁系统中,可能会用到工厂模式(Factory Method)来创建各种卡片和门,单例模式(Singleton)来确保控制器的全局唯一性,观察者模式(Observer)来处理事件通知等。 6. **UML(统一建模...

    ScrabbleGame:拼字游戏的Java实现

    **ScrabbleGame** 是一个基于Java开发的拼字游戏应用,它展示了面向对象的设计(Object-Oriented Design, OOD)以及设计模式在实际项目中的应用。该项目源自CMU的15214课程——软件系统构造原理,旨在帮助学习者通过...

    OODFinal

    6. **设计模式**:OODFinal可能涵盖了多种设计模式,如单例模式(Singleton)、工厂模式(Factory)、观察者模式(Observer)、装饰器模式(Decorator)等。设计模式是面向对象设计的通用解决方案,是前人经验的总结...

    poodir:Ruby 中实用的面向对象设计

    在Ruby编程语言中,面向对象设计(Object-Oriented Design, OOD)是一种常见的软件开发方法,它将现实世界中的实体抽象为类,通过实例化这些类来创建对象,以此来处理复杂的数据和逻辑。"poodir"项目,根据其标题...

Global site tag (gtag.js) - Google Analytics