2013-02-22 42 views
5

Tôi đã xem một ví dụ trong đó mô hình ủy nhiệm được giải thích cho java. Đã không tìm thấy nhiều sử dụng cho nó (lý do vô minh) như tôi cảm thấy nó thiếu tính linh hoạt trong mục tiêu-c. Có cách nào để tự động thiết lập các đối tượng đại biểu như là một trong những có thể làm trong mục tiêu-c. Đó không phải là toàn bộ quan điểm của phái đoàn sao? Kiến thức của tôi về java rất sơ bộ, vì vậy hãy giải thích một chút chi tiết.Làm thế nào để thực hiện mẫu đại biểu (như trong mục tiêu-c) trong java

+0

[Kiến trúc sự kiện AWT Java] (http://docs.oracle.com/javase/1.4.2/docs/guide/awt/1.3/designspec/events.html) sử dụng mô hình ủy quyền. Bạn có thể muốn cung cấp cho tài liệu được liên kết đó đọc. – Perception

+0

@Perception: tôi đã kiểm tra liên kết. Trong ví dụ mã được đưa ra, không cần thiết rằng đại biểu được thông qua phải luôn luôn thuộc loại 'Ứng dụng'. Đây là những gì tôi có nghĩa là linh hoạt. Hoặc tôi hoàn toàn sai về đối tượng App là đại biểu? – Rakesh

+0

Một vài ngày trước đây http://stackoverflow.com/questions/14963740/cast-to-implemented-class/14963939#14963939 Tôi phác họa mẫu ủy quyền với một ví dụ, bạn có thể kiểm tra nó. – gaborsch

Trả lời

8

Tôi nghĩ có nhiều cách để thực hiện mẫu ủy quyền trong Java, nhưng có lẽ không có cách nào giống như được xây dựng trong.

Hãy xem Wikipedia example. Tùy chọn cơ bản của bạn là thủ công triển khai giao diện và sau đó chỉ cần chuyển tiếp các cuộc gọi đến trường hợp cụ thể mà bạn có thể thay đổi trong thời gian chạy nhiều như bạn muốn.

Giờ đây, tùy thuộc vào công cụ bạn có và có thể sử dụng, bạn có thể thực hiện việc chuyển tiếp chuyển tiếp tự động hơn này. Một ý tưởng, là sử dụng lập trình hướng-khía cạnh, như AspectJ.

Có một trình biên dịch khía cạnh (hoặc thời gian chạy), bạn có thể sử dụng các chú thích và đưa ra một phần mở rộng đơn giản với ngôn ngữ:

class Person { 
    @Delegate Animal animal; 
    ... 
} 

Sau đó bạn sẽ phải viết một khía cạnh mà thấy @Delegate s và tự động thêm phương thức chuyển tiếp trong giao diện lớp học (ví dụ: Person).

Nếu bạn có thể sử dụng a more groovy JVM language, sau đó bạn sẽ không còn phải viết một dòng mã, bởi vì ngôn ngữ như có đại biểu trong thư viện chuẩn:

Bạn có thể có một cái nhìn here, để xem nó được thực hiện như thế nào trong Groovy. (yếu tố chính xác như cú pháp mẫu Person mà tôi đã đưa ra ... nhưng được tích hợp!)

2

Đây là cách bạn giả mạo một thành ngữ chức năng trong Java. Vâng, nó thật ghê tởm. Nếu bạn muốn các thành ngữ chức năng thanh lịch, hãy sử dụng một ngôn ngữ không xử lý các chức năng như trẻ em bước đầu đỏ. Nếu bạn muốn an toàn hơn về thời gian biên dịch, tất nhiên bạn có thể sử dụng các định nghĩa giao diện cụ thể hơn để bạn không nhận được IndexOutOfBounds và ClassCastException ở khắp mọi nơi từ các lỗi lập trình.

public interface DelegatedFunction<T> { 

T call(Object... args); 

} 

public class DoesSomeDelegatedTask { 

    private List<DelegatedFunction<String>> delegatedFunctions = new ArrayList<>(1); 

    public void addFunction(DelegatedFunction<String> function) { 
    delegatedFunctions.add(function); 
    } 

    public void execute() { 
    for (DelegatedFunction<String> function: delegatedFunctions) { 
     System.out.println(function(something, someotherthing, whatever)); 
    } 
    } 
} 

public class Main { 
    public static void main(String[] args) throws Exception { 
    DoesSomeDelegateTask doer = new DoesSomeDelegatedTask(); 
    doer.addFunction(new DelegatedFunction<String>() { 
     @Override 
     public String call(Object... args) { 
     return ((SomeThings) args[0]).whatever((SomeOtherThing) args[1]//you get the idea 
     } 
    } 
    doer.execute(); 
    } 
} 
Các vấn đề liên quan