오늘이군
디자인패턴 요약 본문
1. 추천 글
http://jusungpark.tistory.com/category/DesignPattern
https://www.youtube.com/watch?v=w9rZCy90Q4M
2. 개요
가. 사전지식 : 상속, 인터페이스, 합성(다른 객체를 속성으로 가짐), 위임
----------------> 참고(개인경험) : 디자인패턴이 어려운이유는 OO특성/SOLID 에 대해 제대로 이해가 안되서 그렇습니다. (step by step)
나. 종류
1) Creational Patterns(생성 패턴)
Singleton / Prototype / Builder / Factory Method / Abstract Factory
2) Structural Pattenrs(구조 패턴)
Proxy / Adapter / Bridge / Composite / Decorator / Facade / Flyweight
3) Behavioral Patterns(행동 패턴)
Chain of Responsibility / Command / Interpreter / Iterator / Mediator / Memento / Observer / State / Strategy / Template Method / Visitor
3. Adapter (변환기) 패턴
가. 다른서비스가 제공하는 클래스가 기존시스템과 규격이 다른 경우 중간에 대리자를 두는 패턴
나. 예시 (객체 어댑터 패턴)
public class Adaptee {
public void specificRequest() { print("specificRequest"); }
}
public interface Target {
public void request();
}
public class Adapter implements Target {
Adaptee adt = new Adaptee();
public void request() {
adt.specificRequest();
}
}
public class Client {
public static void main(String[] args) {
Target target = new Adapter();
target.request();
}
}
4. Proxy (대리자) 패턴
가. 서비스가 제공하는 규격에 별도의 로직을 처리해서 제공하고 싶을 때 제어 흐름을 조정하기 위한 목적으로 중간에 대리자를 두는 패턴
나. 예시
1) 적용 전
public class ClientWithNoProxy {
Service service = new Service();
service.runSomething();
}
2) 적용
public interface IService() { String runSomething(); }
public class Service implements IService {
public String runSomething() { return "good"; }
}
public class Proxy implements IService {
IService service1;
public String runSomething() {
print("호출에 대한 흐름 제어가 주목적, 추가 로직 삽입");
service1 = new Service();
print("추가 로직 삽입");
return service1.runSomething();
}
}
public class ClientWithProxy {
IService proxy = new Proxy();
proxy.runSomething();
}
5. Decorator (장식자) 패턴
가. 서비스가 제공하는 규격에 장식을 더해서 반환하고 싶을 때 메소드 호출의 반환값에 변화를 주기 위해 중간에 장식자를 두는 패턴 (프록시와 동일함 / 다른점 : 반환값에 변화)
6. Singleton 패턴
가. 해당 클래스의 인스턴스 즉 객체가 하나만 만들어지고, 어디서든지 그 인스턴스에 접근할 수 있도록 하기 위한 패턴
나. 예시
public class Singleton {
private static Singleton uniqueInstance = new Singleton();
private Singleton(){}
public static synchronized Singleton getInstance(){
return uniqueInstance;
}
}
가. 상위클래스의 견본메서드에서 하위클래스가 오버라이딩한 메서드를 호출하는 패턴
나. 예시
1) 적용전
public class Dog {
public void playWithOwner() {
print("귀염둥이 이리온~~");
print("명~ 멍~");
print("꼬리 살랑 살랑~");
print("잘했어");
}
}
public class Cat {
public void playWithOwner() {
print("귀염둥이 이리온~~");
print("야옹~ 야옹~");
print("꼬리 살랑 살랑~");
print("잘했어");
}
}
2) 적용후
public abstract class Animal {
// 템플릿 메서드
public void playWithOwner() {
print("귀염둥이 이리온~~");
play();
runSomething();
print("잘했어");
}
// 추상 메서드
abstract void play();
// Hook(갈고리) 메서드
void runSomething() {
print("꼬리 살랑 살랑~");
}
}
public class Dog Extends Animal {
@Override
// 추상 메서드 오버라이딩
public void play() {
print("명~ 멍~");
}
}
public class Driver {
main() {
Animal bolt = new Dog();
bolt.playWithOwner();
}
}
※ Animal 의 playWithOwner 를 실행하다가 play() 를 만났을 때 하위클래스인 Dog 에서 재정의 한 것을 불러다 씀
8. factory(공장) method 패턴
가. 오버라이드된 메서드가 객체를 반환하는 패턴
9. strategy (전략) 패턴
가. 클라이언트가 전략을 생성해 전략을 실행할 컨텍스트에 주입하는 패턴, 알고리즘군을 정의하고 각각 캡슐화하여 교환해서 사용할 수 있도록 만든다. 스트래티지패턴을 활용하면 알고리즘을 사용하는 클라이언트와는 독립적으로 알고리즘을 변경 할 수 있다.
나. 예시
public class Dirver {
main() {
Strategy strategy = null;
Soldier rambo = new Soldier();
strategy = new StrategyGun();
rambo.runCotext(strategy);
strategy = new StrategySword();
rambo.runCotext(strategy);
strategy = new StrategyBow();
rambo.runCotext(strategy);
}
}
public class StrategyGun implements Strategy {
@Override
public void runStrategy() {
print("탕탕");
}
}
public class Soldier {
void runCotext(Strategy strategy) {
print("전투시작");
strategy.runStrategy();
print("전투종료");
}
}
10. template(견본) callback(회신) 패턴
가. 전략패턴변형, 전략을 익명 내부 클래스로 구현한 전략패턴
나. 예시
rambo.runCotext(new Strategy() {
@Override
public void runStrategy() {
print("탕탕");
}
});
11. facade(퍼사드) 패턴
가. 어떤 서브시스템의 일련의 인터페이스에 대한 통합된 인터페이스를 제공한다.
나. 예시
public watchMovie(Movie movie) {
Screen.down();
Project.on();
Amp.on();
Dvd.on();
Dvd.play(movie);
Light.on();
}
'삶.. > 프로그래밍' 카테고리의 다른 글
스프링 삼각형 - AOP (0) | 2017.05.16 |
---|---|
스프링 삼각형 - IoC/DI (0) | 2017.05.16 |
객체지향설계 5원칙 - DIP (0) | 2017.05.16 |
객체지향설계 5원칙 - ISP (0) | 2017.05.16 |
객체지향설계 5원칙 - LSP (0) | 2017.05.16 |