• 观察者模式


    观察者模式

    一个对象状态改变,可以引起多个对象的状态改变

    Subject  抽象主题

    Observer 抽象观察者

    Boiler 具体主题

    LED 具体观察者

    Client   测试例子

    package com.moreas.design;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public abstract class Subject{
    	
    	   private List<Observer> observers = new ArrayList<Observer>();
    
    	    //添加观察者
    	    public void attach(Observer observer) {
    	        observers.add(observer);
    	    }
    
    	    //移除观察者
    	    public void tach(Observer observer) {
    	        observers.remove(observer);
    	    }
    
    	    //通知所有的被观察者
    	    public void notice(Subject subject){
    	        for (Observer obj: observers) {
    	            obj.update(subject);
    	        }
    	    }
    	
     
    }
    

      

    package com.moreas.design;
    
    public abstract class  Observer {
    	
    	 public abstract void update(Subject subject);
    }
    

      

    package com.moreas.design;
    public class Boiler extends Subject {
        //水温
        public int temperature;
    
        /**烧水*/
        public void onBoil(){
            for(int i=0;temperature<100;i++){
                temperature=temperature+1;  //升温
                super.notice(this);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    

      

    package com.moreas.design;
    public class LED extends Observer {
        @Override
        public void update(Subject subject) {
            Boiler boiler = (Boiler) subject;
            System.out.println("当前水温:" + boiler.temperature);
        }
    }
    

      

    package com.moreas.design;
    public class Client {
        public static void main(String[] args) {
            //观察者
           // Observer alarm=new Alarm();
            Observer led=new LED();
    
            //主题
            Boiler boiler=new Boiler();
           // boiler.attach(alarm);
            boiler.attach(led);
    
            //烧水
            boiler.onBoil();
        }
    }
    

      

     观察者模式,简单改动

    public class Subject {
    
        private List<Observer> observers = new ArrayList<>();
    
        private int state;
    
        public int getState() {
            return this.state;
        }
    
        public void setState(int state) {
            if (state == this.state) {
                return;
            }
            this.state = state;
            notifyAllObserver();
        }
    
        public void attach(Observer observer) {
            observers.add(observer);
        }
    
        private void notifyAllObserver() {
            observers.stream().forEach(x -> x.update());
        }
    }
    public abstract class Observer {
    
        protected Subject subject;
    
        public Observer(Subject subject) {
            this.subject = subject;
            this.subject.attach(this);
        }
    
        public abstract void update();
    
    }
    public class BinaryObserver extends Observer {
    
        public BinaryObserver(Subject subject) {
            super(subject);
        }
    
        @Override
        public void update() {
            System.out.println("Binary String:" + Integer.toBinaryString(subject.getState()));
        }
    }
    //Octal  八进制
    public class OctalObserver extends Observer {
    
        public OctalObserver(Subject subject) {
            super(subject);
        }
    
        @Override
        public void update() {
            System.out.println("Octal String:" + Integer.toOctalString(subject.getState()));
        }
    }
    public class  Client {
        public static void main(String[] args) {
    
            final Subject subject = new Subject();
            new BinaryObserver(subject);
            new OctalObserver(subject);
            System.out.println("==================");
            subject.setState(10);
            
            System.out.println("==================");
            subject.setState(10);
    
            System.out.println("==================");
            subject.setState(15);
        }
    }
  • 相关阅读:
    【BZOJ1396】识别子串
    【BZOJ3309】DZY Loves Math
    【XSY3306】alpha
    整体二分
    常系数齐次线性递推
    【XSY2968】线性代数
    【XSY2892】【GDSOI2018】谁是冠军
    【BZOJ5020】[LOJ2289]【THUWC2017】在美妙的数学王国中畅游
    【XSY2989】字符串
    【XSY2988】取石子
  • 原文地址:https://www.cnblogs.com/moris5013/p/10112335.html
Copyright © 2020-2023  润新知