Spring 온고지신(6)AOP 절단면 프로 그래 밍<1>
AOP 란 OOP(Object Oriented Programming)가 대상 을 대상 으로 프로 그래 밍 하 는 것 에 비해 어떤 사람들 은 절단면 프로 그래 밍 을 좋아 하고 어떤 사람들 은 방향 프로 그래 밍 이 라 고 부 르 는 것 을 좋아한다.사실은 이 두 가 지 는 모두 같은 것 을 말 하 는데 이름 만 다르다.
우리 의 전통 적 인 프로 그래 밍 은 모두 대상 을 대상 으로 하 는 것 이다.즉,모든 유형 은 실제 적 인 의 미 를 가진다.한편,절단면 에 대해 약간 다 르 기 때문에 대상 을 대상 으로 하 는 토대 에서 확장 되 었 다.이 는 프로 그래 밍 할 때 먼저 고려 하 는 구체 적 인 대상(예 를 들 어 사용자 류)이 아니 라 먼저 고려 하 는 대상 의 행위 나 기능 이다.이것 은 프로 그래 밍 방법의 차이 가 아니 라 프로 그래 밍 사고의 변화 이다.
이론 적 인 것 은 내 버 려 두 고 우 리 는 실제 로봇 사례 로 이 개념 을 천천히 이해한다.
포 인 트 를 강조 하기 위해 서 저희 가 ISpeak 을 다시 썼 습 니 다.
package com.iteye.bolide74.impl;
public interface ISpeaker {
public void say(String msg);
}
다음은 이 인 터 페 이 스 를 실현 하 는 기계 인간 이다.
package com.iteye.bolide74.action;
import com.iteye.bolide74.impl.ISpeaker;
public class Robot implements ISpeaker {
public String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Robot(String name) {
this.name = name;
}
@Override
public void say(String msg) {
System.out.println(" , :" + msg + ", " + this.name);
}
}
그러면 이제 우 리 는 여러 이웃(서로 다른 응용 코드)과 인 사 를 하려 면 아래 의 응용 코드 만 필요 합 니 다.
package com.iteye.bolide74.tester;
import com.iteye.bolide74.action.Robot;
import com.iteye.bolide74.impl.ISpeaker;
public class Tester {
public static void main(String[] args) {
ISpeaker speaker = new Robot("Wall-E");
speaker.say(" ");
}
}
이상 은 가장 간단 한 기능 을 실현 하 는 방법 이다.이제 우 리 는 천천히 기능 을 늘 려 야 한다.Wall-E 가 인 사 를 하기 전에 선물 을 하나 받 고 인 사 를 한 후에 이웃 에 게 선물 을 건 네 준다 고 가정 하면 어떻게 해 야 할 까?
public void getGift() {
System.out.println(" ");
}
public void giveGift(){
System.out.println(" ");
}
가장 어 리 석 은 방법 은 응용 코드 에서 speaker.say()방법 을 사용 할 때마다 get/give 방법 을 사용 하 는 것 입 니 다.애플 리 케 이 션 은 괜 찮 습 니 다.대형 프로그램 이 라면 누구나 바보 같이 써 야 합 니 다.
그러면 get/give 방법 을 로봇 류 의 say()방법 에 직접 쓸 수 있 을까요?이러한 장점 은 say()를 호출 할 때마다 get/give 기능 을 실현 할 수 있다 는 것 이다.그러나 나 쁜 점 도 이것 이다.만약 에 다른 이웃 이 선물 을 줄 필요 가 없다 면?어 떡 하지?
그럼 좀 더 유연 한 방법 이 없 을까요?당연히 있 지!
프 록 시 모드:
먼저 SpeakerProxy 프 록 시 클래스 를 새로 만 듭 니 다.
package com.iteye.bolide74.action;
import com.iteye.bolide74.impl.ISpeaker;
public class SpeakerProxy implements ISpeaker {
ISpeaker speaker;
public SpeakerProxy(ISpeaker speaker) {
super();
this.speaker = speaker;
}
@Override
public void say(String msg) {
getGift();
speaker.say(msg);
giveGift();
}
public void getGift() {
System.out.println(" ");
}
public void giveGift(){
System.out.println(" ");
}
}
이 Speaker Proxy 클래스 는 ISpeaker 인 터 페 이 스 를 실현 한 다음 에 구조 함수 로 들 어 오 는 ISpeaker 형식의 구성원 속성 이 있 습 니 다.
이 Speaker Proxy 류 의 say()방법 은 재 미 있 습 니 다.자신의 say()방법 을 다시 쓴 것 이 아니 라 ISpeaker 형식의 speaker 구성원 속성 을 호출 한 say()방법 입 니 다.그리고 이 say()방법 은 get/give 방법 을 앞 뒤로 끼 워 넣 었 습 니 다.
이 Speaker Proxy 클래스 가 코드 를 어떻게 사용 하 는 지 보 여 줍 니 다.
package com.iteye.bolide74.tester;
import com.iteye.bolide74.action.Robot;
import com.iteye.bolide74.action.SpeakerProxy;
import com.iteye.bolide74.impl.ISpeaker;
public class SpeakerProxyTester {
public static void main(String[] arg0) {
// :
ISpeaker noGiftSpeaker = new Robot(" Wall-E");
noGiftSpeaker.say(" ");
System.out.println();
//
ISpeaker speaker = new SpeakerProxy(new Robot(" Wall-E"));
speaker.say(" ");
}
}
출력 결과:
인용 하 다.
옆집 에 도착 해서 이웃 에 게 안녕,난 빈손으로 온 Wall-E 야.라 고 말 했다.
선물 을 받 았 습 니 다.
옆집 에 도착 해서 이웃 에 게 안녕,나 는 예의 바 르 게 온 Wall-E 라 고 말 했다.
선물 을 하나 증정 하 다
이렇게 되면 우 리 는 유연성 에 이 르 렀 다.선물 이 필요 없 을 때 로봇 을 직접 새로 만 들 었 다.그리고 선물 이 필요 할 때 우 리 는 new Speaker Proxy(대리 기)를 만 들 고 로봇 을 새로 만들어 서 넣 습 니 다.우 리 는 이 대리 기 를 호출 하면 됩 니 다.이 대리 기 내부 에서 로봇 에 게 선물 을 주 고 로봇 에 게 인 사 를 하고 선물 을 보 내 라 고 명령 합 니 다.
확장 읽 기:장식 모드:
인용 하 다.
장식 모델 은 AOP 와 관계 가 크 지 않 지만 그 실현 방법 은 대리 모델 과 매우 비슷 하 다.이 기 회 를 틈 타 같이 소개 하지 않 는 것 은 좀 아쉽다.만약 에 장식 모델 을 이미 알 고 있다 면 바로 넘 어 갈 수 있다.
우리 로봇 이 선물 할 종류 가 비교적 많다 고 가정 하면 보너스,과일,꽃 등 이 있다.그리고 서로 다른 이웃 에 게 인 사 를 하고 선물 을 할 때 서로 다른 조합의 선물 을 준다.예 를 들 어 보너스+과일,보너스+꽃,과일+꽃,모두 보 내 고 따로 보 내 는 것 과 같다.
그렇다면 이런 기능 은 어떻게 이 루어 져 야 할 까?각 조합 마다 get/give 방법 을 쓰 시 겠 습 니까?간단 한 3 가지 조합 만 참 으 면 그만 이지 만 앞으로 선물 종류 가 많아 지면 이 조합 수 는 폭발 적 으로 늘 어 나 는 것 으로 적절 하지 않다.
그렇다면 이 때 는 장식 모드 가 등장 할 차례 다.
package com.iteye.bolide74.action;
import com.iteye.bolide74.impl.ISpeaker;
public abstract class SpeakerGiftDecorator implements ISpeaker {
ISpeaker speaker;
public SpeakerGiftDecorator(ISpeaker speaker) {
super();
this.speaker = speaker;
}
public abstract void say(String msg);
public abstract void getGift();
public abstract void giveGift();
}
이것 은 선물의 장식 기 류 로 각종 선물의 조립 기로 이해 할 수 있다.그것 의 서법 은 대리 모델 의 대리 류 와 매우 비슷 한데,다른 것 은 바로 그것 이 추상 류 라 는 것 이다.그것 은 모든 종류의 선물의 부류 이다.
다음은 이 Speaker Gift Decorator 를 계승 한 선물 같은 것 을 쓰 겠 습 니 다.
package com.iteye.bolide74.action;
import com.iteye.bolide74.impl.ISpeaker;
// :
public class Flower extends SpeakerGiftDecorator {
public Flower(ISpeaker speaker) {
super(speaker);
}
@Override
public void say(String msg) {
getGift();
this.speaker.say(msg);
giveGift();
}
@Override
public void getGift() {
System.out.println(" ");
}
@Override
public void giveGift() {
System.out.println(" ");
}
}
위의 Flower 서브 클래스 로 유추 하여 다른 Money 류 와 Fruit 류 를 쓰 는데 차이 점 은 get/give 방법의 내용 만 다 르 기 때문에 지면 을 낭비 하지 않 습 니 다.
보기 에는 코드 가 매우 간단 하고 이상 한 것 이 없 지만 응용 코드 를 사용 할 때 강력 한 부분 을 나 타 낼 수 있 습 니 다.
package com.iteye.bolide74.tester;
import com.iteye.bolide74.action.Flower;
import com.iteye.bolide74.action.Fruit;
import com.iteye.bolide74.action.Money;
import com.iteye.bolide74.action.Robot;
import com.iteye.bolide74.impl.ISpeaker;
public class SpeakerGiftDecoratorTester {
public static void main(String[] args) {
// :
ISpeaker speaker = new Flower(new Robot(" Wall-E"));
speaker.say("Hello");
System.out.println();
// :
speaker = new Money(new Flower(new Robot(" Wall-E")));
speaker.say("Hello");
System.out.println();
// :
speaker = new Fruit(new Money(new Robot(" Wall-E")));
speaker.say("Hello");
System.out.println();
// :
speaker = new Fruit(new Money(new Flower(new Robot(" Wall-E"))));
speaker.say("Hello");
}
}
이 를 통 해 알 수 있 듯 이 speaker 는 한 층 한 층 씩 끼 워 넣 는 종 류 를 인용 합 니 다.한 가지 선물 을 더 가 져 가 려 면 한 층 더 끼 워 넣 으 면 코드 의 재 활용 을 가능 한 한 실현 할 수 있 고 응용 도 간단명료 합 니 다.
출력 결과:
인용 하 다.
꽃 한 다발 을 얻 었 습 니 다.
옆집 에 도착 해서 이웃 에 게 Hello,저 는 꽃 을 가지 고 온 Wall-E 입 니 다.
꽃다발 을 증정 하 다
보 너 스 를 받 았 습 니 다.
꽃 한 다발 을 얻 었 습 니 다.
옆집 에 도착 해서 이웃 에 게 Hello,저 는 꽃 과 보 너 스 를 가 진 Wall-E 입 니 다.
꽃다발 을 증정 하 다
보너스 하 나 를 증정 하 다.
과일 한 포 대 를 획득 했다
보 너 스 를 받 았 습 니 다.
옆집 에 도착 해서 이웃 에 게 Hello,저 는 과일 과 돈 을 가 져 온 Wall-E 입 니 다.
보너스 하 나 를 증정 하 다.
과일 한 포 대 를 증정 하 다
과일 한 포 대 를 획득 했다
보 너 스 를 받 았 습 니 다.
꽃 한 다발 을 얻 었 습 니 다.
옆집 에 도착 해서 이웃 에 게 Hello,저 는 세 가지 선물 을 다 가 져 온 Wall-E 입 니 다.
꽃다발 을 증정 하 다
보너스 하 나 를 증정 하 다.
과일 한 포 대 를 증정 하 다
나의 목도리:
http://t.qq.com/bolide74
Spring 온고지신(6)AOP 절단면 프로 그래 밍<2>
http://bolide74.iteye.com/blog/1007828
Spring 온고지신(5)Spring 의 Bean 과 IoC 용기
http://bolide74.iteye.com/blog/1004086
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.