zoukankan      html  css  js  c++  java
  • java设计模式:观察者模式

    package Observer;
    
    public class Test {
    
    	/**
    	 * client测试类别
    	 * 观察者模式一般由四部分组成:
    	 * 1摘要观察员(教科书被称为一般“Subject(抽象类的主题)”),
    	 * 里面一般定义了抽象的add(),remove(),notifyAll()等方法,
    	 * 分别用于添加观察者,删除观察者,通知观察者自己的变化。
    	 * 2详细的被观察者类(一般教材上都叫做“ConcreteSubject(详细的主题类)”),
    	 * 是抽象的被观察者(Subject)的详细的实现类,里面实现了add(),remove(),notifyAll()等方法;
    	 * 3抽象的观察者类(一般教材上叫做“Observer”),里面一般定义了一个抽象的update()方法。
    	 * 4详细的观察者类(一般教材上叫做“ConcreteObserver”),他是抽象的观察者类(Observer)的详细实现,它实现了update()方法,
    	 * 用于接受被观察者的详细变化;
    	 * 
    	 * 这里有个样例:有两个被观察者陈美嘉和胡一菲,他们分别有不同的观察者。陈美嘉的观察者有吕小布,
    	 * 胡一菲的观察者有曾贤儿和张伟两个,当陈美嘉和胡一菲有什么变化时,立即就会分别被他们的观察者说知道;
    	 * @author wl
    	 */
    	public static void main(String[] args) {
    		Watched HuYiFei=new ConcerteWatched();
    		Watched ChenMeiJia=new ConcerteWatched();
    		
    		Watcher LvXiaoBu=new ConcreteWatcher("吕小布","陈美嘉");
    		Watcher ZengXianEr=new ConcreteWatcher("曾贤儿","胡一菲");
    		Watcher ZhangWei=new ConcreteWatcher("张伟","女神");
    		
    		ChenMeiJia.addWatcher(LvXiaoBu);
    		HuYiFei.addWatcher(ZengXianEr);
    		HuYiFei.addWatcher(ZhangWei);
    		
    		HuYiFei.notifyWatchers("好想看电影啊!

    。!

    "); ChenMeiJia.notifyWatchers("好想去旅游啊!!!"); } }

    
    
    package Observer;
    /**
     * 抽象的观察者接口类
     * @author wl
     *
     */
    public interface Watcher {
    	void updata(String str);
    }
    
    package Observer;
    /**
     * 抽象的被观察者接口
     * @author wl
     *
     */
    public interface Watched {
    	void addWatcher(Watcher watcher);
    	void removeWatcher(Watcher watcher);
    	void notifyWatchers(String str);
    }
    
    package Observer;
    /**
     * 详细的观察者类,比方样例中的吕小布。曾贤儿,张伟就是观察者的实例
     * @author wl
     *
     */
    public class ConcreteWatcher implements Watcher {
    	String watcheredName;
    	String name;
    	
    	public ConcreteWatcher(String name,String watcheredName){
    		this.name=name;
    		this.watcheredName=watcheredName;
    	}
    	@Override
    	public void updata(String str) {
    		System.out.println(name+"心里暗暗高兴“嘿嘿!!。机会来了,我的"+watcheredName+"说她 ‘"+str+"’”");
    	}
    
    }
    
    package Observer;
    
    import java.util.ArrayList;
    import java.util.List;
    /**
     * 详细的被观察者类,比方样例中的胡一菲,陈美嘉就是详细的被观察者的实例
     * @author wl
     *
     */
    public class ConcerteWatched implements Watched {
    	List<Watcher> list=new ArrayList<Watcher>();
    	
    	@Override
    	public void addWatcher(Watcher watcher) {
    		list.add(watcher);
    	}
    
    	@Override
    	public void removeWatcher(Watcher watcher) {
    		list.remove(watcher);
    	}
    
    	@Override
    	public void notifyWatchers(String str) {
    		for(Watcher watcher:list){
    			watcher.updata(str);
    		}
    	}
    
    }
    

    输出为:

    曾贤儿心里暗暗高兴“嘿嘿!!

    机会来了,我的胡一菲说她 ‘好想看电影啊!

    !!’”
    张伟心里暗暗高兴“嘿嘿!

    !!

    机会来了,我的女神说她 ‘好想看电影啊!!。’”
    吕小布心里暗暗高兴“嘿嘿!

    。一个偶然的机会,我的陈女士说,她 ‘好想去旅游啊!!!’”

    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    webform文件上传加水印
    2017-6-6 ASP.NET Ajax版页面无刷新三级联动
    2017-6-5 Ajax应用
    转【 正则表达式】
    2017-6-4 JQuery中的选择器和动画 弹窗遮罩
    Linq 组合分页查询
    2017-6-2 Linq高级查询和函数
    2017-6-3 JQuery中的Dom操作和事件
    WebForm母版页
    WebForm内置对象:Application和ViewState、Repeater的Command用法
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4682754.html
Copyright © 2011-2022 走看看