관찰자 패턴은 하나의 객체가 상태를 변경하면 해당 객체의 모든 종속 항목이 자동으로 알림을 받고 업데이트되도록 객체 간의 일대다 종속성을 정의하는 동작 패턴입니다.
객체가 상태를 변경하는 것을 주체라고 하며, 그 종속 항목을 관찰자라고 합니다.
객체 간에 일대다 종속성이 필요할 때 관찰자 패턴을 사용할 수 있습니다. 하나는 상태를 변경하고 많은 종속자는 이러한 변경 사항을 추적해야 합니다.
X(트위터)와 같은 SNS를 사용하고, 기업과 개인이 각자의 계정을 가지고 있고, 사람들이 자신이 좋아하는 기업을 팔로우할 수 있어 그 기업이 신상품이나 세일 상품을 올릴 때 알림을 받고 싶다고 가정해보자. 이런 상황에서는 Observer 패턴을 적용할 수 있습니다.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!