1. 程式人生 > 其它 >連線ORACLE 資料庫 ORA-12505 SID 錯誤

連線ORACLE 資料庫 ORA-12505 SID 錯誤

技術標籤:java

觀察者模式

想一個場景:
小明的成績被父母,同學和老師同時關注著,每當小明有了新成績時這三種人都會知道小明的成績

準備工作
建立一個觀察者抽象類

/**
 * 觀察者
 */
public abstract class Observer {
    //成績單
    protected Transcript transcript;

    //閱讀成績單的姿勢
    public abstract void read();
}

建立一個成績單類
主要包含:

  1. 成績的基本屬性:名稱,學科,成績(分)
    2.一個用來存放觀察者的容器(當有新的觀察者來觀察成績單時,都會被存入到該集合中)
    3.提供設定成績單內容的方法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方法就可以造多種多樣的觀察者
學習參考