> Java > java지도 시간 > 본문

관찰자 패턴

Patricia Arquette
풀어 주다: 2024-11-03 23:41:31
원래의
337명이 탐색했습니다.

관찰자 패턴이란 무엇입니까?

관찰자 패턴은 하나의 객체가 상태를 변경하면 해당 객체의 모든 종속 항목이 자동으로 알림을 받고 업데이트되도록 객체 간의 일대다 종속성을 정의하는 동작 패턴입니다.

객체가 상태를 변경하는 것을 주체라고 하며, 그 종속 항목을 관찰자라고 합니다.

언제 사용하나요?

객체 간에 일대다 종속성이 필요할 때 관찰자 패턴을 사용할 수 있습니다. 하나는 상태를 변경하고 많은 종속자는 이러한 변경 사항을 추적해야 합니다.

X(트위터)와 같은 SNS를 사용하고, 기업과 개인이 각자의 계정을 가지고 있고, 사람들이 자신이 좋아하는 기업을 팔로우할 수 있어 그 기업이 신상품이나 세일 상품을 올릴 때 알림을 받고 싶다고 가정해보자. 이런 상황에서는 Observer 패턴을 적용할 수 있습니다.

UML 다이어그램

Observer Pattern

UML 다이어그램 예

Observer Pattern

  • setSaleItem 메소드가 호출되면, 즉 상태가 변경되면 setItemChanged 메소드를 호출합니다. 그런 다음 setItemChanged 메소드는 informAccount 메소드를 호출합니다.
  • Company 클래스의 informAccount 메소드는 각 추종자를 반복하고 follower.update(this)와 같은 자체 Company 객체를 사용하여 업데이트 메소드를 호출합니다.

자바로 구현

ICompany 인터페이스:

public interface ICompany {

    void registerAccount(IAccount account);

    void removeAccount(IAccount account);

    void notifyAccounts();
}
로그인 후 복사

회사 수업:

import java.util.ArrayList;
import java.util.List;

public class Company implements ICompany {

    private List<IAccount> followers;

    private String name;

    private String saleItem;

    public Company(String name) {
        followers = new ArrayList<>();
        this.name = name;
    }

    @Override
    public void registerAccount(IAccount account) {
        this.followers.add(account);
    }

    @Override
    public void removeAccount(IAccount account) {
        this.followers.remove(account);
    }

    @Override
    public void notifyAccounts() {
        for (IAccount follower : followers) {
            follower.update(this);
        }
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSaleItem() {
        return saleItem;
    }

    public void setSaleItem(String saleItem) {
        this.saleItem = saleItem;
        saleItemChanged();
    }

    public void saleItemChanged() {
        notifyAccounts();
    }
}
로그인 후 복사

IA계정 인터페이스:

public interface IAccount {

    void update(Company company);
}
로그인 후 복사

계정 클래스:

public class Account implements IAccount {

    private String name;

    public Account(String name) {
        this.name = name;
    }

    @Override
    public void update(Company company) {
        System.out.println(this.name + " receives a new message from " + company.getName());
        System.out.println("New sale item: " + company.getSaleItem());
    }
}
로그인 후 복사

클라이언트 클래스:

public class Client {

    public static void main(String[] args) {
        Company apple = new Company("Apple"); // concrete subject

        IAccount john = new Account("John");
        IAccount david = new Account("David");

        // John starts following Apple Inc.
        apple.registerAccount(john);
        apple.setSaleItem("iPhone 14");
        System.out.println("**********************");

        // David becomes a new follower to Apple Inc.
        apple.registerAccount(david);
        apple.setSaleItem("iPad");
        System.out.println("**********************");

        // John doesn't receive message from Apple Inc. as he deregistered for Apple Inc.
        apple.removeAccount(john);
        apple.setSaleItem("AirPods");
    }
}
로그인 후 복사

출력:

John receives a new message from Apple
New sale item: iPhone 14
**********************
John receives a new message from Apple
New sale item: iPad
David receives a new message from Apple
New sale item: iPad
**********************
David receives a new message from Apple
New sale item: AirPods
로그인 후 복사

여기에서 모든 디자인 패턴 구현을 확인할 수 있습니다.
GitHub 저장소


추신
기술 블로그를 처음 작성하는 초보입니다. 글쓰기를 개선하기 위한 조언이 있거나 혼란스러운 점이 있으면 댓글을 남겨주세요!
읽어주셔서 감사합니다 :)

위 내용은 관찰자 패턴의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