옵저벼 패턴은 객체의 상태를 변활하는 관차자들을 등록하여 데이터 변환 했을시 해당 관찰을 등록했던 view에게 알려주는 것입니다.
자세히는 이야기를 못하지만 제가 근무하고 있는 회사에서 하는 프로젝트의 일입니다.
Android 와 다수의 디바이스가 매칭이 되어 디바이스가 정보를 보내면 Android 에서 데이터를 처리후 view로 보여주는 앱이 필요하다고 했습니다.
당시 전
Assist : 음 이걸 어떻게 하지 모든 Android에서 각각의 디바이스을 매칭하고 view에 매칭하면
코드가 너무 복잡해질거 같은데 ... .
사수 : ? 걍 Observer 패턴 써?
Assist: 어?
뭐 이런식 이지요
그럼 한번 구현해 보도로 하겠습니다.
일단 데이터를 파싱 하는 클래스를 만들어 보겠습니다.
open class Parsing {
var devcieName : String = ""
var macAddress : String = ""
var packet : ByteArray ? = null
oepn fun parsingData(data : ScanResult) {
deviceName = data.device.name.toString()
macAddress = data.device.address
packet = data.scanRecord?.bytes
}
일단 공통적으로 필요한 BLE 정보를 부모의 클래스에서 값을 할당해 줍니다.
calss detailParsing() : Parsing(){
val data2 :String = ""
val data3 : String = ""
override fun parsingData(data : ScanResult){
super.parsingData(data)
data2 = parsingData2(data)
data3 = parsingData3(data)
}
private fun parsingData2(data :ScanResult){
~~~~
}
private fun parsingData3(Data : ScanResult){
~~~~
}
이런식으로 자식 클래스에서 세부적으로 parsing을 한다고 가정하겠습니다.
자 Parsing 도 끝났으니 그럼 이제 데이터가 변환 했다는 것을 알려야 겠지요 Parsing 클래스에 추가로 Observer을 달겠습니다.
interface 을 선언하겠습니다.
interface observer {
fun update(message : observerMessage)
}
class observerMessage ( var src : Any, var message : String ) {
}
그후 메세지를 받을 view 혹은 클래스에 extends 을 해주겠습니다.
class velogFragment : Framgnet() , observer {
override fun update(message : observerMessage){
}
그럼 이제 파싱 클래스에 ovserber 추가 , 제거 , send 을 함수를 만들겠습니다.
calss detailParsing() : Parsing(){
val data2 :String = ""
val data3 : String = ""
private val observerList = ArrayList<observer>()
override fun parsingData(data : ScanResult){
super.parsingData(data)
data2 = parsingData2(data)
data3 = parsingData3(data)
notifiyUpdate(observerMessage("아무거나 " , "여기는 사용자가 메세지 보낼꺼" ))
}
private fun parsingData2(data :ScanResult){
~~~~
}
private fun parsingData3(Data : ScanResult){
~~~~
}
fun addObserver(value : observer){
observerList.add(value)
}
fun removeObserver(value : observer){
observerList.remove(value)
}
private fun notifyUpdate(message : PropertiesChangeMessage){
Handler(Looper.getMainLooper()).post{
for (item in observerList) {
item.update(message)
}
}
}
addObserver은 데이터 변환시 알림을 받아야 하기때문에 추가한것이고
removeObserver은 view나 class가 더이상 활동을 안하고 사라질시 observer가 필요 없음으로 remove 하기 위해 만들었으며
notifiyUpdate 은 데이터 파싱작업이 끝나고 알람을 보내는 용도 입니다.
어때요? 이해 하셨나요 ?
그럼 오늘도 읽어주셔서 감사합니다
-피드백와 비판은 언제나 환영입니다-
유익한 글이었습니다.