JAvaオブザーバー設定モード

7191 ワード

導入:需要:気象台が1~1.5秒おきに天気を更新する場合、学生は天気を更新するたびに最新の天気をリアルタイムで受信し、応答しなければならない.
学生クラスは変わらない
public class Student implements Weather{
    private String name;
    public Student(String name){
        this.name = name;
    }

    @Override
    public void observerWeather(String curWeather) {
        //  ","  ","  ","  ","  ","  "};
        switch(curWeather){
        case "  ":
            System.out.println(this.name+":     ,     ");
            break;
        case "  ":
            System.out.println(this.name+":           ");
            break;
        case "  ":
            System.out.println(this.name+":   ,        ");
            break;
        case "  ":
            System.out.println(this.name+":    ,   ,     ");
            break;
        case "  ":
            System.out.println(this.name+":      ?          ");
            break;
        case "  ":
            System.out.println(this.name+":           ,     ");
            break;
        }
        
    }

}

実装1:
class WeatherStation{
    String []weathers={"  ","  ","  ","  ","  ","  "};
    String curWeather;
    Random random = new Random();   
    
    public void startWork(){
        new Thread(){
            @Override
            public void run() { //                
                while(true){
                    updateWeather(); 
                    //   1~1.5       
                    int millis = random.nextInt(501)+1000;
                    try {
                        Thread.sleep(millis);//     
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();
    }
    
    private void updateWeather(){
        int sel = random.nextInt(6);
        curWeather = weathers[sel];
        System.out.println("   :    "+curWeather);
    }
}


class Demo01{
    public static void main(String args[]){
        WeatherStation ws = new WeatherStation ();
        ws.startWork();
        
        Student stu = new Student("   ");
        Random random = new Random();
        while(true){
            int millis = random.nextInt(501)+1000;
            try {
                Thread.sleep(millis);
                stu.observerWeather(ws.curWeather);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

結果:天気の更新は一度も実現していないので、学生は反応します.2つのスレッドでは、2つのランダムな時間がずれ、同期しない可能性があります.
気象台:今日のスモッグ気象台:今日の雹丁昌江:殴られて死にたいですか.どうせ私は授业に行かない気象台:今日の天気は霜降り丁昌江:寒いですね、やはり寮で寝ましょう丁昌江:寒いですね、やはり寮で寝ましょう気象台:今日は霜降りです
実装2:
class WeatherStation{
    String []weathers={"  ","  ","  ","  ","  ","  "};
    String curWeather;
    Random random = new Random();
    Student stu;
    
    public void add(Student stu){
        this.stu = stu;
    }
    
    public void startWork(){
        new Thread(){
            @Override
            public void run() {
                while(true){
                    updateWeather();
                    stu.observerWeather(curWeather);
                    //   1~1.5       
                    
                    int millis = random.nextInt(501)+1000;
                    try {
                        Thread.sleep(millis);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();
    }
    
    private void updateWeather(){
        int sel = random.nextInt(6);
        curWeather = weathers[sel];
        System.out.println("   :    "+curWeather);
    }


class Demo01{
    public static void main(String args[]){
        WeatherStation ws = new WeatherStation ();
        Student stu = new Student("   ");
        ws.add(stu);
        ws.startWork();
    }
}

結果:目的を達成したようだが、もう2つの限界がある.二:学生にしか知らせられませんか.他のグループは、国は国学の小さな花だけを重視しているのだろうか.
気象台:今日は霜降りの丁昌江:寒いですね、やはり寮で寝ましょう.気象台:今日はスモッグの丁昌江:すみません、先生に休暇を取ってください.
オブザーバー設計モード:Weatherインタフェース:weatherインタフェースを作成し、そのインタフェースを実現したクラスが気象体に通知される限り
interface Weather {
    void observerWeather (String cuWeather);
}

WeatherStationクラス:現在気象台の最新天気を購読しているユーザーを保存するためにリストを維持し、新しい天気がある場合、リストを巡ってユーザーに通知します.
class WeatherStation{
    String []weathers={"  ","  ","  ","  ","  ","  "};
    String curWeather;
    Random random = new Random();

    List list = new ArrayList();
    
    public void add(Weather w){
        list.add(w);
    }
    
    public void startWork(){
        new Thread(){
            @Override
            public void run() {
                while(true){
                    updateWeather(); 
                    //   1~1.5            list    
                    for(Weather e:list){
                        e.observerWeather(curWeather);
                    }
                    
                    int millis = random.nextInt(501)+1000;
                    try {
                        Thread.sleep(millis);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();
    }
    
    private void updateWeather(){
        int sel = random.nextInt(6);
        curWeather = weathers[sel];
        System.out.println("   :    "+curWeather);
    }
}

Empクラス:(Weatherインタフェースも実装)
public class Emp implements Weather{
    private String name;
    public Emp(String name){
        this.name = name;
    }
    
    @Override
    public void observerWeather(String curWeather) {
        switch(curWeather){
        case "  ":
            System.out.println(this.name+":     ,      ");
            break;
        case "  ":
            System.out.println(this.name+":  ?     ,    ");
            break;
        case "  ":
            System.out.println(this.name+":     ,    ");
            break;
        case "  ":
            System.out.println(this.name+":    ,          ?");
            break;
        case "  ":
            System.out.println(this.name+":            ");
            break;
        case "  ":
            System.out.println(this.name+":   ,          ,   ");
            break;
        }
        
    }
}


MainクラスMainクラスMainクラス
class Main{
    public static void main(String args[]){
        WeatherStation ws = new WeatherStation ();
        ws.add(new Student("   "));
        ws.add(new Emp("   "));
        ws.startWork();
    }
}

結果:
気象台:今日の天気は雹丁昌江です.殴られて死にたいですか.どうせ私は授业に行かない呉云飞:どうせ私はネットでヘルメット気象台を买ったばかりです:今日は霜冻丁昌江:寒いですね.やはり寮で寝ましょう.呉云飞:绵のコートを买って、出勤しましょう.気象台:今日は雨が降っています.丁昌江:こんなに大きな雨は授业に行かないでください.呉云飞:雨が降っていますか.もういいから、出勤しましょう.