Pola Observer
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan R di Coddy. Pelajaran 44 dari 57.
Pola observer memungkinkan sebuah object, yaitu subject, memberi tahu kode lain saat sesuatu terjadi tanpa mengetahui siapa yang mendengarkan. Subject menyimpan list fungsi callback, yaitu para observer, lalu memanggil setiap fungsi pada setiap peristiwa:
make_subject <- function() {
observers <- list()
list(
subscribe = function(f) observers[[length(observers) + 1]] <<- f,
notify = function(event) for (f in observers) f(event)
)
}
button <- make_subject()
button$subscribe(function(e) cat("logger saw", e, "\n"))
button$subscribe(function(e) cat("counter saw", e, "\n"))
button$notify("click")Output:
logger saw click
counter saw click Observer dapat berupa closure dengan state-nya sendiri. Observer ini menghitung peristiwa yang telah dilihatnya, sementara subject tidak mengetahui apa pun tentang penghitungan:
make_subject <- function() {
observers <- list()
list(subscribe = function(f) observers[[length(observers) + 1]] <<- f,
notify = function(event) for (f in observers) f(event))
}
make_counter <- function() {
n <- 0
list(observe = function(event) n <<- n + 1, count = function() n)
}
door <- make_subject()
c1 <- make_counter()
door$subscribe(c1$observe)
for (e in c("open", "close", "open")) door$notify(e)
print(c1$count())Output:
[1] 3Menyimpan observer dengan nama memungkinkan kamu berhenti berlangganan. observers[[name]] <<- NULL menghapus satu observer, dan observer lainnya tetap menerima event:
make_subject <- function() {
observers <- list()
list(
subscribe = function(name, f) observers[[name]] <<- f,
unsubscribe = function(name) observers[[name]] <<- NULL,
notify = function(event) for (f in observers) f(event)
)
}
s <- make_subject()
s$subscribe("ada", function(e) cat("ada:", e, "\n"))
s$subscribe("bo", function(e) cat("bo:", e, "\n"))
s$notify("first")
s$unsubscribe("ada")
s$notify("second")Output:
ada: first
bo: first
bo: second Subject menentukan data yang dibawa oleh suatu peristiwa. Pencatat harga mengirimkan harga lama dan harga baru, serta memberi tahu hanya ketika harga benar-benar berubah:
make_ticker <- function(price) {
observers <- list()
list(
subscribe = function(f) observers[[length(observers) + 1]] <<- f,
set_price = function(new) {
if (new == price) return(invisible(NULL))
old <- price
price <<- new
for (f in observers) f(old, new)
}
)
}
t <- make_ticker(10)
t$subscribe(function(old, new) cat("price", old, "->", new, "\n"))
for (p in c(12, 12, 9)) t$set_price(p)Output:
price 10 -> 12
price 12 -> 9 Tantangan
MudahLengkapi factory make_newsletter() di Newsletter.R. Factory ini menyimpan callback pembacanya dalam list bernama privat dan mengembalikan tiga fungsi:
subscribe(name, f)menyimpan callback dengan nama tersebut, jika berlangganan lagi, callback sebelumnya akan diganti;unsubscribe(name)menghapusnya;publish(title)memanggil setiap callback dengan judul tersebut sesuai urutan berlangganan, lalu mengembalikan jumlah pembaca yang diberi tahu.
Kode yang disediakan membaca perintah sub ada, unsub ada, dan post Big news, lalu memberi setiap pembaca callback yang mencetak ada got: Big news. Untuk setiap postingan, kode ini mencetak judul, baris dari callback, dan jumlah pembaca yang diberi tahu.
Tulis kodemu di Newsletter.R. main.R berisi kode input/output yang disediakan dan tidak boleh diedit.
Coba sendiri
source("Newsletter.R")
# Kode input/output yang disediakan: biarkan apa adanya
input <- suppressWarnings(readLines(file("stdin")))
news <- make_newsletter()
reader <- function(name) {
force(name)
function(title) cat(" ", name, " got: ", title, "\n", sep = "")
}
for (line in input) {
p <- strsplit(line, " ")[[1]]
if (p[1] == "sub") news$subscribe(p[2], reader(p[2]))
if (p[1] == "unsub") news$unsubscribe(p[2])
if (p[1] == "post") {
title <- paste(p[-1], collapse = " ")
cat("post: ", title, "\n", sep = "")
n <- news$publish(title)
cat(" notified ", n, "\n", sep = "")
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Object
1Dasar S3
Bekerja dengan fileList dengan classFungsi KonstruktorMethod print dan formatValidator dan helperUlasan: Suhu4Enkapsulasi di R
Closure sebagai objectEnvironment sebagai objectFungsi accessorMelindungi stateRangkuman: Meter Parkir2S3 Generics dan Method
Generics dan UseMethodMethod DefaultMethod untuk Base GenericsDasar-Dasar NextMethodRekap: Luas Bangun5S4 class
Mendefinisikan class S4Slots dan AksesPemeriksaan ValiditasMethod showRingkasan: Katalog Produk8Kelas Referensi
Mendefinisikan Kelas ReferensiPembaruan method dan fieldSemantik PenyalinanPewarisan dan callSuperRangkuman: Antrean Tugas11Proyek: Manajemen Perpustakaan
Buku dan AnggotaMeminjam BukuLatihan sendiri: Compiler R online