디자인 가이드-오리 게임 으로 인 한 디자인 이념(다 형,계승,추상,인터페이스,전략 자 모델)

이 박문 은 실제 생활 에서 추출 한 디자인 이념 으로 지금 은 골조 이다.지금 은 내 가 코드 인 스 턴 스 를 해서 프로그램의 혈육 을 완성 하여 모두 가 디자인 의 정 수 를 생생 하 게 체험 하도록 한다.우리 가 대상 을 대상 으로 프로 그래 밍 을 배 운 후부 터 우리 의 사고 모델 을 편리 하 게 만 들 었 고 한 사물 이 무엇 을 가지 고 있 는 지 에 대응 하 는 속성 과 방법 으로 더 했다.()어 려 운 것 은 없 지만 가장 기본 적 인 문법 과 자신 도 잘 모 르 는 언어 를 배 웠 습 니 다.C 언어 프로그램 을 사용 하면 C\#,JAVA 등 으로 쉽게 바 꿀 수 있 습 니 다.뭐 가 어렵 습 니까?대부분의 프로그래머 들 은 C\#언어 를 왜곡 시 켜 C 의 문법 을 C\#에 이식 했다.언어 는 일종 의 도구 로 배 운 것 은 모두 납득 되 지만 디자인 사상 이 다 르 면 언어의 본질 적 인 차 이 를 결정 한다.본론 으로 들 어가 서 한 걸음 한 걸음 간단 한 오리 게임 프로그램 을 분석한다.  먼저 오리 상 대 를 설계 하 세 요.그 렇 죠?대체적으로 다음 과 같 습 니 다.
 
