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

    观察者模式所做的事情就是在解耦合,让耦合的双方都依赖于抽象,而不是依赖于具体。

    这样各自的变化不会影响另一边的变化。

    uml:

    代码:

    通知者:

    package observer;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class Subject {
    
    	private List<Observer> observers = new ArrayList<>();
    	private String state = null;
    
    	public String getState() {
    		return state;
    	}
    
    	public void setState(String state) {
    		this.state = state;
    	}
    	
    	public void attach(Observer observer) {
    		observers.add(observer);
    	}
    		
    	public void detach(Observer observer) {
    		observers.remove(observer);
    	}
    	
    	public void notifyAllObserver() {
    		for(Observer observer : observers){
    			observer.update();
    		}
    	}
    }
    
    package observer;
    
    
    public class ConcreteSubject extends Subject {
    	
    	@Override
    	public void notifyAllObserver() {
    		System.out.println("老板回来啦!");
    		super.notifyAllObserver();
    	}
    	
    }
    

    观察者:

    package observer;
    
    public abstract class Observer {
    	
    	protected Subject subject = null;
    	
    	public Observer(Subject subject) {
    		this.subject = subject;
    	}
    	
    	public abstract void update();
    	
    }
    
    package observer;
    
    public class ConcreteObserver extends Observer{
    
    	private String name = null;
    	private String state = null;
    	
    	public ConcreteObserver(String name, String state, Subject subject) {
    		super(subject);
    		this.name = name;
    	}
    	
    	public String getState() {
    		return state;
    	}
    
    	public void setState(String state) {
    		this.state = state;
    	}
    
    	@Override
    	public void update() {
    		state = subject.getState();
    		System.out.print(name + "的新状态是" + state);
    		
    	}
    	
    	
    }
    

      

    DEMO:

    package observer;
    
    public class ObserverDemo {
    
    	public static void main(String[] args) {
    		Subject subject = new ConcreteSubject();
    		ConcreteObserver observer = new ConcreteObserver("老王", "看电影", subject);
    		subject.attach(observer);
    		
    		subject.setState("快工作!");
    		subject.notifyAllObserver();
    	}
    	
    }
    

      

  • 相关阅读:
    java多线程
    golang编码转换
    golang csv,xls,xlsx
    golang 资源
    electron安装
    Ubuntu系统下面软件安装更新命令
    golang代码执行顺序
    datatables使用
    Echarts柱形图颜色设置
    golang chan 超时
  • 原文地址:https://www.cnblogs.com/zcy-backend/p/6700104.html
Copyright © 2011-2022 走看看