• 观察者模式


    Observer Pattern

    1. 定义观察者模式定义了对象之间的一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
    2. 场景发布者发布消息,订阅者接受消息
    3. OO原则
      • 为交互对象之间的松耦合设计而努力,松耦合设计更有弹性,更能应对变化。

    示例场景

    关注了某公众号的用户可以收到推文,未关注的收不到推文,取消关注后也不能收到推文。

    类图

    示例代码

    观察者接口

    public interface Observer {
    	public void update(String message);
    }
    

    可观察者接口

    public interface Observerable {
    	public void registerObserver(Observer o);
    	public void removeObserver(Observer o);
    	public void notifyObsercers();
    }
    

    定义观察者

    public class User implements Observer {
    
    	private String username;
    	private String message;
    	
    	public User(String username) {
    		this.username = username;
    	}
    	
    	@Override
    	public void update(String message) {
    		this.message = message;
    		display();
    	}
    	
    	public void display() {
    		System.out.println(username + "收到推文:" + message);
    	}
    }
    

    定义公众号

    import java.util.List;
    import java.util.ArrayList;
    
    public class OfficialAccount implements Observerable {
    
    	private List<Observer> list;
    	private String message;
    	
    	public OfficialAccount() {
    		list = new ArrayList<Observer>();
    	}
    	
    	@Override
    	public void registerObserver(Observer o) {
    		list.add(o);
    	}
    
    	@Override
    	public void removeObserver(Observer o) {
    		if(!list.isEmpty())
    			list.remove(o);
    	}
    
    	@Override
    	public void notifyObsercers() {
    		for (Observer observer : list) {
    			observer.update(message);
    		}
    	}
    	
    	public void setInfo(String message) {
    		this.message = message;
    		System.out.println("公众号推文:" + message);
    		
    		//通知观察者
    		notifyObsercers();
    	}
    
    }
    

    创建测试类

    public class Test {
    
    	public static void main(String[] args) {
    		OfficialAccount officialAccount = new OfficialAccount();
    		
    		//创建观察者
    		Observer py = new User("py");
    		Observer qpf = new User("qpf");
    		
    		//注册观察者
    		officialAccount.registerObserver(py);
    		officialAccount.registerObserver(qpf);
    		
    		//公众号编写推文
    		officialAccount.setInfo("第一篇推文");
    		
    		//删除qpf后推文
    		officialAccount.removeObserver(qpf);
    		officialAccount.setInfo("第二篇推文");
    	}
    
    }
    

    运行结果如下:

  • 相关阅读:
    数值的扩展
    字符串的扩展
    变量的解构赋值整理
    let和const命令整理
    解析vue2.0中render:h=>h(App)的具体意思
    菜单栏的显示与隐藏
    vue的事件绑定
    CSS3实现3D地球自转行星公转
    MongoDB命令的简单操作(一)
    canvas扇形进度圈动态加载
  • 原文地址:https://www.cnblogs.com/pycrab/p/8910168.html
Copyright © 2020-2023  润新知