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

    观察者模式(Observer):又叫 发布-订阅 (Publish/Subscribe)模式

    观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。

    Subject类

    package observer;
    
    import java.util.ArrayList;
    import java.util.List;
    /**
     * 抽象主题或抽象通知者
     * @author 煞笔
     *
     */
    public abstract class Subject {
        private List<Observer> observers = new ArrayList<Observer>();
        
        public void addAttach(Observer observer){
            observers.add(observer);
        }
        
        public void removeAttach(Observer observer){
            observers.remove(observer);
        }
        
        public void notice(){
            for(Observer observer:observers){
                observer.update();
            }
        }
    }

    ConcreteSubject类

    package observer;
    /**
     * 具体主题或具体通知者
     * @author 煞笔
     *
     */
    public class ConcreteSubject extends Subject {
        public String status;
    
        public String getStatus() {
            return status;
        }
    
        public void setStatus(String status) {
            this.status = status;
        }
    
    }

    observer类

    package observer;
    /**
     * 抽象观察者
     * @author 煞笔
     *
     */
    public interface Observer {
        public void update();
    }

    StockConcreteObserver类

    package observer;
    /**
     * 具体观察者,股票观察者
     * 具体观察者保存一个指向具体主题对象的引用
     * @author 煞笔
     *
     */
    public class StockConcreteObserver implements Observer {
        private String name;
        private ConcreteSubject subject;
        private String status;
        
        public StockConcreteObserver(String name, ConcreteSubject subject) {
            super();
            this.name = name;
            this.subject = subject;
        }
    
        @Override
        public void update() {
            this.status = subject.status;
            System.out.println("股票观察者"+name+"的通知信息是"+status);
        }
    
        public ConcreteSubject getSubject() {
            return subject;
        }
    
        public void setSubject(ConcreteSubject subject) {
            this.subject = subject;
        }
        
    }

    YouKuConcreteObserver类

    package observer;
    
    public class YouKuConcreteObserver implements Observer {
        private String name;
        private ConcreteSubject subject;
        private String status;
        
        public YouKuConcreteObserver(String name, ConcreteSubject subject) {
            super();
            this.name = name;
            this.subject = subject;
        }
    
        @Override
        public void update() {
            this.status = subject.status;
            System.out.println("优酷观察者"+name+"的新状态是"+status);
        }
    
        public ConcreteSubject getSubject() {
            return subject;
        }
    
        public void setSubject(ConcreteSubject subject) {
            this.subject = subject;
        }
        
    }

    Business类

    package observer;
    
    public class Business {
    
        public static void main(String[] args) {
            ConcreteSubject subject = new ConcreteSubject();
            subject.addAttach(new StockConcreteObserver("张三", subject));
            subject.addAttach(new YouKuConcreteObserver("李四", subject));
            subject.status="老板回来了";
            subject.notice();
        }
    
    }

     观察者模式特点:

    观察者模式的关键对象是主题Subject和观察者Observer,一个Subject可以有任意数目依赖它的Observer,一旦Subject的状态发生改变,所有的观察者Observer都可以得到通知。
    当一个对象的改变需要同时改变其他对象的时候,而且它不知道具体有多少个对象等待改变,应该考虑使用观察者模式。

    观察者模式所做的工作就是在解耦合。让耦合的双方都依赖于抽象,而不是依赖于具体。从而使得各自的变化都不会影响另一边的变化。

    观察者模式的不足:

    每一个观察者Observer都要实现Observer接口,但是有些控件都早已被它们的制造商给封装了。所以就不可能实现接口的。

    抽象通知者还是依赖了抽象观察者,万一没有抽象观察者,功能都完成不了。

    所有观察者对象都要有更新的动作

    这个时候可以考虑时间委托实现

  • 相关阅读:
    创业公司必备的5款团队协作工具
    测试人必备:国内外最好用的6款Bug跟踪管理系统
    BUG克星:几款优秀的BUG跟踪管理软件
    千亿级SaaS市场:企业级服务的必争之地
    如何使用iClap创建普通批注
    详析手游圈从业人员必须知道的行业术语
    企业级服务元年:iClap高效解决手游更新迭代问题
    手游精品时代,iClap参会TFC高效解决手游问题
    全新办公方式,iClap引领企业级服务新浪潮
    vue自学小demo----前端
  • 原文地址:https://www.cnblogs.com/ccgjava/p/7078087.html
Copyright © 2011-2022 走看看