• Nie Znaleziono Wyników

obserwator

N/A
N/A
Protected

Academic year: 2021

Share "obserwator"

Copied!
24
0
0

Pełen tekst

(1)

Wzorce projektowe

Wzorce projektowe

Wybrane wzorce operacyjne: Obserwator

Wybrane wzorce operacyjne: Obserwator

Projektowanie i programowanie

Projektowanie i programowanie

obiektowe

obiektowe

Roman Simiński

roman.siminski@us.edu.pl roman@siminskionline.pl programowanie.siminskionline.pl

(2)

Obserwator

Obserwator

Observer Pattern

(3)

CurrencyWallet ProfitChart PriceList

Obserwator – koncepcja

Obserwator – koncepcja

CurrencyRateTable

double euroExchangeRate;

Obiekt podmiotu (subject) zawierający informację, której zmiana powinna być rozgłoszona

Internet

Zmiany

(4)

CurrencyWallet ProfitChart PriceList

Obserwator – koncepcja

Obserwator – koncepcja

CurrencyRateTable

double euroExchangeRate;

Obiekt podmiotu (subject) zawierający informację, której zmiana powinna być rozgłoszona

Internet

Zmiany

Podmiot powinien mieć możliwość powiadamiania zainteresowanych obiektów

0 zmianach, jednak związki pomiędzy klasami obiektów powinny być maksymalnie „luźne”

Podmiot powinien mieć możliwość powiadamiania zainteresowanych obiektów

0 zmianach, jednak związki pomiędzy klasami obiektów powinny być maksymalnie „luźne”

Obiekty, dla których zmiana stanu podmiotu jest istotna, powinny zostać o niej poinformowane – to obserwatorzy (observers)

(5)

CurrencyWallet ProfitChart PriceList

Obserwator – koncepcja

Obserwator – koncepcja

CurrencyRateTable

double euroExchangeRate;

Obiekt podmiotu (subject) zawierający informację, której zmiana powinna być rozgłoszona

Internet

Zmiany

Powiązania obiektami powinny być tworzone dynamicznie, obiekty powinny jak najmniej

wiedzieć o sobie, szczególnie obserwatorzy

Powiązania obiektami powinny być tworzone dynamicznie, obiekty powinny jak najmniej

wiedzieć o sobie, szczególnie obserwatorzy

Obiekty, dla których zmiana stanu podmiotu jest istotna, powinny zostać o niej poinformowane – to obserwatorzy (observers)

(6)

CurrencyWallet ProfitChart PriceList

Obserwator – koncepcja

Obserwator – koncepcja

CurrencyRateTable

double euroExchangeRate;

Obiekt podmiotu (subject) zawierający informację, której zmiana powinna być rozgłoszona

Internet

Zmiany

Obiekty, dla których zmiana stanu podmiotu jest istotna, powinny zostać o niej poinformowane – to obserwatorzy (observers)

To jest pewien konkretny podmiot

(7)

CurrencyWallet ProfitChart PriceList

Obserwator – koncepcja

Obserwator – koncepcja

CurrencyRateTable

double euroExchangeRate;

Obiekt podmiotu (subject) zawierający informację, której zmiana powinna być rozgłoszona

Internet

Zmiany

Obiekty, dla których zmiana stanu podmiotu jest istotna, powinny zostać o niej poinformowane – to obserwatorzy (observers)

Wzorce projektowe dostarczają rozwiązania oderwanego od konkretów, dlatego

przechodzimy na poziom wykorzystujący klasy abstrakcyjne i/lub interfejsy

Wzorce projektowe dostarczają rozwiązania oderwanego od konkretów, dlatego

przechodzimy na poziom wykorzystujący klasy abstrakcyjne i/lub interfejsy

(8)

CurrencyWallet ProfitChart PriceList

Obserwator – koncepcja

Obserwator – koncepcja

CurrencyRateTable

double euroExchangeRate;

Obiekt podmiotu (subject) zawierający informację, której zmiana powinna być rozgłoszona

Internet

Zmiany

Obiekty, dla których zmiana stanu podmiotu jest istotna, powinny zostać o niej poinformowane – to obserwatorzy (observers)

Podmiot Obserwator

(9)

Obserwator

Obserwator

Wzorzec Obserwator pozwala na nawiązanie luźnego powiązania pomiędzy

obiektem-podmiotem a obiektami-obserwatorami.

Obserwatorzy nie wiedzą o swoim istnieniu, podmiot jest powiązany

z potencjalnie wieloma niezależnymi obserwatorami (typowo 1:N).

Podmiot i obserwatorzy są powiązani poprzez abstrakcyjną specyfikację

