POSA 1 – 레이어(Layers) 패턴

레이어(Layers) 패턴을 간단하게 말하면, 복잡한 시스템을 레이어로 나눠서 작업(Task)를 하위 레이어나 상위 레이어로 전달(Delegation)하도록 구조화하는 패턴이다.

이 패턴을 간단하게 코드로 만들어 보자. 탑-다운(Top-Down)은 개별 레이어 인터페이스가 필요할 것이고, 각 레이어의 개별 인터페이스는 구현 클래스(Level0201, Level0202)에서 구현해서 상위 레이어가 하위 레이어에 의존하는 것을 줄인다. 그리고, Bottom-Up은 상속을 사용해서 상위 클래스의 메서드를 호출하는 형태로 구현한다.

1. 탑 다운(Top-Down) 레이어(Layer)

– Level01.java

package layer.down;
import java.nio.ByteBuffer;

public class Level01 {
    ByteBuffer buffer;
    Level02Interface levelTwo; // Level02-1 
    
    public void setByteBuffer(ByteBuffer buffer) {
        this.buffer = buffer;
    }
    
    public void setLevel() {
        this.levelTwo = new Level0201();
    }
   

    public void printLevel() {
        if(buffer.getInt() == 4)
            this.levelTwo = new Level0202();
        
        System.out.println(“Level01 printLevel() called”);
        this.levelTwo.foo();        
    }
}

– Level02Interface.java

package layer.down;
public interface Level02Interface {
    public void foo();
}

– Level0201.java

package layer.down;
public class Level0201 implements Level02Interface {

    @Override
    public void foo() {
        // TODO Auto-generated method stub
        System.out.println(“Level0201 printLevel() called”);
    }
}

– Level0202.java

package layer.down;
public class Level0202 implements Level02Interface {

    @Override
    public void foo() {
        // TODO Auto-generated method stub
        System.out.println(“Level0202 printLevel() called”);
    }
}

– 클라이언트

ByteBuffer buffer = ByteBuffer.allocate(4);
buffer.putInt(4);
buffer.flip();

Level01 layer = new Level01();
layer.setByteBuffer(buffer);
layer.setLevel();
layer.printLevel();   

2. Bottom-Up 레이어

– SLevel01.java

package layer.up;
public class SLevel01 {
    
    //
    public void read(java.nio.ByteBuffer buffer) {
        System.out.println(“level01 – “+ buffer.getInt());
    }
}

– SLevel02.java

package layer.up;
public class SLevel02 extends SLevel01 {

    @Override
    public void read(java.nio.ByteBuffer buffer) {
        System.out.println(“level02 – ” + buffer.getInt());
        
        super.read(buffer);
    }
}

– 클라이언트

ByteBuffer buffer = ByteBuffer.allocate(8);
buffer.putInt(4);
buffer.putInt(100);
buffer.flip();

SLevel02 layer = new SLevel02();
layer.read(buffer);   

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.