코딩성장스토리

스프링 이해를 위한 디자인 패턴 본문

백 엔드/spring

스프링 이해를 위한 디자인 패턴

까르르꿍꿍 2022. 4. 8. 17:47

어댑터 패턴(Adapter Pattern)

변환기 , 즉 서로 다른 두 인터페이스 사이에 통신이 가능하게 하는 것

호출당하는 쪽의 메서드를 호출하는 쪽의 코드에 대응하도록 중간에 변환기를 통해 호출하는 패턴

ex) 두 클래스 메서드가 같은 기능을 할때 이를 어댑터를 이용해서 같은 메서드 호출로 다른 객체 메서드를 부르게함

 

public class AdapterServiceA{
	ServiceA sa1=new ServiceA();
    void run(){
    sa1.runA;
    }
}
public class AdapterServiceB{
	ServiceB sa1=new ServiceB();
    void run(){
    sa1.runB;
    }
}
public class AdapterClient{
	AdapterServiceA asa1= new AdapterServiceA();
	AdapterServiceB asb1= new AdapterServiceB();
    
    asa1.run();
    asb1.run();            //동일한 메서드 명으로 두 객체의 메서드 호출
}

프록시 패턴(Proxy Pattern)

제어 흐름을 조정하기 위한 목적으로 중간에 대리자를 두는 패턴

  • 대리자는 실제 서비스와 같은 이름의 메서드를 구현, 이때 인터페이스 사용
  • 대리자는 실제 서비스에 대한 참조변수를 갖는다.
  • 대리자는 실제 서비스와 같은 이름을 가진 메서드를 호출하고 그 값을 클라이언트에게 돌려준다.
  • 대리자는 실제 서비스의 메서드 호출 전후에 별도의 로직 수행 가능
public interface IService{
	String runSomething();
}
public class Service implements Iservice{
	public String run(){
    	return "서비스 짱!!"
    }
}
public class Proxy implements Iservice{
	IService service1;
	public String run(){
    	System.out.println("호출에 대한 제어 흐름 주목적 반환 결과는 그대로);
    	service1=new Service();
        return service1.run();
    }
}

데코레이터 패턴(Decorator Pattern)

원본에 장식을 더하는 패턴, 프록시 패턴이랑 동일하나 반환값을 조작해서 반환함.즉 장식을 덧입한다.

public interface IService{
	String runSomething();
}
public class Service implements Iservice{
	public String run(){
    	return "서비스 짱!!"
    }
}
public class Proxy implements Iservice{
	IService service1;
	public String run(){
    	System.out.println("호출에 대한 제어 흐름 주목적 반환 결과는 그대로);
    	service1=new Service();
        return "정말" + service1.run();
    }
}

싱글턴 패턴(Singleton)

인스턴스를 하나만 만들어 사용하기 위한 패턴

  • new를 실행할 수 없도록 생성자에 private 접근 제어자를 지정한다.
  • 유일한 단일 객체를 반환할 수 있는 정적 메서드가 필요하다
  • 유일한 단일 객체를 참조할 정적 참조 변수가 필요
public class Singleton{
	static Singleton singletonObject;
    private Singleton(){};
    
    public static Singleton getInstance(){
    	if(SingletonObject == null){
        	singletonObject = new Singleton();
        }
        
        return singletonObject;
]

템플릿 메서드 패턴(Template Method pattern)

상위 클래스의 견본 메서드에서 하위 클래스가 오버라이딩한 메서드를 호출하는 패턴

public abstract class Animal{

	//템플릿 메서드
	public void platWithOwner(){
    	System.out.println("come");
        play();
        runSomething();
        System.out.println("good);
    }
    // 추상 메서드
    abstract void play();
    //훅(hook) 메서드
    void runSomething(){
    	System.out.println("꼬리 살랑살랑");
    }
}

팩터리 메서드 패턴(Factory Method Pattern)

객체를 생성 반환하는 메서드

오버라이드된 메서드가 객체를 반환하는 패턴

public abstract class Animal(){
	//추상 팩터리 메서드
    abstract AnimalToy getToy();
}
//팩터리 메서드가 생성할 객체의 상위 클래스
public abstract class AnimalToy{
	abstract void identift()'
}
public class Dog extends Animal{
	//추상 팩터리 메서드 오버라이딩
    @Override
    AnimalToy getToy(){
    	return new DogToy();
    }
}

전략 패턴(Strategy Pattern)

클라이언트가 전략을 생성해 전략을 실행할 컨텍스트에 주입하는 패턴

템플릿 메서드 패턴과 유사 차이는 객체 주입이나 상속이냐 임

public interface Strategy{
	public abstract void runStrategy();
}
//전략
public class StrategyGun implements Strategy{
	@Override
    public void runStrategy(){
    	System.out.println("탕")";
    }
}
//전략
public class StrategyBow implements Strategy{
	@Override
    public void runStrategy(){
    	System.out.println("슝")";
    }
}
//컨텍스트
public class Soilder{
	void runContext(Strategy strategy){
    	System.out.pringtln("start");
        strategy.runStrategy();
        System.out.pringtln("finish");
    }
}

템플릿 콜백 패턴(Template Callback Pattern)

전략 패턴이랑 동일하나 이것은 전략을 익명 내부 클래스로 정의

public class Soilder{
	void runContext(Strategy strategy){
    	System.out.pringtln("start");
        strategy.runStrategy();
        System.out.pringtln("finish");
    }
    
    private Strategy executeWeapon(final String weaponSound){
    	return new Strategy(){
        	@Override
            public void runStrategy(){
            	System.out.println("weaponSound")
            }
        };
   }
}