interfejsów/klas.

(10)

Obserwator a Model-View-Controler

Obserwator a Model-View-Controler

Model View

Controler

(11)

Model-View-Controler a Design Patterns

Model-View-Controler a Design Patterns

Model View

Controler

(12)

Model-View-Controler a Design Patterns

Model-View-Controler a Design Patterns

Model View

Controler

(13)

Obserwator, ogólny schemat UML

Obserwator, ogólny schemat UML

Subject +addObserver( Observer o ) +deleteObserver( Observer o ) +deleteObservers() +notifyObservers() -observers: List<Observer> Observer +update( Subject s ) operacja() { foreach o in observers o.update( this ); } ConcreteObserver1 +update( Subject s ) ConcreteObserverN +update( Subject s ) ConcretSubject +setState( State s ) +getState() : State -state: State

(14)

Kompozyt, schemat UML, przykład

Kompozyt, schemat UML, przykład

Subject +addObserver( Observer o ) +deleteObserver( Observer o ) +deleteObservers() +notifyObservers() -observers: List<Observer> Observer +update( Subject s ) operacja() { foreach o in observers o.update( this ); } CurrencyWallet +update( Subject s ) PriceList +update( Subject s )

+setEuroExchangeRate( double value ) +getEuroExchangeRate() :

double-euroExchangeRate: double

CurrencyRateTable ProfitChart

(15)

Przykładowa implementacja

Przykładowa implementacja

obserwatora

obserwatora

w języku Java

w języku Java

(16)

Elementy abstrakcyjne, obserwator, pierwsza przymiarka

Elementy abstrakcyjne, obserwator, pierwsza przymiarka

interface Observer

{

public void update( Subject s ); }

interface Observer

{

public void update( Subject s ); }

(17)

Elementy abstrakcyjne, podmiot

Elementy abstrakcyjne, podmiot

class Subject

{

public void addObserver( Observer o ) {

observers.add( o ); }

public void deleteObserver( Observer o ) {

observers.remove( o ); }

public void deleteObservers() {

observers.clear(); }

public void notifyObservers() {

for( Observer o : observers ) o.update( this );

}

protected ArrayList<Observer> observers = new ArrayList(); }

class Subject

{

public void addObserver( Observer o ) {

observers.add( o ); }

public void deleteObserver( Observer o ) {

observers.remove( o ); }

public void deleteObservers() {

observers.clear(); }

public void notifyObservers() {

for( Observer o : observers ) o.update( this );

}

protected ArrayList<Observer> observers = new ArrayList(); }

(18)

Elementy konkretne, podmiot

Elementy konkretne, podmiot

class CurrencyRateTable extends Subject

{

CurrencyRateTable( double value ) {

euroExchangeRate = value;

}

public void setEuroExchangeRate( double value ) {

euroExchangeRate = value; notifyObservers();

}

public double getEuroExchangeRate() {

return euroExchangeRate; }

private double euroExchangeRate; }

class CurrencyRateTable extends Subject

{

CurrencyRateTable( double value ) {

euroExchangeRate = value;

}

public void setEuroExchangeRate( double value ) {

euroExchangeRate = value; notifyObservers();

}

public double getEuroExchangeRate() {

return euroExchangeRate; }

private double euroExchangeRate; }

(19)

Elementy konkretne, obserwatorzy, problem

Elementy konkretne, obserwatorzy, problem

