2011-01-25 30 views
13

Tôi không thực sự hiểu được điểm của mặt tiền.Điểm của Mặt trận trong Java EE là gì?

public abstract class AbstractFacade<T> { 

    private Class<T> entityClass; 

    public AbstractFacade(Class<T> entityClass) { 
     this.entityClass = entityClass; 
    } 

    protected abstract EntityManager getEntityManager(); 

    public void create(T entity) { 
     getEntityManager().persist(entity); 
    } 

    public void edit(T entity) { 
     getEntityManager().merge(entity); 
    } 

    public void remove(T entity) { 
     getEntityManager().remove(getEntityManager().merge(entity)); 
    } 

    public T find(Object id) { 
     return getEntityManager().find(entityClass, id); 
    } 

    public List<T> findAll() { 
     CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery(); 
     cq.select(cq.from(entityClass)); 
     return getEntityManager().createQuery(cq).getResultList(); 
    } 

    public List<T> findRange(int[] range) { 
     CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery(); 
     cq.select(cq.from(entityClass)); 
     Query q = getEntityManager().createQuery(cq); 
     q.setMaxResults(range[1] - range[0]); 
     q.setFirstResult(range[0]); 
     return q.getResultList(); 
    } 

    public int count() { 
     CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery(); 
     Root<T> rt = cq.from(entityClass); 
     cq.select(getEntityManager().getCriteriaBuilder().count(rt)); 
     Query q = getEntityManager().createQuery(cq); 
     return ((Long) q.getSingleResult()).intValue(); 
    } 
} 

Nếu tôi có mã này và sau đó tôi có EJB như thế này.

@Stateless 
public class WrapSpecFacade extends AbstractFacade<WrapSpec> { 
    @PersistenceContext 
    private EntityManager em; 

    @Override 
    protected EntityManager getEntityManager() { 
     return em; 
    } 

    public WrapSpecFacade() { 
     super(WrapSpec.class); 
    } 

} 

Điểm này là gì? Tại sao gọi đây là mặt tiền? Với tôi nó chỉ là một lớp trừu tượng mà nhóm các chức năng tương tự. Cảm ơn.

Trả lời

16

Mặt tiền là mẫu thiết kế. Một mẫu, một mẫu phần mềm, là một bộ quy tắc để sắp xếp mã và cung cấp một cấu trúc nhất định cho nó. Một số mục tiêu có thể đạt được bằng cách sử dụng một mẫu. Một mẫu thiết kế được sử dụng khi thiết kế ứng dụng.

Mẫu mặt tiền cho phép các lập trình viên tạo giao diện đơn giản cho các đối tượng sử dụng các đối tượng khác. Xem xét làm việc với một nhóm các lớp rất phức tạp, tất cả đều triển khai các giao diện riêng của chúng. Vâng, bạn muốn cung cấp một giao diện để chỉ hiển thị một số chức năng của nhiều bạn có. Bằng cách làm như vậy, bạn đạt được sự đơn giản, linh hoạt, tích hợp và ghép nối mã đơn giản.

Mặt tiền, trong ví dụ của bạn, được sử dụng để quản lý ghép nối giữa nhiều tác nhân. Nó là một vấn đề thiết kế. Khi bạn có nhiều thành phần tương tác với nhau, chúng càng gắn chặt với nó thì sẽ càng khó để duy trì chúng (tôi có nghĩa là bảo trì mã). Mặt tiền cho phép bạn tiếp cận khớp nối lỏng lẻo, đó là mục tiêu mà một lập trình viên luôn cố gắng tiếp cận.

xem xét như sau:

public class MyClass1 implements Interface1 { 
    public void call1() {} 
    public call call2() {} 
} 

public class MyClass2 implements Interface2 { 
    public void call3() {} 
    public void call4() {} 
} 

public class MyClass { 
    private MyClass1 a; 
    private MyClass2 b; 
    //calling methods call1 call2 call3 and call4 in other methods of this class 
    ... 
    ... 
} 

Nếu bạn đã phải thay đổi logic kinh doanh nằm trong một lớp học được sử dụng bởi call1 hoặc call2 ... bằng cách không thay đổi giao diện, bạn sẽ không cần phải thay đổi tất cả các lớp, nhưng chỉ là lớp bên trong phương thức được sử dụng bởi một trong các phương thức giao diện của hai lớp đầu tiên.

Mặt tiền cho phép bạn cải thiện cơ chế này.

Tôi xin lỗi nhưng tôi nhận ra rằng nó trông không thật tuyệt vời. Các mẫu thiết kế được sử dụng nhiều trong ngành công nghiệp phần mềm và chúng có thể rất hữu ích khi làm việc trên các dự án lớn. Bạn có thể chỉ ra rằng dự án của bạn không lớn và điều đó có thể đúng, nhưng Java EE nhằm mục đích giúp lập trình ứng dụng doanh nghiệp và cấp doanh nghiệp. Đó là lý do tại sao đôi khi mẫu mặt tiền được sử dụng theo mặc định (một số IDE cũng sử dụng nó).

7

Thông thường mẫu này được sử dụng để che giấu việc triển khai các lớp cơ bản mà nó trình bày giao diện hoặc để đơn giản hóa việc triển khai cơ bản của một thứ có thể phức tạp.

Mặt tiền có thể trình bày một giao diện đơn giản với thế giới bên ngoài, nhưng dưới mui xe làm những việc như tạo các thể hiện của các lớp khác, quản lý giao dịch, xử lý tệp hoặc kết nối TCP/IP - tất cả mọi thứ mà bạn có thể được che chắn bằng giao diện đơn giản.

6

Trong ngữ cảnh cụ thể của bạn, đây không thực sự là Mặt tiền. Những gì bạn có trong mã đó về cơ bản là một DAO (Data Access Object).

Một DAO có thể được xem như là một mặt tiền cho các hoạt động DB, nhưng đây không phải là mục đích chính của nó. Nó chủ yếu có ý định để ẩn các internals DB.Trong ví dụ của bạn, nếu bạn đang chuyển hệ thống lưu trữ cơ bản thành tệp XML hoặc một số kho khóa-giá trị như HBase, bạn vẫn có thể sử dụng các phương thức được định nghĩa trong "Mặt tiền" đó và không cần thay đổi trong mã máy khách.

Giao dịch mặt tiền (truyền thống) với thiết kế phức tạp cần được ẩn khỏi ứng dụng khách. Thay vì lộ ra một API phức tạp và các luồng phức tạp (lấy nó từ dịch vụ này, chuyển nó tới bộ chuyển đổi này, lấy kết quả và xác nhận nó với cái này và sau đó gửi nó tới dịch vụ khác này), bạn chỉ đóng gói tất cả trong một Mặt tiền và đơn giản phơi bày một phương pháp đơn giản cho khách hàng. Bằng cách này, cùng với thực tế là API của bạn dễ sử dụng hơn rất nhiều, bạn cũng được tự do thay đổi triển khai cơ bản (phức tạp) mà không cần phải phá vỡ mã máy khách của mình.

Các vấn đề liên quan