JAvaオブザーバー設定モード
7191 ワード
導入:需要:気象台が1~1.5秒おきに天気を更新する場合、学生は天気を更新するたびに最新の天気をリアルタイムで受信し、応答しなければならない.
学生クラスは変わらない
実装1:
結果:天気の更新は一度も実現していないので、学生は反応します.2つのスレッドでは、2つのランダムな時間がずれ、同期しない可能性があります.
気象台:今日のスモッグ気象台:今日の雹丁昌江:殴られて死にたいですか.どうせ私は授业に行かない気象台:今日の天気は霜降り丁昌江:寒いですね、やはり寮で寝ましょう丁昌江:寒いですね、やはり寮で寝ましょう気象台:今日は霜降りです
実装2:
結果:目的を達成したようだが、もう2つの限界がある.二:学生にしか知らせられませんか.他のグループは、国は国学の小さな花だけを重視しているのだろうか.
気象台:今日は霜降りの丁昌江:寒いですね、やはり寮で寝ましょう.気象台:今日はスモッグの丁昌江:すみません、先生に休暇を取ってください.
オブザーバー設計モード:Weatherインタフェース:weatherインタフェースを作成し、そのインタフェースを実現したクラスが気象体に通知される限り
WeatherStationクラス:現在気象台の最新天気を購読しているユーザーを保存するためにリストを維持し、新しい天気がある場合、リストを巡ってユーザーに通知します.
Empクラス:(Weatherインタフェースも実装)
MainクラスMainクラスMainクラス
結果:
気象台:今日の天気は雹丁昌江です.殴られて死にたいですか.どうせ私は授业に行かない呉云飞:どうせ私はネットでヘルメット気象台を买ったばかりです:今日は霜冻丁昌江:寒いですね.やはり寮で寝ましょう.呉云飞:绵のコートを买って、出勤しましょう.気象台:今日は雨が降っています.丁昌江:こんなに大きな雨は授业に行かないでください.呉云飞:雨が降っていますか.もういいから、出勤しましょう.
学生クラスは変わらない
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();
}
}
結果:
気象台:今日の天気は雹丁昌江です.殴られて死にたいですか.どうせ私は授业に行かない呉云飞:どうせ私はネットでヘルメット気象台を买ったばかりです:今日は霜冻丁昌江:寒いですね.やはり寮で寝ましょう.呉云飞:绵のコートを买って、出勤しましょう.気象台:今日は雨が降っています.丁昌江:こんなに大きな雨は授业に行かないでください.呉云飞:雨が降っていますか.もういいから、出勤しましょう.