class CurrencyWallet implements Observer {

public void update( Subject s ) {

System.out.println( "CurrencyWallet recived: " + ; }

}

class ProfitChart implements Observer {

public void update( Subject s ) {

System.out.println( "ProfitChart recived: " + }

}

class PriceList implements Observer {

public void update( Subject s ) {

System.out.println( "PriceList recived: " + }

}

class CurrencyWallet implements Observer {

public void update( Subject s ) {

System.out.println( "CurrencyWallet recived: " + ; }

}

class ProfitChart implements Observer {

public void update( Subject s ) {

System.out.println( "ProfitChart recived: " + }

}

class PriceList implements Observer {

public void update( Subject s ) {

System.out.println( "PriceList recived: " + }

}

? getEuroExchangeRate ?

? getEuroExchangeRate ?

(20)

Elementy konkretne, obserwatorzy, nieeleganckie rozwiązanie

Elementy konkretne, obserwatorzy, nieeleganckie rozwiązanie

class CurrencyWallet implements Observer {

public void update( Subject s ) {

System.out.println( "CurrencyWallet recived: " +

((CurrencyRateTable)s).getEuroExchangeRate() ); }

}

class ProfitChart implements Observer {

public void update( Subject s ) {

System.out.println( "ProfitChart recived: " +

((CurrencyRateTable)s).getEuroExchangeRate() ); }

}

class PriceList implements Observer {

public void update( Subject s ) {

System.out.println( "PriceList recived: " +

((CurrencyRateTable)s).getEuroExchangeRate() ); }

}

class CurrencyWallet implements Observer {

public void update( Subject s ) {

System.out.println( "CurrencyWallet recived: " +

((CurrencyRateTable)s).getEuroExchangeRate() ); }

}

class ProfitChart implements Observer {

public void update( Subject s ) {

System.out.println( "ProfitChart recived: " +

((CurrencyRateTable)s).getEuroExchangeRate() ); }

}

class PriceList implements Observer {

public void update( Subject s ) {

System.out.println( "PriceList recived: " +

((CurrencyRateTable)s).getEuroExchangeRate() ); }

(21)

Elementy konkretne, obserwatorzy, lepsze rozwiązanie

Elementy konkretne, obserwatorzy, lepsze rozwiązanie

class CurrencyWallet implements Observer

{ CurrencyWallet( CurrencyRateTable s ) { subject = s; }

public void update( Subject s ) {

if( s == subject )

System.out.println( "CurrencyWallet recived: " + subject.getEuroExchangeRate() ); }

private CurrencyRateTable subject = null; }

class CurrencyWallet implements Observer

{ CurrencyWallet( CurrencyRateTable s ) { subject = s; }

public void update( Subject s ) {

if( s == subject )

System.out.println( "CurrencyWallet recived: " + subject.getEuroExchangeRate() ); }

private CurrencyRateTable subject = null; }

(22)

Przykład wykorzystania

Przykład wykorzystania

CurrencyRateTable table = new CurrencyRateTable( 4.30 );

PriceList pl = new PriceList( table );

ProfitChart pc = new ProfitChart( table );

CurrencyWallet cw = new CurrencyWallet( table ); table.addObserver( pl ); table.addObserver( pc ); table.addObserver( cw ); table.setEuroExchangeRate( 4.50 ); table.setEuroExchangeRate( 4.20 ); table.setEuroExchangeRate( 4.30 );

CurrencyRateTable table = new CurrencyRateTable( 4.30 );

PriceList pl = new PriceList( table );

ProfitChart pc = new ProfitChart( table );

CurrencyWallet cw = new CurrencyWallet( table ); table.addObserver( pl ); table.addObserver( pc ); table.addObserver( cw ); table.setEuroExchangeRate( 4.50 ); table.setEuroExchangeRate( 4.20 ); table.setEuroExchangeRate( 4.30 ); PriceList recived: 4.5 ProfitChart recived: 4.5 CurrencyWallet recived: 4.5 PriceList recived: 4.2 ProfitChart recived: 4.2 CurrencyWallet recived: 4.2 PriceList recived: 4.3 ProfitChart recived: 4.3 CurrencyWallet recived: 4.3

(23)

Observable – Java

Observable – Java

(24)

Observer – Java

Observer – Java

Cytaty

Powiązane dokumenty

12) pozwoleniu na budowę – należy przez to rozumieć decyzję administracyjną zezwalającą na rozpoczęcie i prowadzenie budowy lub wykonywanie robót budowlanych innych

2. Na zasadzie odstępstwa od art. 2, właściwe organy Państw Członkowskich, wymienione w załączniku II, mogą zezwolić na uwolnienie lub udostępnienie niektórych

Jeśli zaczynasz i / lub nie masz gotowego źródła pracy, może to być dobry zakład, ale pamiętaj, że stawki, których możesz się spodziewać, mogą być niższe niż te, które

Mistrz mawiał; Z tej drogi nie można zejść. Człowiek ściga drogę, ale ona tędy nie prowadzi. Księga pieśni mówi: Rąbiesz siekierą i jeszcze raz rąbiesz siekierą, a

Równoważność z zaświadczeniami stwierdza się zgodnie z procedurą określoną w art. Ogólne zasady dotyczące interpretacji Nomenklatury Scalonej, jak również szczegółowe

Co jest więc wyjątkowego w mniszku pospolitym? Uzasadniając podjęcie badań Doktorantka powołuje się na istniejące analizy prc)filu fitochemicznego poszczególnych organów

zmieniające rozporządzenie (WE) nr 27/2005 w zakresie możliwości połowowych na wodach Grenlandii, Wysp Owczych i Islandii oraz połowów dorsza w Morzu Północnym, a także

(30) Mając na uwadze ograniczony wpływ cła na koszt wytwarzania stopów aluminium w UE-10 oraz istnienie innych źródeł podaży w odniesieniu do UE-10, stwierdzono, iż