Java設計模式大發平臺出售一 責任鏈模式
一直都想對設大發平臺出售QQ2952777280【話仙原始碼論壇】hxforum.com 計模式有一個深刻的認識Java設計模式一 責任鏈模式,這樣對於閱讀原始碼的時候就不會那麼吃力了。於是有了想要記錄下設計模式的筆記。打算從自己不怎麼熟悉的設計模式開始寫,裡面穿插著一點自己的想法,希望自己寫完後,會又一個更深刻的理解和流暢的表述。
介紹
為請求建立了一個接受者的鏈,通常一個接收者包含下一個接受者的引用,如果該物件不能處理該請求,就傳給下一個。依次類推,直到有處理的物件為止。
應用例項:jsp servlet的Filter,js中的事件冒泡
例子
通過一個例子來深刻的認識他。以前古代女子都遵從著三從四德,三從:一從父親,二從丈夫,三從兒子。
也就是在家聽父親的,嫁人後,聽丈夫的,喪夫後,聽兒子的。
那麼現在呢,人人平等,那麼我就說以後吧,一步小心就是男子三從四德了,那麼針對男子進行三從四德進行程式碼演練。一男子想買鍵盤,先從母親開始問起,如果母親不想理你 ,你就問你妻子,你妻子不理你,你就問你女兒,你女兒也不理,你就啥也不能買。
程式碼
抽象未來男子人類
/**
- @ClassName Human
- @Description 人類
- @Author ouyangkang
-
@Date 2018-11-05 10:02
/
public abstract class Human {
/- @Author ouyangkang
- @Description 發起請求
- @Date 10:04 2018/11/5
- @param
- @return void
**/
public abstract void request();
/**
- @Author ouyangkang
- @Description 獲取請求的型別
- @Date 10:05 2018/11/5
- @param
- @return java.lang.Integer
**/
public abstract Integer getType();
}
具體實現
/**
- @ClassName Man
- @Description 未來男子
- @Author ouyangkang
-
@Date 2018-11-05 10:07
**/
public class Man extends Human {/**
- @Date 2018/11/5 10:09
- @Description 請求
**/
private String request;
/**
- @Date 2018/11/5 10:14
- @Description 1 為入贅 2 已入贅 3 喪妻
**/
private Integer type ;
@Override
public void request() {
System.out.println(request);
}@Override
public Integer getType() {
return this.type;
}public Man(String request, Integer type){
this.request = request;
this.type = type;
}
}
處理抽象鏈
/**
- @ClassName Handler
- @Description 責任鏈
- @Author ouyangkang
-
@Date 2018-11-05 10:15
**/
public abstract class Handler {public static final Integer MOTHER_LEVEL = 1;
public static final Integer WIFE_LEVEL = 2;
public static final Integer DAUGHTER_LEVEL = 3;
public Integer level;
/**
- @Date 2018/11/5 10:16
- @Description 下一個處理者
**/
private Handler nexHandler;
public Handler(Integer level){
this.level = level;
}/**
- @Author ouyangkang
- @Description 處理資訊
- @Date 10:27 2018/11/5
- @param human
-
@return void
**/
public void handleMessage(Human human){
if (this.level.equals(human.getType())){
this.response(human);
}else {
if (nexHandler != null){
//傳遞給下一個處理物件
this.nexHandler.handleMessage(human);
}else {
System.out.println("---------------");
human.request();
System.out.println("沒有處理的人了");
}}
}
/**
- @Author ouyangkang
- @Description 回覆未來男子的請求
- @Date 10:18 2018/11/5
- @param
- @return void
**/
public abstract void response(Human human);
public void setNexHandler(Handler nexHandler){
this.nexHandler = nexHandler;
}
}
具體實現
/** - @ClassName Mather
- @Description 母親
- @Author ouyangkang
-
@Date 2018-11-05 10:28
**/
public class Mather extends Handler {public Mather(){
super(Handler.MOTHER_LEVEL);
}@Override
public void response(Human human) {
System.out.println("-----------------");
human.request();
System.out.println("媽媽愛你 當然同意啦");
}
}
/**
- @ClassName Wife
- @Description TODO
- @Author ouyangkang
-
@Date 2018-11-05 10:46
**/
public class Wife extends Handler {public Wife() {
super(Handler.WIFE_LEVEL);
}@Override
public void response(Human human) {
System.out.println("-----------------");
human.request();
System.out.println("");
}
}
/** - @ClassName Wife
- @Description TODO
- @Author ouyangkang
-
@Date 2018-11-05 10:46
**/
public class Wife extends Handler {public Wife() {
super(Handler.WIFE_LEVEL);
}@Override
public void response(Human human) {
System.out.println("-----------------");
human.request();
System.out.println("上次你那個機械鍵盤不是還能用嗎 不給買");
}
}
/** - @ClassName Daughter
- @Description TODO
- @Author ouyangkang
-
@Date 2018-11-05 10:48
**/
public class Daughter extends Handler {public Daughter() {
super(Handler.DAUGHTER_LEVEL);
}@Override
public void response(Human human) {
System.out.println("-----------------");
human.request();
System.out.println("給糖吃就同意");
}
}
客戶端
/** - @ClassName Main
- @Description TODO
- @Author ouyangkang
-
@Date 2018-11-05 10:49
**/
public class Main {
public static void main(String[] args) {
Random random = new Random();
for (int i = 0 ;i < 5;i++){
Human human = new Man("我要買鍵盤", random.nextInt(4));
Handler mather = new Mather();
Handler wife = new Wife();
Handler daughter = new Daughter();
mather.setNexHandler(wife);
wife.setNexHandler(daughter);
mather.handleMessage(human);}
}
}
返回結果我要買鍵盤
給糖吃就同意我要買鍵盤
上次你那個機械鍵盤不是還能用嗎 不給買我要買鍵盤
上次你那個機械鍵盤不是還能用嗎 不給買我要買鍵盤
媽媽愛你 當然同意啦我要買鍵盤
沒有處理的人了