从设计模式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 这个模式,算是对设计模式的一个引子,抛砖引玉,希望大家以后能多多的探讨这个方面的问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值