Observer 패턴

Assist·2023년 7월 23일
0

Design Pattern

목록 보기
3/7

Observer 패턴이란 ?

옵저벼 패턴은 객체의 상태를 변활하는 관차자들을 등록하여 데이터 변환 했을시 해당 관찰을 등록했던 view에게 알려주는 것입니다.

왜 Observer 패턴인가 ?

자세히는 이야기를 못하지만 제가 근무하고 있는 회사에서 하는 프로젝트의 일입니다.

Android 와 다수의 디바이스가 매칭이 되어 디바이스가 정보를 보내면 Android 에서 데이터를 처리후 view로 보여주는 앱이 필요하다고 했습니다.

당시 전

Assist : 음 이걸 어떻게 하지 모든 Android에서 각각의 디바이스을 매칭하고 view에 매칭하면 
코드가 너무 복잡해질거 같은데 ... .

사수 : ?  걍 Observer 패턴 써? 
Assist:  어? 

뭐 이런식 이지요

그럼 한번 구현해 보도로 하겠습니다.

구현 환경

  • IDE : Android Studio
  • Langauge : kotlin
  • OS : Android

일단 데이터를 파싱 하는 클래스를 만들어 보겠습니다.

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 은 데이터 파싱작업이 끝나고 알람을 보내는 용도 입니다.

어때요? 이해 하셨나요 ?

그럼 오늘도 읽어주셔서 감사합니다
-피드백와 비판은 언제나 환영입니다-

profile
안드로이드만 좋아하는 특이한 개발자

1개의 댓글

comment-user-thumbnail
2023년 7월 23일

유익한 글이었습니다.

답글 달기