public class Duck
{
void quack(){
//...
}
void swim(){
//...
}
void Display() {
//...
}
}
그리고 오리 게임 에서 각종 오리 가 수영 을 하면 서 물 놀 이 를 하면 서 마 시 며 소 리 를 지 릅 니 다.각종 오 리 는 모두 Duck 류 를 계승 합 니 다.게임 은 예상 한 대로 실 행 됩 니 다.  이 건 표준 OO(Object Oriented)기술 이 겠 죠?게임 이 완벽 하 게 돌아 가 고 있 습 니 다..............................................................혁신 하 자: 미 운 오리 새끼 도 푸 른 하늘 로 날 아 갈 수 있다 고??o(∩_∩)o 지금 오리 가 날 고 싶다 면 오리 에 게 비행 방법 을 추가 해 야 합 니 다.이제 막 문제 가 생 겼 다.시범 프로그램 을 보 여줄 때'고무 가짜 오리'가 화면 에서 날 아 다 녔 고 게임 에는 다양한 오리 가 있 었 다.플라이(fly)가 없 을 때 새끼 오리 들 은 안정 적 으로 움 직 일 수 있다.부모 클래스 에 Fyl()을 더 하면 모든 하위 클래스 가 Fly()를 갖 게 되 고 갖 추 지 말 아야 할 하위 클래스 도 면제 할 수 없 기 때문에 코드 에 대한 부분 적 인 수정 은 영향 차원 이 부분 만 있 는 것 이 아니다.이 그림 을 보 세 요.당신 의 생각 과 약속 이나 한 듯 이 일치 할 지도 모 릅 니 다. 고무 오 리 를 덮 는 비행 방식.이것 은 좋 은 선택 입 니 다.이렇게 되면'고무 오리'도 여기저기 날 아 다 니 지 않 을 것 입 니 다~(주의 하 세 요.'고무 오리'가 부 를 것 입 니 다-'찍찍').게임 에 오리 가 추가 되 었 습 니 다~문제 가 또 왔 습 니 다~~지금 가입 멤버 는-'미끼 오리'(DecoyDuck)나무 로 만 든 가짜 오리 입 니 다.날 지도 못 하고 부 르 지도 않 습 니 다~OK,지금 이 새 멤버 에 게 이렇게 합 니 다: 계속 덮 는 방법 은 성실 하 게 물 속 에서 수영 할 수 밖 에 없습니다!너 희 는 이런 번 거 로 운 일이 언제 쯤 머리 가 될 것 이 라 고 생각 하 니?오리 의 종류 가 무한 합 니 다.당신 의 악몽 은 무한 합 니 다.이 해결 방법 을 계승 하 는 것 은 과감 해 서 는 안 될 것 같 습 니 다.바 꿔 야 합 니 다.이 디자인 어때요? Duck 클래스 도 바 꾸 고 두 가지 방법 만 포함 합 니 다:Swim(),Display(): 그리고 서로 다른 하위 클래스 가 Duck 류 를 계승 할 때 각각 Fly()와 Quack()을 실현 하고 인터페이스 도 사 용 했 습 니 다.어떻게 생각 하 세 요?좀 쓸모 가 있 는 것 같 습 니 다.하지만,하위 클래스 계승 이 이 루어 진 Fly(),Quack()은 모두 중복 코드 입 니 다.그러나 중복 코드 는 받 아들 일 수 있 습 니 다.하지만,유지 할 때 30 개의 Duck 하위 클래스 가 있다 면,그 Fly()를 조금 만 수정 해 야 합 니 다.유지 가능성 이 순간 하한 선 으로 낮 아 질 것 같 지 않 습 니까?이 새로운 디자인 방법 에서'일부'문 제 를 해 결 했 지만 코드 를 다시 사용 할 수 없 게 만 들 었 습 니 다!느껴 지지 않 아 요?더 무 서운 것 도 있어 요.날 아 다 니 는 오리.그 비행 동작 은 천편일률 적 인 것 이 아 닙 니 다.360°회전 동작 을 하 세 요.어떻게 하 시 겠 습 니까?o(∩_∩)o 어디서 일 하 든,어떤 프로 그래 밍 언어 로,소프트웨어 개발 에 있어 서,항상 당신 과 함께 하 는 변 함 없 는 진 리 는 무엇 입 니까?생각 나 는 답 을 댓 글로 남 겨 주세요^ ^,당신 의 대답 을 기대 합 니 다)이 이전의 디자인 을 모두 삭제 합 니 다..........................................................................그러나 이것 은 아직도 많은 임 무 를 수행 하 게 합 니 다.코드 재 활용 을 할 수 없습니다.유지 할 때 계속 추적 하고 대응 하 는 행 위 를 수정 해 야 합 니 다.이 문제 에 대해 지금 은 진정 으로 디자인 원칙 이 있어 서 이 문 제 를 해결 할 수 있 고 코드 재 활용 을 실현 할 수 있 으 며 시스템 을 더욱 탄력 있 게 할 수 있다.디자인 원칙:응용 에서 변화 가 필요 할 수 있 는 부분 을 찾 아 독립 시 키 고 변화 가 필요 없 는 코드 와 섞 이지 마 세 요.이것 은 이론 지식 으로 골격 에 대해 나 는 그것 의 날 개 를 풍만 하 게 할 것 이다.계속 보 세 요.당신 은 수확 이 있 을 겁 니 다!이제 Duck 류 의 변화 부분 을 꺼 낼 때 가 되 었 습 니 다!현재 가 변 적 인 것 은 fly 와 quack 관련 부분 입 니 다.그들 은 변화 할 것 입 니 다.지금 은 이 두 가지 행 위 를 Duck 류 에서 분리 하여 하나의 새로운 유형 을 만들어 모든 행 위 를 대표 합 니 다.먼저 비행 행위 의 인 터 페 이 스 를 만 듭 니 다:Public interface FlyBehavior{void Fly();}샤 샤 부 르 는 행위 의 인터페이스:public interface QuackBehavior{void quack();}이러한 디자인 이념 을 들 어 본 적 이 있 습 니까?인터페이스 프로 그래 밍 을 위 한 것 이지 프로 그래 밍 을 위 한 것 이 아 닙 니 다.한편,'인터페이스 프로 그래 밍'의 진정한 의 미 는'추상 류 프로 그래 밍'이다.'인터페이스 프로 그래 밍 의 관건 은 다 태 에 있다.다 형 을 이용 하여 프로그램 은 추상 류 에 대한 프로 그래 밍 을 할 수 있 고 실행 할 때 실제 상황 에 따라 진정한 행 위 를 수행 하 며 추상 류 의 행위 에 묶 이지 않 는 다.좀 더 깊이 파고 들 면'추상 류 프로 그래 밍'이라는 말 은'변수의 성명 유형,추상 유형 이 어야 한다.이것 은 추상 류 또는 인터페이스'라 고 명확 하 게 말 할 수 있다.이해 안 돼,괜찮아!이제 우 리 는 프로그램 으로 이 개념 을 천천히 알 아 보도 록 하 겠 습 니 다!전통 적 인 예 를 들 어 프로 그래 밍 실현:Dog d=new Dog();d.bark();//“멍멍'은 행위 가 인터페이스 나 추상 류 에 대한 프로 그래 밍 이 라 고 한다.Animal animal=new Dog().animal.makeSound();//이 방법 이'멍멍'을 실현 하 는 것 을 모 르 는 것 이 라 고 합 니까?괜찮아 요.그림 이 있어 요. 이제 오리 게임 의 디자인 을 다시 실현 합 시다!먼저 비행 행 위 를 설계 합 니 다.
 
public class Duck
{
void quack(){
//...
}
void swim(){
//...
}
void Display() {
//...
}
void Fly() {
//...
}
}
저 는 두 가지 유형 을 함께 놓 았 습 니 다.이것 은 여러분 이 읽 기 에 편리 하고 실제로 분리 해 야 합 니 다.'샤 샤'라 는 행 위 를 살 펴 보 세 요.
 
class FlyWithWings:FlyBehavior
{
public void Fly()
{
Console.WriteLine(" ~!");
}
}
class FlyNoWay : FlyBehavior
{
public void Fly() {
// ,
}
}
행 위 를 했 습 니 다~Duck 류
 
