Đây là câu hỏi thiết kế liên quan đến việc thực hiện Đường ống. Sau đây là triển khai ngây thơ của tôi.Thực hiện mẫu thiết kế đường ống
Giao diện cho bước cá nhân/công đoạn trong các đường ống:
public interface Step<T, U> {
public U execute(T input);
}
triển khai bê tông các bước/giai đoạn trong đường ống:
public class StepOne implements Step<Integer, Integer> {
@Override
public Integer execute(Integer input) {
return input + 100;
}
}
public class StepTwo implements Step<Integer, Integer> {
@Override
public Integer execute(Integer input) {
return input + 500;
}
}
public class StepThree implements Step<Integer, String> {
@Override
public String execute(Integer input) {
return "The final amount is " + input;
}
}
Lớp đường ống sẽ giữ/đăng ký các bước trong đường ống và thực hiện chúng sau cái khác:
public class Pipeline {
private List<Step> pipelineSteps = new ArrayList<>();
private Object firstStepInput = 100;
public void addStep(Step step) {
pipelineSteps.add(step);
}
public void execute() {
for (Step step : pipelineSteps) {
Object out = step.execute(firstStepInput);
firstStepInput = out;
}
}
}
Diver program to execu te the pipeline:
public class Main {
public static void main(String[] args) {
Pipeline pipeline = new Pipeline();
pipeline.addStep(new StepOne());
pipeline.addStep(new StepTwo());
pipeline.addStep(new StepThree());
pipeline.execute();
}
}
Tuy nhiên, bạn có thể thấy việc triển khai ngây thơ có nhiều hạn chế.
Một trong những điều quan trọng là vì yêu cầu là đầu ra của mỗi bước có thể thuộc bất kỳ loại nào, việc triển khai ngây thơ không an toàn kiểu (phương thức thực hiện trong lớp Pipeline). Nếu tôi tình cờ kết nối các bước trong đường ống không chính xác, ứng dụng sẽ không thành công.
Bất cứ ai có thể giúp tôi thiết kế giải pháp bằng cách thêm vào những gì tôi đã mã hóa hay chỉ cho tôi một mẫu đã có để giải quyết vấn đề này?
[câu hỏi này] (http://stackoverflow.com/questions/5686332/pipeline-pattern-implementation-in-java) liên kết đến [tài liệu này] (http://parlab.eecs.berkeley.edu/wiki/_media/patterns/pipeline-v1.pdf) tham chiếu đến các mẫu. –
Cảm ơn bạn @NickBell vì đã trỏ tới bài báo. Tuy nhiên, thông qua bài báo, tôi không thể hiểu cách thức các đường ống có thể được thiết kế để nó có thể xử lý các giai đoạn/bước với các loại đầu ra khác nhau. –
Tôi sẽ cân nhắc xem xét [Java 1.8+ stream] (https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html) khi chúng cung cấp [chức năng] (https://docs.oracle.com/javase/tutorial/collections/streams/)/[doc's] (http://www.oracle.com/technetwork/articles/java/ma14-java-se-8-streams- 2177646.html) vào ví dụ bạn đã nêu. Xem tại đây cho [duplicate] (http://stackoverflow.com/questions/8680610/java-generics-chaining-together-generic-function-object) –