zoukankan      html  css  js  c++  java
  • 设计模式-----观察者模式(一)

    学习观察者模式的通用代码;

    步骤:

    第一:是目标对象的定义;

    第二:是具体目标对象的定义;

    第三:观察者的接口定义;

    第四:看看观察者的具体实现;

    通用的代码如下:

    Subject.java

    import java.util.ArrayList;
    import java.util.List;
    
    
    
    /*
     * 目标对象,它知道观察它的观察者,并提供注册(添加)和删除观察者的接口
     * 
     */
    public class Subject {
        //这个集合是用来保存注册的观察者对象;
        private List<Observer>  observers = new ArrayList<Observer>();
        //attach detach notifyObservers
        public void attach(Observer observer){
            observers.add(observer);
        }
        /*
         * 删除集合中的指定观察者;
         */
        public void detach(Observer observer){
            observers.remove(observer);
        }
        /*
         * 通知所有注册的观察者对象;
         */
        protected void notifyObesrvers(){
            for(Observer observer:observers){
                observer.update(this);
            }
        }
    }
    View Code

    ConcreteSubject.java

    /*
     * 具体的目标对象,负责把有关状态存入到响应的观察者对象
     * 
     * 
     */
    public class ConcreteSubject extends Subject{
        //目标对象的状态;
        private String subjectState;
    
        public String getSubjectState() {
            return subjectState;
        }
    
        public void setSubjectState(String subjectState) {
            this.subjectState = subjectState;
            this.notifyObesrvers();
        }
        
    }
    View Code

    Observer.java

    /*
     *这是一个观察者接口,定义一个更新的接口给那些 在目标改变的时候被通知的对象;
     * 
     */
    public interface Observer {
        /*
         * 
         * 更新的接口
         * @param subject 传入目标对象,方便获取相应的目标对象的状态
         */
        public void update(Subject subject);
        
    }
    View Code

    ConcreteObserver.java

    /*
     * 
     * 具体的观察者对象,实现更新的方法,使自身的状态和目标的状态保持一致;
     * 
     * */
    public class ConcreteObserver implements Observer {
        private String observerState;
        @Override
        /**
         * 获取目标类的状态同步到观察者类中;
         */
        public void update(Subject subject) {
            observerState = ((ConcreteSubject)subject).getSubjectState();
            
            
        }
    
    }
    View Code

     改造通用的代码如下:

    WeatherSubject.java

    import java.util.ArrayList;
    import java.util.List;
    
    
    
    /*
     * 目标对象,它知道观察它的观察者,并提供注册(添加)和删除观察者的接口
     * 
     */
    public class WeatherSubject {
        //这个集合是用来保存注册的观察者对象;
        private List<Observer>  observers = new ArrayList<Observer>();
        //attach detach notifyObservers;
        //把订阅天气的人,添加到订阅者列表中;
        public void attach(Observer observer){
            observers.add(observer);
        }
        /*
         * 删除集合中的指定订阅天气的人;
         */
        public void detach(Observer observer){
            observers.remove(observer);
        }
        /*
         * 通知所有注册的订阅了天气的人;
         */
        protected void notifyObesrvers(){
            for(Observer observer:observers){
                observer.update(this);
            }
        }
    }
    View Code

    ConcreteWeatherSubject.java

    /*
     * 具体的目标对象,负责把有关状态存入到响应的观察者对象
     * 
     * 
     */
    public class ConcreteWeatherSubject extends WeatherSubject{
        //获取天气的内容
        private String WeatherContent;
    
        public String getWeatherContent() {
            return WeatherContent;
        }
    
        public void setWeatherContent(String weatherContent) {
            WeatherContent = weatherContent;
            //内容有了,说明天气更新了,通知所有订阅了天气的人;
            this.notifyObesrvers();
        }
    
        
        
    }
    View Code

    Observer.java

    /*
     *这是一个观察者接口,定义一个更新的接口给那些 在目标改变的时候被通知的对象;
     */
    public interface Observer {
        /*
         * 更新的接口
         * @param subject 传入目标对象,方便获取相应的目标对象的状态
         */
        public void update(WeatherSubject subject);
    }
    View Code

    ConcreteObserver.java

    /*
     * 
     * 具体的观察者对象,实现更新的方法,使自身的状态和目标的状态保持一致;
     * 
     * */
    public class ConcreteObserver implements Observer {
        
        //观察者的名字,是黄明的女朋友还是老妈;
        private String observerName;
        //根据内容的情况,这个消息从目标获取;
        private String WeatherContent;
        //提醒的内容;女朋友提醒约会,老妈提醒购物;
        private String remindThing;
        
        public String getObserverName() {
            return observerName;
        }
        public void setObserverName(String observerName) {
            this.observerName = observerName;
        }
        public String getWeatherContent() {
            return WeatherContent;
        }
        public void setWeatherContent(String weatherContent) {
            WeatherContent = weatherContent;
        }
        public String getRemindThing() {
            return remindThing;
        }
        public void setRemindThing(String remindThing) {
            this.remindThing = remindThing;
        }
        @Override
        /**
         * 获取目标类的状态同步到观察者类中;
         */
        public void update(WeatherSubject subject) {
            WeatherContent = ((ConcreteWeatherSubject)subject).getWeatherContent();
            System.out.println(observerName+"收到了"+WeatherContent+"提醒的内容"+remindThing);
            
        }
    
    }
    View Code

    test.java

    public class test {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            //创建目标
            ConcreteWeatherSubject weather = new ConcreteWeatherSubject();
            //创建观察者
            ConcreteObserver observergirl = new ConcreteObserver();
            observergirl.setObserverName("girl");
            observergirl.setRemindThing("约会了");
            ConcreteObserver observermother = new ConcreteObserver();
            observermother.setObserverName("mohter");
            observermother.setRemindThing("购物了");        
            //注册观察者
            weather.attach(observergirl);
            weather.attach(observermother);
            
            //目标发布天气
            weather.setWeatherContent("明天天气晴朗");
            
        }
    
    }
    View Code
  • 相关阅读:
    SGU 495 Kids and Prizes 概率DP 或 数学推理
    poj 2799 IP Networks 模拟 位运算
    uva 202 Repeating Decimals 模拟
    poj 3158 Kickdown 字符串匹配?
    uva 1595 Symmetry 暴力
    uva 201 Squares 暴力
    uva 1594 Ducci Sequence 哈希
    uva 1368 DNA Consensus String 字符串
    数字、字符串、列表的常用操作
    if条件判断 流程控制
  • 原文地址:https://www.cnblogs.com/zht0915/p/4693406.html
Copyright © 2011-2022 走看看