Facade 모드가 무슨 소용이 있습니까?

목표


Facade 모드가 무슨 소용이 있는지 간단히 설명하기 (코드가 있음)

Facade 모드가 무슨 소용이 있습니까?


간단하게 말하면 여러 가지 처리의 총괄적인 역할이다.
그래서 의뢰 하나로 다양한 일을 할 수 있다는 점이 유용하다.

Facade 모드 요구 사항

  • Facade 클래스는 하위 시스템 내부에 작업을 던져 넣을 뿐 복잡한 설치는 없다
  • Facade 클래스는 서브시스템 자체에서 사용하는 것이 아닙니다
  • Facade 모드는 서브시스템의 직접적인 사용에 방해가 되지 않는다
  • 분류도


    Facade 모드의 클래스 맵



    참조 소스:Wiki-Facade 모드

    이번에 설명한 코드의 분류도



    Librarian이 Book List와 Lending List를 보유하고 있는 것은 입장의 규격으로 창으로 사용하는 실현 자체에 변화가 없다.

    클래스 캐릭터


    Facade: Librarian 클래스
    서브시스템: BookList 클래스, LendingList 클래스
    클라이언트: Visitor 클래스

    종류별 관계

  • Librarian(도서 관리자)은 책을 찾는 역할을 맡을 수 있다
  • Visitor(사용자)는 Librarian에 책을 의뢰하거나 스스로 찾을 수 있습니다
  • BookList(본 데스크톱 저장)와 LendingList(대출 장부)는 Librarian 또는 Visitor에서 사용됩니다
  • 코드


    Librarian.java
    package facade;
    
    // 司書
    public class Librarian {
        private BookList _bookList;
        private LendingList _lendingList;
    
        Librarian(BookList bookList, LendingList lendingList){
            _bookList = bookList;
            _lendingList = lendingList;
        }
    
        public String searchBook(String bookName) {
            //所蔵されているか?
            if(!_bookList.existsBook(bookName)) return "その本は所蔵していません";
    
            //書棚にあるか?
            if (_lendingList.isLending(bookName)) return "貸出中です";
    
            // 所蔵場所
            return _bookList.searchLocation(bookName);
        }
    }
    
    BookList.java
    package facade;
    
    import java.util.HashMap;
    import java.util.Map;
    
    //所蔵本台帳
    public class BookList {
        private Map<String, String> _record = new HashMap<String, String>();
    
        public void addRecord(String bookName, String locationName) {
            _record.put(bookName, locationName);
        }
    
        public boolean existsBook(String bookName) {
            return _record.containsKey(bookName);
        }
    
        public String searchLocation(String bookName) {
            return (String)_record.get(bookName);
        }
    }
    
    LendingList.java
    package facade;
    
    import java.util.ArrayList;
    import java.util.List;
    
    //貸出帳
    public class LendingList {
        private List<String> _record = new ArrayList<String>();
    
        public void lending(String bookName) {
            _record.add(bookName);
        }
    
        public void returned(String bookName) {
            _record.remove(bookName);
        }
    
        public boolean isLending(String bookName) {
            return _record.contains(bookName);
        }
    }
    
    Visitor.java
    package facade;
    
    public class Visitor {
        private String _name;
        private String _targetBookName;
    
        Visitor(String name){
            _name = name;
        }
    
        public void setTargetBookName(String targetBookName) {
            _targetBookName = targetBookName;
        }
    
        public String targetBookName() {
            return _targetBookName;
        }
    
        public String name() {
            return _name;
        }
    }
    
    Main.java
    package facade;
    
    import java.io.PrintStream;
    
    public class Main {
        public static void main(String[] args) {
            // 初期値セット
            // (所蔵本リスト)
            BookList bookList = new BookList();
            bookList.addRecord("昆虫図鑑", "棚番号1");
            bookList.addRecord("動物図鑑", "棚番号1");
            bookList.addRecord("桃太郎", "棚番号2");
            bookList.addRecord("金太郎", "棚番号2");
            bookList.addRecord("コンピュータの仕組み", "棚番号3");
            bookList.addRecord("Javaプログラミング", "棚番号3");
            // (貸出リスト)
            LendingList lendingList = new LendingList();
            lendingList.lending("昆虫図鑑");
            lendingList.lending("桃太郎");
            lendingList.lending("コンピュータの仕組み");
    
            PrintStream out = System.out;
    
            // 利用者[山田くん]:司書[中村くん]に依頼する場合
            Visitor yamada = new Visitor("山田");
            yamada.setTargetBookName("昆虫図鑑");
            // (窓口[中村くん])
            Librarian nakamura = new Librarian(bookList, lendingList);
            // (中村くんに昆虫図鑑の場所を聞く)
            out.println(yamada.name() + "の結果:");
            out.println(nakamura.searchBook(yamada.targetBookName()));
            out.println();
    
            // 利用者[木下くん]:自分で探す場合
            Visitor kinoshita = new Visitor("木下");
            kinoshita.setTargetBookName("動物図鑑");
            if(!bookList.existsBook(kinoshita.targetBookName())) {
                out.println("他の本にしよう");
                return;
            }
            if(lendingList.isLending(kinoshita.targetBookName())) {
                out.println("他の本にしよう");
                return;
            }
            out.println(kinoshita.name() + "の結果:");
            out.println(bookList.searchLocation(kinoshita.targetBookName()));
            out.println();
        }
    }
    
    야마다 군, 목하 군의 target BookName을 변경하고 동작을 확인하세요.

    Github


    용도


    하면, 만약, 만약...
    Facade 모드 사용을 고려해 보시기 바랍니다.
    그러나 필요조건과 같이 복잡한 논리를 포함해서는 안 된다
    결국 관철 처리의 핵심 역할을 요구한다.

    참고 자료


    Facade 모드
    https://ja.wikipedia.org/wiki/Facade_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3
    코드 인용 원본 (이를 바탕으로 개조)
    https://www.techscore.com/tech/DesignPattern/Facade.html/

    좋은 웹페이지 즐겨찾기