• 设计模式-----观察者模式(一)


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

    步骤:

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

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

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

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

    通用的代码如下:

    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
  • 相关阅读:
    【web安全】浅谈web安全之XSS
    【css】浅谈BFC
    nodejs笔记一--模块,全局process对象;
    逼真打字机效果;
    深入理解CSS3 animation的steps
    网址链接收藏
    用hoverclock插件实现HTML5时钟
    JS多种方法实现随机颜色;
    canvas实现跟随鼠标旋转的箭头
    封装insertAfter、addClass、格式化时间
  • 原文地址:https://www.cnblogs.com/zht0915/p/4693406.html
Copyright © 2020-2023  润新知