'null object pattern'에 해당되는 글 1건

  1. Null Object Pattern (2) 2009/09/17

Null Object Pattern

from Ooad 2009/09/17 17:35
Null Object Pattern 또는 Null Object라고 하는 내용은 NullReference를 방지하기 위해서 더미(?) 객체를 미리 만들어 넣고 기능을 제공하는 핸들러에 바인딩 되어 있는 타입의 객체(실 기능 구현 객체)가 널인지를 체크해서 NullPointerException을 방지하기 위한 패턴이더군요.. 마틴 파울러님의 Introduce Null Object에서도 동일한 내용이 나옵니다...
한글로 설명하는 것보다, 코드로 보면 더 간단하게 보실 수 있습니다.

예제에서의 핵심은 이 코드입니다..
 /**
  * return logger
  * @return
  */
 public ILogger getLogger() {
  if(this.logger == null)
   return NullLogger.getInstance();
  
  return this.logger;
 }


아래는 로그를 남기는 예제코드입니다.

package net.sjava.patterns.nullobject;

/**
 *
 * @author mcsong@gmail.com
 * @since 2009. 9. 17.
 */
public interface ILogger {
 
 /**
  *
  * @param log
  */
 public void log(String log);
}

 

package net.sjava.patterns.nullobject;

/**
 *
 * @author mcsong@gmail.com
 * @since 2009. 9. 17.
 */
public class FileLogger implements ILogger {

 @Override
 public void log(String log) {
  System.out.println("file log - " + log);
 }
}

 

package net.sjava.patterns.nullobject;

/**
 *
 * @author mcsong@gmail.com
 * @since 2009. 9. 17.
 */
public class NullLogger implements ILogger {
 
 /**
  * singleton instance
  */
 private static final NullLogger instance = new NullLogger();

 /**
  *
  */
 private NullLogger() {
 
 }

 /**
  * return singleton instance
  * @return
  */
 public static NullLogger getInstance() {
  return NullLogger.instance;
 }
 
 @Override
 public void log(String log) {
  // TODO Auto-generated method stub
  System.out.println("null log - " + log);
 }
}

 

package net.sjava.patterns.nullobject;

/**
 *
 * @author mcsong@gmail.com
 * @since 2009. 9. 17.
 */
public class SocketLogger implements ILogger {

 @Override
 public void log(String log) {
  // TODO Auto-generated method stub
  System.out.println("socket log - " + log);
 }
}

 

package net.sjava.patterns.nullobject;

/**
 *
 * @author mcsong@gmail.com
 * @since 2009. 9. 17.
 */
public class LoggerHandler {

 /**
  * type
  */
 private ILogger logger;
 
 /**
  * constructor
  * @param logger
  */
 public LoggerHandler(ILogger logger) {
  this.logger = logger;
 }
 
 /**
  * return logger
  * @return
  */
 public ILogger getLogger() {
  if(this.logger == null)
   return NullLogger.getInstance();
  
  return this.logger;
 }
 
 /**
  *
  * @param log
  */
 public void log(String log) {
  this.getLogger().log(log);
 }
 
 /**
  *
  * @param logger
  * @param log
  */
 public void log(ILogger logger, String log) {
  this.logger = logger;
  this.log(log);
 }
}

 

import net.sjava.patterns.nullobject.FileLogger;
import net.sjava.patterns.nullobject.SocketLogger;
import net.sjava.patterns.nullobject.LoggerHandler;

public class NullObjectTest {
 /**
  * handler
  */
 private static LoggerHandler handler;
  
 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  
  handler = new LoggerHandler(null);
  handler.log("fileloggger");

  handler = new LoggerHandler(new FileLogger());
  handler.log("socketloggger");
  
  handler = new LoggerHandler(new SocketLogger());
  handler.log("socketloggger");
 }
}


'Ooad' 카테고리의 다른 글

OOP 설계 5원칙  (2) 2010/07/19
Singleton Pattern  (0) 2010/04/29
Null Object Pattern  (2) 2009/09/17
Specification Pattern  (2) 2009/09/16
디자인 패턴 그리고 그 이후..  (0) 2009/09/16