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

    1.什么是观察者模式

      当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式

    2.优缺点 

      优点: 1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制。

      缺点: 1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。 2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。 3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。

    3.UML类图

      

    Subject.java
    public class Subject {
       
       private List<Observer> observers 
          = new ArrayList<Observer>();
       private int state;
     
       public int getState() {
          return state;
       }
     
       public void setState(int state) {
          this.state = state;
          notifyAllObservers();
       }
     
       public void attach(Observer observer){
          observers.add(observer);      
       }
     
       public void notifyAllObservers(){
          for (Observer observer : observers) {
             observer.update();
          }
       }  
    }
    
    Observer.java
    public abstract class Observer {
       protected Subject subject;
       public abstract void update();
    }
    
    BinaryObserver.java
    public class BinaryObserver extends Observer{
     
       public BinaryObserver(Subject subject){
          this.subject = subject;
          this.subject.attach(this);
       }
     
       @Override
       public void update() {
          System.out.println( "Binary String: " 
          + Integer.toBinaryString( subject.getState() ) ); 
       }
    }
    
    OctalObserver.java
    public class OctalObserver extends Observer{
     
       public OctalObserver(Subject subject){
          this.subject = subject;
          this.subject.attach(this);
       }
     
       @Override
       public void update() {
         System.out.println( "Octal String: " 
         + Integer.toOctalString( subject.getState() ) ); 
       }
    }
    
    HexaObserver.java
    public class HexaObserver extends Observer{
     
       public HexaObserver(Subject subject){
          this.subject = subject;
          this.subject.attach(this);
       }
     
       @Override
       public void update() {
          System.out.println( "Hex String: " 
          + Integer.toHexString( subject.getState() ).toUpperCase() ); 
       }
    }
    
    ObserverPatternDemo.java
    public class ObserverPatternDemo {
       public static void main(String[] args) {
          Subject subject = new Subject();
     
          new HexaObserver(subject);
          new OctalObserver(subject);
          new BinaryObserver(subject);
     
          System.out.println("First state change: 15");   
          subject.setState(15);
          System.out.println("Second state change: 10");  
          subject.setState(10);
       }
    }
  • 相关阅读:
    Educational Codeforces Round 51 (Rated for Div. 2)
    Kruskal重构树入门
    编译原理词法分析
    java.lang.String内部结构的变化
    android 世界各国英文简写代码 资源文件
    openCV python 安装
    解读30个提高Web程序执行效率的好经验
    从认知盈余说起,也谈分享精神
    STL set multiset map multimap unordered_set unordered_map example
    [置顶] 【Git入门之一】Git是神马?
  • 原文地址:https://www.cnblogs.com/helloworldmybokeyuan/p/11698842.html
Copyright © 2011-2022 走看看