最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java經(jīng)典設(shè)計(jì)模式之責(zé)任鏈模式原理與用法詳解

 更新時(shí)間:2017年08月05日 12:12:58   作者:遲做總比不做強(qiáng)  
這篇文章主要介紹了Java經(jīng)典設(shè)計(jì)模式之責(zé)任鏈模式,簡單說明了責(zé)任鏈模式的概念、原理,并結(jié)合實(shí)例形式分析了java實(shí)現(xiàn)責(zé)任鏈模式的具體用法與相關(guān)注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了Java經(jīng)典設(shè)計(jì)模式之責(zé)任鏈模式。分享給大家供大家參考,具體如下:

責(zé)任鏈模式:多個(gè)對象由其對象對應(yīng)下家的引用連成一條鏈,請求在這個(gè)鏈上傳遞,直到鏈上的某一個(gè)接收對象處理此請求。因?yàn)檎埱蟮目蛻舳瞬⒉恢梨溕献罱K是誰來處理這個(gè)請求,使得系統(tǒng)可以在不影響客戶端的情況下動(dòng)態(tài)地重新組織和分配責(zé)任,從而避免了請求發(fā)送者與請求處理者之間的耦合。

責(zé)任鏈械中涉及到三種角色:

1,抽象處理者角色
2,具體處理者角色
3,請求發(fā)送者

小例子:假設(shè)去買房子,買房子就需要砍價(jià), 賣房的人職位不同,可以優(yōu)惠的價(jià)格也不同,不同職位就可以形成一個(gè)處理請求的鏈。我們暫定: * 基層銷售員,只能優(yōu)惠3% * 銷售經(jīng)理:可以優(yōu)惠5% * 銷售總監(jiān):可以優(yōu)惠8% * 老板(Boss):優(yōu)惠10%

直接上代碼:

/**
 * 抽象處理者(Handler)角色:處理請求的接口。如果需要,接口可以定義 出一個(gè)方法以設(shè)定和返回對下家的引用。
 * 這個(gè)角色通常由一個(gè)Java抽象類或者Java接口實(shí)現(xiàn)。抽象方法handlePriceRequest()規(guī)范了子類處理請求的操作。
 * @date 2015-12-24 上午11:26:56
 */
public abstract class RoomRateHandler {
protected RoomRateHandler mHandler;
//直接由子類繼承,用于傳遞請求
public void setPriceHandler(RoomRateHandler mHandler){
this.mHandler=mHandler;
}
//處理具體問題:處理價(jià)格請求
public abstract void handlePriceRequest(float discount);
/**
* 設(shè)置請求處理鏈的層次關(guān)系 ,獲取處理請求的對象
* @description:
* @date 2015-12-24 上午11:51:54
*/
public static RoomRateHandler cretateHandler(){
RoomRateHandler salesMan=new SalesMan();
RoomRateHandler salesManager=new SalesManager();
RoomRateHandler saleDirector=new SalesDirector();
RoomRateHandler topManager=new TopManager();
salesMan.setPriceHandler(salesManager);
salesManager.setPriceHandler(saleDirector);
saleDirector.setPriceHandler(topManager);
return salesMan;
}
} 

具體處理者(SalesMan)角色

/**
 * 具體處理者(SalesMan)角色:具體處理者(SalesDirector)角色:具體處理者收到請求后,可以選擇處理請求,也可以將請求傳給下家(上級(jí))。
 * 具體處理者都持有對鏈上下家(上級(jí))對象的引用,因此具體處理者把請求傳遞下去。
 * @description:
 * @date 2015-12-24 上午11:29:16
 */
public class SalesMan extends RoomRateHandler {
@Override
public void handlePriceRequest(float discount) {
if(discount<=0.03){
System.out.format("%s批準(zhǔn)了:%.3f%n","業(yè)務(wù)員",discount);
}else{
mHandler.handlePriceRequest(discount);
}
}
}

具體處理者(SalesManager)角色

public class SalesManager extends RoomRateHandler {
@Override
public void handlePriceRequest(float discount) {
if(discount<=0.08){
System.out.format("%s批準(zhǔn)了:%.3f%n","銷售經(jīng)理",discount);
}else{
mHandler.handlePriceRequest(discount);
}
}
}

具體處理者(SalesDirector )角色

public class SalesDirector extends RoomRateHandler {
@Override
public void handlePriceRequest(float discount) {
if(discount<=0.05){
System.out.format("%s批準(zhǔn)了:%.3f%n","銷售總監(jiān)",discount);
}else{
mHandler.handlePriceRequest(discount);
}
}
}

具體處理者(TopManager)角色

/**
 * 具體處理者(TopManager)角色:因?yàn)楫?dāng)前 角色已經(jīng)處于鏈尾,所以是最終處理了。
 * @description:
 * @author ldm
 * @date 2015-12-24 上午11:29:16
 */
public class TopManager extends RoomRateHandler {
@Override
public void handlePriceRequest(float discount) {
if (discount <= 0.1) {
System.out.format("%s批準(zhǔn)了:%.3f%n", "老板", discount);
}
else {
System.out.format("%s不同意:%.3f%n", "老板", discount);
}
}
}

