3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PrintObserver「オブザーバデザインパターン:説明と実装例」

Posted at

最近、プロジェクトのJavaFXアプリケーションのために色々なターミナルタイプを扱うことを実験しています。

アプリケーションが何かを印刷しようとしているときはいつでも、システム端末、アプリケーション端末ビュー、および他の将来のビューの両方からの端末がStringを表示できるはずです。

これで、オブザーバーパターンがこの問題を解決するための最善の方法であると判断しました

#Observer Patternとは

####Observer=観察者

このパターンは、 観察者となるオブジェクトが、観察対象となるオブジェクトからの状態変化の通知を受けそれに体する処理を行うパターンです。

###このパターンを使うことの利点は以下の通りです:

  1. オブジェクトとオブザーバの間のカップリングを説明します。

  2. ブロードキャストタイプの通信をサポートします。

###使用法:

  1. オブジェクトを緊密に結合した状態に保ちながら、オブジェクトの状態の変化を別のオブジェクトに反映させることが必要時。

  2. 将来に最小限の変更で新しいオブザーバーを追加することが必要時。

###サンプルPrint Observer

PrintObserverUML.png

###役割
####PrintObserver (印刷観察) <<抽象クラス>>:
このクラスのすべての子ノードは有効な端末タイプを追加、削除、および「(Printableを実装しているクラス)」使用できます。

PrintObserver.java
import java.util.ArrayList;

public abstract class PrintObserver {
    private final ArrayList<Printable> printerList = new ArrayList<>();

    public void notifyAllPrinters(String toPrint) {
        if(!toPrint.equals("")) {
            for(Printable printer : printerList) {
                System.out.println("\n");
                printer.print(toPrint);
            }
        } else {
            System.out.println("Quitting! Thank you!");
        }
    }
    
    public void addPrinter(Printable printer) {
        this.printerList.add(printer);
    }
    
    public void removePrinter(Printable printer) {
        this.printerList.remove(printer);
    }
}

####Printable (印刷可能) <<インタフェース>>:
このインタフェースを実装するすべてのクラスはオブザーバであり、何かが印刷されるのを待っています。

Printable.java
public interface Printable {
    void print(String toPrint);
}

####PrintTerminalAとPiikun:
Printableを実装しているので、PrintObserverの子ノードがこのPrintableを追加してnotifyAllObserversという関数を呼び出す場合は、印刷されます。

各Printableに対して、他のPrintableとは独立した独自の印刷実装が含まれています。

PrintTerminalA.java
public class PrintTerminalA implements Printable {
    @Override
    public void print(String toPrint) {
        System.out.println("This is terminal A");
        System.out.println("It seems that someone has printed this message: "+toPrint);
    }
}
Piikun.java
public class Piikun implements Printable
{
    @Override
    public void print(String toPrint) {
        System.out.println("こんにちは!ピーくんです!");
        System.out.println("印刷するものを送って頂いてありがとうございます。メッセージはこちらです:");
        System.out.println(toPrint);
    }
    
}

####PrintSource <<メイン>>:
mainメソッドが含まれています。
サンプルPrintableをリストに追加して、ユーザー入力をすべてのPrintableクラスに送信します。

PrintSource.java
import java.util.Scanner;

public class PrintSource extends PrintObserver {
    
    public PrintSource() {
        addPrinter(new PrintTerminalA());
        addPrinter(new Piikun());
        
        String toPrint = "~";
        while(!toPrint.equals("")) {
            System.out.print("\n\nEnter String to print: ");
            Scanner sc = new Scanner(System.in);
            toPrint = sc.nextLine();
            
            notifyAllPrinters(toPrint);
        }
    }
    
    public static void main(String[] args) {
        PrintSource printSource = new PrintSource();
    }
}

####githubでこのプロジェクトをダウンロード:
[Github:] https://github.com/CoralBeef-zz/PrintObserverExample

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?