1. 程式人生 > 其它 >spring基礎01-簡介,安裝

spring基礎01-簡介,安裝


  有兩組實體物件,一組是觀察者,一組是被觀察者。Concretesubject是被觀察者,ConcreteObserver是觀察者。所有的觀察者,都實現了Observer介面;所有的被觀察者,都繼承自Subject抽象類。
聽著有點懵逼,直接上程式碼

定義一個觀察者介面

//觀察者
public interface Observer {
	public void update();
}

定義被觀察者抽象類

//被觀察者
abstract class Subject {
	
	//內部維護的一個觀察者列表
	private List<Observer> observerList = new ArrayList<Observer>();
	
	//新增觀察者
	public void attachObserver(Observer observer) {
		observerList.add(observer);
	}
	
	//移除觀察者
	public void detachObserver(Observer observer) {
		observerList.remove(observer);
	}
	
	//通知觀察者
	public void notifyObservers() {
		for (Observer observer : observerList) {
			observer.update();
		}
	}
}

 怪物、寶物、陷阱觀察者

//怪物觀察者
public class Monster implements Observer {

	@Override
	public void update() {
		if (inRange()) {
			System.out.println("怪物對主角進行攻擊!");
		}
	}

	private boolean inRange() {
		//判斷主角是否在自己的影響範圍內,這裡忽略細節,直接返回true
		return true;
	}

}


//陷阱觀察者
public class Trap implements Observer {

	@Override
	public void update() {
		if (inRange()) {
			System.out.println("陷阱 困住主角!");
		}

	}

	private boolean inRange() {
		// 判斷主角是否在自己的影響範圍內,這裡忽略細節,直接返回true
		return true;
	}

}

//寶物觀察者
public class Treasure implements Observer {

	@Override
	public void update() {
		if (inRange()) {
			System.out.println("寶物 為主角加血!");
		}
	}

	private boolean inRange() {
		// 判斷主角是否在自己的影響範圍內,這裡忽略細節,直接返回true
		return true;
	}

}

 每一個觀察者都實現了自己不同的update方法。分別對觀察者有不同的處理方法。

 

建立主角類,他是被觀察的物件,主教類做出操作,這時候就呼叫notifyObServers()方法來進行通知觀察者,觀察者分別呼叫自己的update()方法。

//被觀察者
public class Hero extends Subject{
	
	void move() {
		System.out.println("主角向前移動");
		//觸發操作,遍歷通知觀察者
		notifyObservers();
	}

}

以下是測試類

public static void main(String[] args) {
        //初始化物件
        Hero hero = new Hero();
        Monster monster = new Monster();
        Trap trap = new Trap();
        Treasure treasure = new Treasure();
        //註冊觀察者
        hero.attachObserver(monster);
        hero.attachObserver(trap);
        hero.attachObserver(treasure);
        //移動事件
        hero.move();
    }
}

 結果:

主角向前移動
怪物對主角進行攻擊!
陷阱 困住主角!
寶物 為主角加血!

我們可以看到只要hero觸發move,其他觀察者物件都做出了反應。

什麼時候用觀察者模式呢?

 當一個物件的改變需要同時改變其它物件,並且它不知道具體有多少物件有待改變的時候,應該考慮使用觀察者模式。

   而使用觀察者模式的動機在於:將一個系統分割成一系列相互協作的類有一個很不好的副作用,就是需要維護相關物件間的一致性,我們不希望為了維持一致性而使各類緊密耦合,這樣會給維護、擴充套件和重用都帶來不便,而觀察者模式所做的工作就是在解除耦合

應用例項:

  • 手機丟了,委託別人給其他人發訊息通知
  • 通知老師/老闆來了
  • 拍賣,拍賣師觀察最高標價,然後通知給其它競價者競價
  • 在一個目錄下建立一個檔案,會同時通知目錄管理器增加目錄,並通知磁碟減少空間,檔案是被觀察者,目錄管理器和磁碟管理器是觀察者
  • 貓叫了一聲,嚇著了老鼠,也驚到了主人,貓是被觀察者,老鼠和人是觀察者。

注意事項:

  • 避免迴圈引用
  • 如果順序執行,某一觀察者錯誤會導致系統卡殼,一般採用非同步方式。

       https://zhuanlan.zhihu.com/p/158537313

       https://www.cnblogs.com/adamjwh/p/10913660.html