請求發(fā)送者

/**
 * 發(fā)出請求的客戶(模擬買房子的人)
 * @description:
 * @author ldm
 * @date 2015-12-24 上午11:35:54
 */
public class Customer {
private RoomRateHandler mHandler;
public void setPriceHandler(RoomRateHandler mHandler) {
this.mHandler = mHandler;
}
public void requestDiscount(float discount) {
mHandler.handlePriceRequest(discount);
}
public static void main(String[] args) {
Customer customer = new Customer();
customer.setPriceHandler(RoomRateHandler.cretateHandler());//獲取處理對象,站你面前的可能是老板,也可能是業(yè)務(wù)員...
Random random = new Random();
for (int i = 0; i < 8; i++) {// 隨機(jī)構(gòu)造8個(gè)買房子的人
System.out.println(i + "---");
customer.requestDiscount(random.nextFloat()/10);//處理價(jià)格(談判)
}
}
}

處理結(jié)果

如果要增加層級(jí)怎么辦呢?很簡單,比如增加銷售主管SalesSupervisor,我們只需要新建一個(gè)類SalesSupervisor extends RoomRateHandler,實(shí)現(xiàn)處理方法handlePriceRequest(float discount);同時(shí)不要忘記在RoomRateHandler類中cretateHandler()中設(shè)置好對應(yīng)的層級(jí)鏈就可以啦。

更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總

希望本文所述對大家java程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • 一文詳解Lombok中@ToString()的使用技巧

    一文詳解Lombok中@ToString()的使用技巧

    在平時(shí)我們工作的時(shí)候,我們經(jīng)常會(huì)使用toString()?方法來輸出一個(gè)對象的一些屬性信息。Lombok?給我們提供了一個(gè)自動(dòng)生成?toString()代碼的注解,可以減少代碼行數(shù),本文就來和大家詳細(xì)聊聊吧
    2023-02-02
  • Spring boot集中異常處理方法實(shí)例

    Spring boot集中異常處理方法實(shí)例

    這篇文章主要介紹了Spring boot集中異常處理方法實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • springBoot整合shiro如何解決讀取不到@value值問題

    springBoot整合shiro如何解決讀取不到@value值問題

    這篇文章主要介紹了springBoot整合shiro如何解決讀取不到@value值問題,具有很好的參考價(jià)值,希望對大家有所幫助,
    2023-08-08
  • 詳解JAVA 七種創(chuàng)建單例的方法

    詳解JAVA 七種創(chuàng)建單例的方法

    這篇文章主要介紹了詳解JAVA 七種創(chuàng)建單例的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • 關(guān)于IDEA中spring-cloud-starter-alibaba-nacos-discovery 無法引入問題

    關(guān)于IDEA中spring-cloud-starter-alibaba-nacos-discovery 無法引入問題

    這篇文章主要介紹了關(guān)于IDEA中spring-cloud-starter-alibaba-nacos-discovery 無法引入問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • 詳解java 中Spring jsonp 跨域請求的實(shí)例

    詳解java 中Spring jsonp 跨域請求的實(shí)例

    這篇文章主要介紹了詳解java 中Spring jsonp 跨域請求的實(shí)例的相關(guān)資料,jsonp 可用于解決主流瀏覽器的跨域數(shù)據(jù)訪問的問題,需要的朋友可以參考下
    2017-08-08
  • java實(shí)現(xiàn)ftp文件上傳下載功能

    java實(shí)現(xiàn)ftp文件上傳下載功能

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)ftp文件上傳下載功能的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • eclipse實(shí)現(xiàn)ECDSA數(shù)字簽名

    eclipse實(shí)現(xiàn)ECDSA數(shù)字簽名

    這篇文章主要為大家詳細(xì)介紹了eclipse實(shí)現(xiàn)ECDSA數(shù)字簽名,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • java項(xiàng)目實(shí)現(xiàn)猜拳小游戲

    java項(xiàng)目實(shí)現(xiàn)猜拳小游戲

    這篇文章主要為大家詳細(xì)介紹了java項(xiàng)目實(shí)現(xiàn)猜拳小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • 淺談springMVC接收前端json數(shù)據(jù)的總結(jié)

    淺談springMVC接收前端json數(shù)據(jù)的總結(jié)

    下面小編就為大家分享一篇淺談springMVC接收前端json數(shù)據(jù)的總結(jié),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03

最新評(píng)論

伊川县| 闻喜县| 读书| 凤庆县| 山阳县| 阜宁县| 乡城县| 榕江县| 九台市| 仁化县| 河南省| 贡觉县| 宣恩县| 凤阳县| 五常市| 扶风县| 南宁市| 邵东县| 同江市| 油尖旺区| 门源| 敦化市| 印江| 潞城市| 定西市| 宕昌县| 永嘉县| 陇南市| 盖州市| 南宁市| 临潭县| 饶阳县| 定安县| 汤原县| 桃源县| 宜丰县| 会同县| 通海县| 迭部县| 墨竹工卡县| 龙陵县|