POSA 1 – Layers Pattern

간단하게 말하면 복잡한 시스템을 레이어로 나눠서 Task를 하위 레이어 또는 상위 레이어로의 Delegation을 통해서 구조화를 하는 패턴이라고 생각이 듭니다.

제가 생각하는 내용을 아래의 형태별로 간단하게 코드로 끄적여 봅니다.
아래의 top-down은 layer별 interface가 필요할 것 같고, 그 인터페이스를 layer에 해당하는 기능 클래스(Level0201, Level0202)가 구현을 해서 상위 Layer가 하위 Layer에 Dependency를 줄이면서 사용하면 될 것 같습니다.
그리고, 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 Layer 형태

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);   

답글 남기기

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