class Quack : QuackBehavior
{
public void quack()
{
Console.WriteLine(" !");
}
}
class Squeak : QuackBehavior
{
public void quack() {
Console.WriteLine(" !");//
}
}
class MuteQuack:QuackBehavior
{
public void quack()
{
Console.WriteLine(".......");//" "
}
}
의 구 조 를 실현 하 는 것 은 간단 하지 않 습 니까?QuackBehavior,FlyBehavior 를 정의 합 니 다.모든 오 리 는 QuackBehavior 인터페이스 대상 을 인용 하여 오 리 를 처리 하도록 합 니 다.샤 샤 의 효 과 를 얻 으 려 면 quackbehavior 대상 이 샤 샤 를 하면 됩 니 다.우 리 는 이제 quackbehavior 인터페이스의 대상 이 무엇 인지 신경 쓰 지 않 아 도 됩 니 다.Duck 이 어떻게 부 르 는 지 관계 만 있 으 면 됩 니 다.이 quackbehavior 인 터 페 이 스 는 다시 사용 할 수 있 습 니 다.발견 되 었 습 니까?어디서 중용 할 수 있 습 니까?생각 좀 해 봐,내 가 나중에 얘 기 할 게.자,이제 오리 실 체 를 구체 적 으로 실현 하 겠 습 니 다:
 
public abstract class Duck
{
public FlyBehavior flybehavior;
public QuackBehavior quackbehavior;
public void performQuack() {
quackbehavior.quack();
}
public void performFly()
{
flybehavior.Fly();
}
public virtual void Swim(){
Console.WriteLine("~~ ~~");
}
public virtual void Display(){}
}
o(∩∩)o 대공 이 곧 완성 된다.운행 결과 보기: 코드 도 붙 였 고 프로그램 이 실 행 될 수 있 습 니 다.이제 이 디자인 의 마지막 개념 을 보 겠 습 니 다.조합 을 많이 사용 하고 계승 을 적 게 사용 합 니 다.보시 다시 피 조합 을 사용 하여 시스템 을 구축 하 는 것 은 매우 큰 탄력성 을 가지 고 있 습 니 다.알고리즘 족 을 클래스 로 포장 할 뿐만 아니 라'실행 할 때 동적 으로 행동 을 바 꿀 수 있 습 니 다'.'운행 할 때 동적 으로 행동 을 바 꾸 는 것'이 무엇 인지 모 르 겠 습 니 다.자,그럼 제 가 하나 더 보 여 드 리 겠 습 니 다.그 아름 다운 푸 른 머리 오 리 를 예 로 들 겠 습 니 다.Duck 류 의 최신 수정:
 
public class MallarDuck : Duck
{
public MallarDuck() {
quackbehavior = new Quack();
flybehavior = new FlyWithWings();
}
public override void Display()
{
Console.WriteLine(" !");
}
}
그리고 저 는 로켓 동력 을 추가 하 겠 습 니 다.
 
static void Main(string[] args)
{
MallarDuck mallard = new MallarDuck();
mallard.Display();
mallard.Swim();
mallard.performQuack();
mallard.performFly();
}
프로그램:
 
public abstract class Duck
{
public FlyBehavior flybehavior;
public QuackBehavior quackbehavior;
public void performQuack() {
quackbehavior.quack();
}
public void performFly()
{
flybehavior.Fly();
}
public virtual void Swim(){
Console.WriteLine("~~ ~~");
}
public virtual void Display(){}
public void SetFlyBehavior(FlyBehavior flyb)//
{
flybehavior = flyb;
}
}
결과: 동적 추 가 됐 죠?고치 기 쉽 죠?그 quackbehavior 인터페이스 재 활용 문제:오리 울 음소 리 아 시 죠?사냥꾼 은 이 물건 으로 오리 의 울 음소 리 를 모방 하여 들 오 리 를 유인 하 는데,이것 은 아주 좋 은 중용 이 아 닙 니까?o(∩_∩)o 더 많은 사용 은 당신 의 상상 에 만 국 한 됩 니 다~만약 당신 이 이것 을 진지 하 게 보 았 다 면,아래 의 이 상 은 당신 에 게 주 는 것 입 니 다:당신 은 전략가 디자인 모델 o(∩∩)o 당신 은 더 이상 시스템 이 어떠한 변화 전략 자 모델 에 부 딪 힐 까 봐 걱정 하지 않 아 도 됩 니 다.알고리즘 족 을 정의 하고 각각 패키지 하여 서로 바 꿀 수 있 도록 합 니 다.이 모델 은 알고리즘 의 변 화 를 알고리즘 을 사용 하 는 사용자 에 게 독립 시 킵 니 다.다 봤 어 요.괜 찮 은 것 같 으 면 추천 을 눌 러 주세요.o(∩_∩)o 이것 은 나 에 대한 지지,감사합니다

좋은 웹페이지 즐겨찾기