Null 개체 모드 의 사용법
개인 적 으로 모델 이란 프로그래머 들 이 프로 그래 밍 을 할 때 비슷 한 문 제 를 정리 하 는 통용 적 인 해결 방법 이나 사고 라 는 것 을 이해한다.따라서 당신 의 문제 가 특정한 디자인 모델 에 대응 하 는 문제 에 매우 부합 되 더 라 도 기 존의 특정한 디자인 모델 이 우리 프로 그래 밍 중의 구체 적 인 디자인 문 제 를 완전히 해결 할 수 있 기 를 기대 할 수 없습니다.
잡담 은 적 게 하고 본론 으로 들 어가 라.
Null 대상 모드 는 말 그대로 빈 대상 으로 아무것도 하지 않 는 다.
혹시 아무것도 안 하 는데 왜?다음 null 대상 의 전형 적 인 예 를 보 세 요.
코드 세그먼트 1:
Employee e = DB.getEmployee();
If(null == e && e.isTimeToPay(today))
e.pay();
예 를 들 어 대상 이 null 인지 아 닌 지 를 판단 한 다음 에 서로 다른 동작, 즉 월급 을 지급 하 는 지 여 부 를 판단 해 야 한다.만약 당신 의 프로그램 에서 'null = = e' 라 는 것 을 판단 하 는 것 이 많다 면, Martin Fowler 가 '재 구성' 이라는 책 에서 말 한 것 에 따 르 면 바로 당신 의 코드 에서 나 쁜 냄새 가 났 다 는 것 입 니 다. 그것 을 없 애 야 합 니 다!!!Null 대상 을 사용 한 후에 DB. getEmployee () 가 되 돌아 오 는 Null 대상 과 Employee 대상 이 같은 인 터 페 이 스 를 가지 기 때문에 Null 대상 을 되 돌려 준 후에 도 코드 세그먼트 2 를 사용 할 수 있 습 니 다. 다만 이 시공 대상 은 아무것도 조작 하지 않 았 기 때문에 상기 코드 는 다음 과 같이 간략화 할 수 있 습 니 다.
코드 세그먼트 2:
Employee e = DB.getEmployee();
If(e.isTimeToPay(today))
e.pay();
프로그램 개발 에 있어 서 이와 같은 여러 가지 문제 가 있 습 니 다. 예 를 들 어 아래 에 avl 트 리 노드 를 추가 하 는 함수 코드 는 avl 트 리 에 노드 (노드 류 의 인 터 페 이 스 는 IAVLNode 이 고 실현 류 는 AVLNode) 를 추가 하 는 것 입 니 다. 함수 에서 먼저 루트 노드 가 비어 있 는 지 판단 하고 비어 있 으 면 새로 추 가 된 노드 를 루트 노드 로 설정 합 니 다.그렇지 않 으 면 적당 한 위 치 를 찾 아 노드 를 추가 합 니 다.코드 세그먼트 3:
//
{
avlRoot = addNode;
return;
}
IAVLNode curNode = avlRoot;
IAVLNode parentNode = avlRoot;
while(null != curNode)
{
parentNode = curNode;
if(curNode.getValue() < addNode.getValue())
curNode = curNode.getRightChild();
else
curNode = curNode.getLeftChild();
}
if(parentNode.getValue()< addNode.getValue())
parentNode.setRightChild(addNode);
else
parentNode.setLeftChild(addNode);
addNode.setParentNode(parentNode);
}
위의 함수 코드 중 두 군데 가 노드 가 비어 있 는 지 판단 해 야 합 니 다. AVL 트 리 회전 을 쓰 려 면 분명 합 니 다.(바로 균형 이 진 트 리 에서 노드 를 추가 한 후의 네 가지 균형 을 조정 하 는 작업 입 니 다. 즉, 왼쪽, 왼쪽 삽입 시 우회전, 오른쪽 삽입 시 좌회전, 좌우 삽입 시 좌우 두 번 회전, 오른쪽 왼쪽 삽입 시 오른쪽 왼쪽 두 번 회전 이 필요 합 니 다) 코드 입 니 다. 코드 에서 노드 가 비어 있 는 지 판단 하 는 작업 이 많 을 것 입 니 다!!!!2、 Null 대상 을 어떻게 정의 하고 사용 합 니까?
이 어 1 절 avl 트 리 의 예 를 들 어 Null 대상 을 어떻게 정의 하고 사용 하 는 지 설명 한다. 특히 실제 작업 에서 사용 할 수 있 는 실현 방식 은 여러 가지 가 있다. 본 고 는 그 중의 하나 일 뿐 이 를 위해 자신의 사 고 를 속박 하지 말 아야 한다.
Null 대상 은 하나만 필요 하기 때문에 단일 모드 를 사 용 했 습 니 다. 구체 적 인 정 의 는 다음 과 같 습 니 다.
코드 세그먼트 4:
public class NullNode implements IAVLNode {
private static NullNode nullObj= null;
private NullNode(){}
public static NullNode GetNullObj()
{
if(null == nullObj)
nullObj = new NullNode();
return nullObj;
}
@Override
public boolean isNullObj() {
// TODO Auto-generated method stub
return true;
}
@Override
public void DisplayInfo() {
}
@Override
public IAVLNode getParentNode() {
return null;
}
@Override
public void setParentNode(IAVLNode parentNode) {
}
@Override
public int getValue() {
return 0;
}
@Override
public void setValue(int value) {
}
@Override
public IAVLNode getLeftChild() {
return null;
}
@Override
public void setLeftChild(IAVLNode leftChild) {
}
@Override
public IAVLNode getRightChild() {
return null;
}
@Override
public void setRightChild(IAVLNode rightChild) {
}
@Override
public int getDepth() {
return 0;
}
@Override
public void setDepth(int depth) {
}
@Override
public boolean isBalance() {
return true;
}
}
이 Null 대상 에 서 는 인터페이스 IAVLNode 를 계승 해 이 인터페이스의 모든 조작 을 실 현 했 지만, 이 조작 들 은 아무것도 하지 않 았 다.3、 Null 대상 은 또 어떤 부족 함 이 있 나 요?
1) 본 고 를 시작 할 때 Null 대상 의 주요 해결 문제 중 하 나 는 바로 프로그램 에서 null 에 대한 대량의 판단 이다.그러나 실제 응용 에서 'null = = avlRoot' 와 같은 코드 를 모두 제거 할 수 있 는 것 은 아니다. 일부 상황 에서 대상 이 비어 있 는 지 판단 해 야 할 때 'avlRoot. isNull' 을 호출 해 야 한다.
2) 어떤 때 는 빈 대상 의 빈 함수 가 실현 되 기 가 비교적 어 려 울 때 가 있 습 니 다. 예 를 들 어 코드 세그먼트 3 의 getValue () 함수 입 니 다. 여 기 는 Null 대상 의 이 함수 가 어떤 값 을 되 돌려 주 는 지 잘 모 르 겠 습 니 다. 코드 세그먼트 4 에서 0 을 되 돌려 주 었 습 니 다. 만약 에 제 가 프로그램 에서 노드 간 의 값 크기 를 비교 해 야 한다 면 이 시공 대상 이 돌아 오 는 0 값 은 적당 하지 않 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.