观察者模式的缺点

观察者模式的缺点:运行效率较低,一个被观察者,多个观察者时,开发代码和调试会比较复杂,java中消息的通知是默认顺序执行的,若其中一个观察者卡壳,会影响到此观察者后面的观察者执行,影响整体的执行, 多级触发时的效率更让人担忧。(遇到此问题应该考虑使用异步的方式)
观察者模式的邮电


实例:

package designMode.observable;

import java.util.Observable;


/**
* @ClassName: Wolf 被观察者
* @Description:1个被观察者可以被多个观察者观察
* @date: 2018年2月5日
* @修改备注:
*/
public class Wolf extends Observable{
    
    private String name;
    private String state;

    Wolf(String name) {
        this.name = name;
    }
    
    public void cry(String state){
    	this.setState(state);
        this.setChanged();
        this.notifyObservers(state);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

	public String getState() {
		return state;
	}

	public void setState(String state) {
		this.state = state;
	}
    
}
package designMode.observable;

import java.util.Observable;
import java.util.Observer;


/**
 * 作为观察者、监听者使用
 * @author zhangLu
 * @date 16-05-23
 */
public class Sheep implements Observer {
    
    private String state = " 吃草ing。。。";
    private String name;
    
    public Sheep(String name){
        this.name = name;
    }
    
    public void update(Observable o, Object arg) {
        Wolf wolf = (Wolf)o;
        System.out.println(wolf.getName()+" "+arg+"; "+this.getName()+" running.....");
        setState("逃跑running");
        try {
			Thread.sleep(5*1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
        System.out.println(wolf.getName()+" is stop!"+" "+this.getName()+"可以停下继续吃草了。。。");
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
package designMode.observable;

import java.util.Observable;
import java.util.Observer;

/**
* @ClassName: Rabbit "兔子"
* @Description:观察者对象
* @date: 2018年2月5日
* @修改备注:
*/
public class Rabbit implements Observer{
	
	private String name;
	private String state ="吃草ing...";

	public Rabbit(String name){
		this.name = name;
	}
	
	@Override
	public void update(Observable o, Object arg) {
        Wolf wolf = (Wolf)o;
        System.out.println(wolf.getName()+" "+arg+"; "+this.getName()+" running.....");
        setState("逃跑running");
        try {
			Thread.sleep(5*1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
        System.out.println(wolf.getName()+" is stop!"+" "+this.getName()+"可以停下继续吃草了...");
		
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getState() {
		return state;
	}

	public void setState(String state) {
		this.state = state;
	}
	
	
}
package designMode.observable;

/**
* @ClassName: TestObserver
* @Description:观察者模式
* 		多个观察者执行相关的行为动作是顺序执行的,一个观察者行为动作未执行完毕时,其他的观察者的行为是会被阻塞,无法执行的
* 		一旦一个观察者的行为动作受到阻塞,其他观察者的行为动作就无法执行
* @date: 2018年2月5日
* @修改备注:
*/
public class TestObserver {

    public static void main(String[] args) {
        Wolf wolf = new Wolf("wolf1");
        Sheep sheep1 = new Sheep("sheep1");
        Sheep sheep2 = new Sheep("sheep2");
        Sheep sheep3 = new Sheep("sheep3");
        Rabbit rabbit1 = new Rabbit("rabbit1");
        //注册观察者,加入不同类型的观察者对象
        wolf.addObserver(sheep1);
        wolf.addObserver(sheep2);
        wolf.addObserver(sheep3);
        wolf.addObserver(rabbit1);
        //删除观察者
        wolf.deleteObserver(sheep3);
        //显示观察者的数量
        System.out.println("观察者对象的数量: "+wolf.countObservers());;
        String wolfState = "is coming with hungry";
        //wolf begin cry
        for (int i = 0; i < 2; i++) {
        	wolf.cry(wolfState);
        	try {
				Thread.sleep(3*1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
        	System.out.println("第"+(++i)+"次执行完毕!");
        	--i;
		}
        
    }
}








  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值