連線ORACLE 資料庫 ORA-12505 SID 錯誤
阿新 • • 發佈:2021-02-10
技術標籤:java
觀察者模式
想一個場景:
小明的成績被父母,同學和老師同時關注著,每當小明有了新成績時這三種人都會知道小明的成績
準備工作
建立一個觀察者抽象類
/**
* 觀察者
*/
public abstract class Observer {
//成績單
protected Transcript transcript;
//閱讀成績單的姿勢
public abstract void read();
}
建立一個成績單類
主要包含:
- 成績的基本屬性:名稱,學科,成績(分)
2.一個用來存放觀察者的容器(當有新的觀察者來觀察成績單時,都會被存入到該集合中)setTranscript(String name,int fraction,String subject)
4.提供註冊觀察者的方法(就是把觀察者存入到集合中)public void attach(Observer observer)
5.提供通知觀察者的方法(每一次改動成績單內容都要通知觀察者)public void notifyAllObservers()
可以在每次更改成績單中結尾呼叫notifyAllObservers()
來達到每次更改內容就會主動通知所有觀察者
import java.util.ArrayList;
import java.util.List;
/**
* 成績單
*/
public class Transcript{
//姓名
private String name;
//分數
private int fraction;
//學科
private String subject;
//一個用來存放觀察者的容器
//當有新的觀察者來觀察成績單時,都會被存入到該集合中
private List<Observer> list = new ArrayList<>();
public String getName() {
return name;
}
public int getFraction() {
return fraction;
}
public String getSubject() {
return subject;
}
//更改成績單內容
public void setTranscript(String name,int fraction,String subject){
this.name = name;
this.fraction = fraction;
this.subject = subject;
notifyAllObservers();
}
//加入觀察者
public void attach(Observer observer){
list.add(observer);
}
//通知所有觀察者
public void notifyAllObservers(){
list.forEach(v->{
v.read();
});
}
}
建立一個 老師觀察者
首先他要繼承Observer 抽象類 因為成績單類中的觀察者容器的指定型別是Observer ,顯然作為一個觀察者必須具備這個型別
不同的人有不同的看法 從老師 , 同學,父母的角度去看待這個成績單的內容是的側重點是不一樣的 所有在Observer 類中 有個read()抽象方法 目的就是讓不同的觀察者可以寫自己自定義的觀察方式(也就是不同觀察者有著不同的業務邏輯實現) 。
在這個類TeacherObserver 的建構函式上傳入成績單類,並在此建構函式中將自己作為觀察者註冊。
不一定非得用建構函式傳入成績類,應該說傳入的方式有很多,最終目的只有一個,就是觀察者例項化後需要知道要觀察誰,同時還要將觀察者和成績單中的觀察者集合聯絡起來,參考:
public TeacherObserver(Transcript transcript) {
this.transcript = transcript;
this.transcript.attach(this);
}
/**
* 教師觀察者
*/
public class TeacherObserver extends Observer {
public TeacherObserver() {
}
public TeacherObserver(Transcript transcript) {
this.transcript = transcript;
this.transcript.attach(this);
}
@Override
public void read() {
if(this.transcript.getFraction()>80){
System.out.println(this.transcript.getName()+"的"+
this.transcript.getSubject()+"成績考了"+
this.transcript.getFraction()+
"分,備註:成績不錯");
}else {
System.out.println(this.transcript.getName()+"的"+
this.transcript.getSubject()+"成績考了"+
this.transcript.getFraction()+
"分,備註:成績不理想");
}
}
}
執行一下程式碼
public class Main {
public static void main(String[] args) {
Transcript transcript = new Transcript();
new TeacherObserver(transcript);
transcript.setTranscript("王明",100,"數學");
transcript.setTranscript("王明",30,"數學");
}
}
執行結果
父母觀察者
/**
* 父母觀察者
*/
public class ParentsObserver extends Observer {
public ParentsObserver() {
}
public ParentsObserver(Transcript transcript) {
this.transcript = transcript;
this.transcript.attach(this);
}
@Override
public void read() {
System.out.println("父母:"+this.transcript.getName()+"在學校過得咋樣?");
}
}
同學觀察者
/**
* 同學觀察者
*/
public class ClassmateObserver extends Observer {
public ClassmateObserver() {
}
public ClassmateObserver(Transcript transcript) {
this.transcript = transcript;
this.transcript.attach(this);
}
@Override
public void read() {
System.out.println("同學:"+this.transcript.getName()+"!一會放假回家,去峽谷幹翻天");
}
}
只要繼承了Observer 類並實現對應的read方法就可以造多種多樣的觀察者
學習參考