• 观察者模式


    一、定义

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

    二、实现

    观察者模式使用三个类 Subject、Observer 和 Client。Subject 对象带有绑定观察者到 Client 对象和从 Client 对象解绑观察者的方法。我们创建 Subject 类、Observer 抽象类和扩展了抽象类 Observer 的实体类。

    ObserverPatternDemo,我们的演示类使用 Subject 和实体类对象来演示观察者模式。

    步骤1、创建Subject类

     1 import java.util.ArrayList;
     2 import java.util.List;
     3  
     4 public class Subject {
     5    
     6    private List<Observer> observers 
     7       = new ArrayList<Observer>();
     8    private int state;
     9  
    10    public int getState() {
    11       return state;
    12    }
    13  
    14    public void setState(int state) {
    15       this.state = state;
    16       notifyAllObservers();
    17    }
    18  
    19    public void attach(Observer observer){
    20       observers.add(observer);      
    21    }
    22  
    23    public void notifyAllObservers(){
    24       for (Observer observer : observers) {
    25          observer.update();
    26       }
    27    }  
    28 }

    步骤2、创建Observer类

    1 public abstract class Observer {
    2    protected Subject subject;
    3    public abstract void update();
    4 }

    步骤3、创建实体观察者类

     1 public class BinaryObserver extends Observer{
     2  
     3    public BinaryObserver(Subject subject){
     4       this.subject = subject;
     5       this.subject.attach(this);
     6    }
     7  
     8    @Override
     9    public void update() {
    10       System.out.println( "Binary String: " 
    11       + Integer.toBinaryString( subject.getState() ) ); 
    12    }
    13 }
     1 public class OctalObserver extends Observer{
     2  
     3    public OctalObserver(Subject subject){
     4       this.subject = subject;
     5       this.subject.attach(this);
     6    }
     7  
     8    @Override
     9    public void update() {
    10      System.out.println( "Octal String: " 
    11      + Integer.toOctalString( subject.getState() ) ); 
    12    }
    13 }
     1 public class HexaObserver extends Observer{
     2  
     3    public HexaObserver(Subject subject){
     4       this.subject = subject;
     5       this.subject.attach(this);
     6    }
     7  
     8    @Override
     9    public void update() {
    10       System.out.println( "Hex String: " 
    11       + Integer.toHexString( subject.getState() ).toUpperCase() ); 
    12    }
    13 }

    步骤4、使用Subject和实体观察者对象

     1 public class ObserverPatternDemo {
     2    public static void main(String[] args) {
     3       Subject subject = new Subject();
     4  
     5       new HexaObserver(subject);
     6       new OctalObserver(subject);
     7       new BinaryObserver(subject);
     8  
     9       System.out.println("First state change: 15");   
    10       subject.setState(15);
    11       System.out.println("Second state change: 10");  
    12       subject.setState(10);
    13    }
    14 }
  • 相关阅读:
    用python对汉诺塔动态的实现
    用python语言算π值并且带有进度条
    turtle库的学习笔记
    Leetcode 230 二叉搜索树中第k小的元素
    Leetcode 665 非递减数列
    Leetcode 1423 可获得的最大点数
    Leetcode 222 完全二叉树的节点个数
    Leetcode 1208尽可能使字符串相等
    Leetcode 199 二叉树的右视图
    Leetcode 634 子数组最大平均数
  • 原文地址:https://www.cnblogs.com/wylwyl/p/10496692.html
Copyright © 2020-2023  润新知