責任鏈設計模式傳統的實現方式:
public class TestMaxBy {
public static void main(String[] args) {
CookieStep1 step1 = new CookieStep1();
step1.setSuccessor(new CookieStep2());
Cookie cookie = step1.handle(new Cookie());
System.out.println(cookie);
}
}
abstract class ProcessStep<T>{
private ProcessStep<T> successor;
public void setSuccessor(ProcessStep<T> s){
this.successor = s;
}
public T handle(T t){
T t2 = dealWith(t);
if(successor != null){
return successor.handle(t2);
}
return t2;
}
abstract T dealWith(T t);
}
class CookieStep1 extends ProcessStep<Cookie>{
@Override
Cookie dealWith(Cookie cookie) {
cookie.setFlavor("Blue berry");
return cookie;
}
}
class CookieStep2 extends ProcessStep<Cookie>{
@Override
Cookie dealWith(Cookie cookie) {
cookie.setWrapper("Dedicated plastic bag");
return cookie;
}
}
class Cookie{
private String wrapper;
private String flavor;
public void setWrapper(String wrapper) {
this.wrapper = wrapper;
}
public void setFlavor(String flavor) {
this.flavor = flavor;
}
public String toString(){
return flavor + " in a " + wrapper;
}
}
用lambda簡化後的責任鏈模式:
import java.util.function.Function;
import java.util.function.UnaryOperator;
public class ResponsibilityChain {
public static void main(String[] args) {
UnaryOperator<Cookie> operator1 = (cookie) -> {cookie.setFlavor("milk"); return cookie;};
UnaryOperator<Cookie> operator2 = (cookie) -> {cookie.setWrapper("dedicated plastic bag"); return cookie;};
Function<Cookie, Cookie> func = operator1.andThen(operator2);
Cookie cookie = func.apply(new Cookie());
System.out.println(cookie);
}
}
class Cookie{
private String wrapper;
private String flavor;
public void setWrapper(String wrapper) {
this.wrapper = wrapper;
}
public void setFlavor(String flavor) {
this.flavor = flavor;
}
public String toString(){
return flavor + " in a " + wrapper;
}
}