SELF STUDY/Design Pattern

[Design Pattern] 어댑터 패턴 | Adapter Pattern

호이호이호잇 2021. 12. 20. 14:39
728x90
반응형

사람이 "탈"을 쓰고 피카추가 되듯.. 이것이 어댑터 패턴..!?

 

먼저, 위키 백과가 정의 하고 있는 어댑터 패턴은


 

어댑터 패턴(Adapter pattern)은 클래스 인터페이스를 사용자가 기대하는 다른 인터페이스로 변환하는 패턴으로, 호환성이 없는 인터페이스 때문에 함께 동작할 수 없는 클래스들이 함께 작동하도록 해준다.

(출처 :위키백과)


 

쉽게 말하면 ...

어댑터 패턴은 위의 짤에 나오는 인형탈과 같이 사람 어떤 캐릭터를 표현하고자 할 때 사용하는 것!!

이렇게 A B의 역할을 하길 원할떄, 사용하는 것이 어댑터 패턴으로 생각하면 쉬울 것 같다.

 


 

오리와 가짜 오리, 가짜 오리가 오리처럼 행동하는 것을 어댑터 패턴에 적용시켜 보았다.

오리는 날수 있고, 꿱! 하고 말을 한다. 

말을 하는 것, 나는 것으로 각 오리, 가짜 오리를 구성하게끔 만들었다.

 

이것을 안드로이드 앱으로 구현을 해보았다.

 

구현한 앱 설명

앱 화면이다.

해당하는 것의 버튼을 누르면, 나는 것과 말을 하는 것에 대한 결과가 보여진다.

 

소스를 보면...

 

< 오리 >

interface DuckInterface{
    public String quack();
    public String fly();
}
class Duck implements DuckInterface{

    @Override
    public String quack() {
        return "Quack! Quack!";
    }

    @Override
    public String fly() {
        return "I can fly!";
    }
}

 

< 가짜 오리 >

interface FakeDuckInterface{
    public String fakeQuack();
    public String fakeFly();
}
class FakeDuck implements FakeDuckInterface{

    @Override
    public String fakeQuack() {
        return "Fake Quack!";
    }

    @Override
    public String fakeFly() {
        return "I  can't fly!";
    }
}

 

< 가짜 오리를 진짜 오리처럼 보이게 >

class FakeDuckToDuckAdapter extends Duck {
    FakeDuck fakeDuck;

    public FakeDuckToDuckAdapter(FakeDuck fakeDuck) {
        this.fakeDuck = fakeDuck;
    }

    @Override
    public String quack() {
        return fakeDuck.fakeQuack();
    }

    @Override
    public String fly() {
        return fakeDuck.fakeFly();
    }
}

 

이것들을 다 합쳐서 보면..!

 

< 전제 소스 >

package com.designpattern.adapter;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class AdapterActivity extends Activity implements View.OnClickListener {

    TextView mFlyTextView;
    TextView mQuackTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_adapter);

        init();
    }

    private void init(){
        Button btnDuck = findViewById(R.id.buttonDuck);
        btnDuck.setOnClickListener(this);

        Button btnFakeDuck = findViewById(R.id.buttonFakeDuck);
        btnFakeDuck.setOnClickListener(this);

        Button btnFakeDuckToDuck = findViewById(R.id.buttonFakeDuckToDuck);
        btnFakeDuckToDuck.setOnClickListener(this);

        mFlyTextView = findViewById(R.id.flyTextView);
        mQuackTextView = findViewById(R.id.quackTextView);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.buttonDuck:
                Duck duck = new Duck();
                mFlyTextView.setText(duck.fly());
                mQuackTextView.setText(duck.quack());
                break;
            case R.id.buttonFakeDuck:
                FakeDuck fakeDuck = new FakeDuck();
                mFlyTextView.setText(fakeDuck.fakeFly());
                mQuackTextView.setText(fakeDuck.fakeQuack());
                break;
            case R.id.buttonFakeDuckToDuck:
                Duck fakeDuckToDuck = new FakeDuckToDuckAdapter(new FakeDuck());
                mFlyTextView.setText(fakeDuckToDuck.fly());
                mQuackTextView.setText(fakeDuckToDuck.quack());
                break;
        }
    }


}

interface DuckInterface{
    public String quack();
    public String fly();
}
class Duck implements DuckInterface{

    @Override
    public String quack() {
        return "Quack! Quack!";
    }

    @Override
    public String fly() {
        return "I can fly!";
    }
}

interface FakeDuckInterface{
    public String fakeQuack();
    public String fakeFly();
}
class FakeDuck implements FakeDuckInterface{

    @Override
    public String fakeQuack() {
        return "Fake Quack!";
    }

    @Override
    public String fakeFly() {
        return "I  can't fly!";
    }
}

class FakeDuckToDuckAdapter extends Duck {
    FakeDuck fakeDuck;

    public FakeDuckToDuckAdapter(FakeDuck fakeDuck) {
        this.fakeDuck = fakeDuck;
    }

    @Override
    public String quack() {
        return fakeDuck.fakeQuack();
    }

    @Override
    public String fly() {
        return fakeDuck.fakeFly();
    }
}

 

동작 동영상 입니다.

 

728x90
반응형