精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Java 8 重構(gòu)傳統(tǒng)設(shè)計模式,是真的優(yōu)雅

開發(fā) 前端
什么時候該用lambda,什么時候不用,這是要看情況的,如果處理邏輯相對比較簡單,可以用lamdba來重構(gòu),以便讓代碼更簡潔易讀,如果處理邏輯很復(fù)雜,應(yīng)該還是用“類”。?

java8中提供的很多新特性可以用來重構(gòu)傳統(tǒng)設(shè)計模式中的寫法,下面是一些示例:

1. 策略模式

上圖是策略模式的類圖,假設(shè)我們現(xiàn)在要保存訂單,OrderService接口定義要做什么,而NoSqlSaveOrderStragegy以及MySqlSaveOrderStrategy則提供了二種策略,分別是保存到nosql數(shù)據(jù)庫,以及傳統(tǒng)的mysql關(guān)系型數(shù)據(jù)庫,最后在OrderServiceExecutor中通過構(gòu)造函數(shù)注入最終要使用的策略。

傳統(tǒng)寫法,這個場景至少得4個類,代碼如下:

OrderService接口:

public interface OrderService {
    void saveOrder(String orderNo);
}

Mysql策略實現(xiàn):

public class MySqlSaveOrderStrategy implements OrderService {
    @Override
    public void saveOrder(String orderNo) {
        System.out.println("order:" + orderNo + " save to mysql");
    }
}

Nosql策略實現(xiàn):

public class NoSqlSaveOrderStrategy implements OrderService {
    @Override
    public void saveOrder(String orderNo) {
        System.out.println("order:" + orderNo + " save to nosql");
    }
}

使用策略的輔助"容器":

public class OrderServiceExecutor {

    private final OrderService service;

    public OrderServiceExecutor(OrderService service) {
        this.service = service;
    }

    public void save(String orderNo) {
        this.service.saveOrder(orderNo);
    }

}

運行測試類:

public class OrderServiceTest {
    public static void main(String[] args) {
        OrderServiceExecutor executor1 = new OrderServiceExecutor(new MySqlSaveOrderStrategy());
        executor1.save("001");
        OrderServiceExecutor executor2 = new OrderServiceExecutor(new NoSqlSaveOrderStrategy());
        executor2.save("002");
    }
}

重構(gòu)后,可以省去2個策略實現(xiàn)類,代碼如下:

public static void main(String[] args) {
    OrderServiceExecutor executor1 = new OrderServiceExecutor((String orderNo) -> System.out.println("order:" + orderNo + " save to mysql"));
    executor1.save("001");

    OrderServiceExecutor executor2 = new OrderServiceExecutor((String orderNo) -> System.out.println("order:" + orderNo + " save to nosql"));
    executor2.save("002");
}

2. 模板方法

類圖如下,核心思路是把一些通用的標(biāo)準(zhǔn)方法,在抽象父類里僅定義方法簽名,實現(xiàn)邏輯交給子類。

比如:會員系統(tǒng)中,每個商家都會有一些營銷活動,需要推送某種信息給會員,但是不同的商家推送的內(nèi)容可能不同,有些需要推送優(yōu)惠券,有些需要積分通知。

抽象模板類:

public abstract class AbstractPushTemplate {

    public void push(int customerId, String shopName) {
        System.out.println("準(zhǔn)備推送...");
        execute(customerId, shopName);
        System.out.println("推送完成\n");
    }

    abstract protected void execute(int customerId, String shopName);
}

優(yōu)惠券的具體模板:

public class PushCouponTemplate extends AbstractPushTemplate {

    @Override
    protected void execute(int customerId, String shopName) {
        System.out.println("會員:" + customerId + ",你好," + shopName + "送您一張優(yōu)惠券");
    }
}

積分的具體模板:

public class PushScoreTemplate extends AbstractPushTemplate {

    @Override
    protected void execute(int customerId, String shopName) {
        System.out.println("會員:" + customerId + ",你好," + shopName + "送您10個積分");
    }
}

使用示例:

AbstractPushTemplate template1 = new PushCouponTemplate();
template1.push(1, "糖果店");

AbstractPushTemplate template2 = new PushScoreTemplate();
template2.push(1, "服裝店");

顯然如果模板的實現(xiàn)方式越多,子類就越多。

使用java8重構(gòu)后,可以把上面的3個模板(包括抽象類模板)減少到1個,參考下面:

public class PushTemplateLambda {

    public void push(int customerId, String shopName, Consumer<Object[]> execute) {
        System.out.println("準(zhǔn)備推送...");
        Object[] param = new Object[]{customerId, shopName};
        execute.accept(param);
        System.out.println("推送完成\n");
    }
}

借助Consumer<T>這個function interface,可以省去實現(xiàn)子類,具體的實現(xiàn)留到使用時再來決定,如:

new PushTemplateLambda().push(1, "糖果店", (Object[] obj) -> {
    System.out.println("會員:" + obj[0] + ",你好," + obj[1] + "送您一張優(yōu)惠券");
});

new PushTemplateLambda().push(1, "服裝店", (Object[] obj) -> {
    System.out.println("會員:" + obj[0] + ",你好," + obj[1] + "送您10個積分");
});

3. 觀察者模式

思路:基于某個Subject主題,然后一堆觀察者Observer注冊到主題上,有事件發(fā)生時,subject根據(jù)注冊列表,去通知所有的observer。

Observer接口:

public interface Observer {
    void notify(String orderNo);
}

Subject接口:

public interface Subject {
    void registerObserver(Observer o);
    void notifyAllObserver(String orderNo);
}

Subject接口實現(xiàn):

public class SubjectImpl implements Subject {
    private final List<Observer> list = new ArrayList<>();
    @Override
    public void registerObserver(Observer o) {
        list.add(o);
    }
    @Override
    public void notifyAllObserver(String orderNo) {
        list.forEach(c -> c.notify(orderNo));
    }
}

觀察者的二個實現(xiàn):

OrderObserver:

public class OrderObserver implements Observer {
    @Override
    public void notify(String orderNo) {
        System.out.println("訂單 " + orderNo + " 狀態(tài)更新為【已支付】");
    }
}

StockObserver:

public class StockObserver implements Observer {
    @Override
    public void notify(String orderNo) {
        System.out.println("訂單 " + orderNo + " 已通知庫房發(fā)貨!");
    }
}

測試一把:

static void test1() {
    Subject subject = new SubjectImpl();
    subject.registerObserver(new OrderObserver());
    subject.registerObserver(new StockObserver());
    subject.notifyAllObserver("001");
}

用java8重構(gòu)后,接口可以提供默認(rèn)實現(xiàn)方法,我們弄一個新的主題接口。

public interface NewSubject {

    List<Observer> list = new ArrayList<>();

    default void registerObserver(Observer o) {
        list.add(o);
    }

    default void nofityAllObserver(String orderNo) {
        list.forEach(c -> c.notify(orderNo));
    }
}

使用:

static void test2() {
    NewSubject subject = new NewSubject() {
    };
    subject.registerObserver((String orderNo) -> System.out.println("訂單 " + orderNo + " 狀態(tài)更新為【已支付】"));
    subject.registerObserver((String orderNo) -> System.out.println("訂單 " + orderNo + " 已通知庫房發(fā)貨!"));
    subject.nofityAllObserver("002");
}

只用2個接口實現(xiàn)了觀察者模式。

4. 責(zé)任鏈/職責(zé)鏈模式

核心思想:每個處理環(huán)節(jié),都有一個“指針”指向下一個處理者,類似鏈表一樣。

Processor接口:

public interface Processor {

    Processor getNextProcessor();

    void process(String param);
}

抽象實現(xiàn)類:

public abstractclass AbstractProcessor implements Processor {

    private Processor next;

    public AbstractProcessor(Processor processor) {
        this.next = processor;
    }

    @Override
    public Processor getNextProcessor() {
        return next;
    }

    @Override
    public abstract void process(String param);
}

定義2個具體的實現(xiàn):

public class ProcessorImpl1 extends AbstractProcessor {

    public ProcessorImpl1(Processor processor) {
        super(processor);
    }

    @Override
    public void process(String param) {
        System.out.println("processor 1 is processing:" + param);
        if (getNextProcessor() != null) {
            getNextProcessor().process(param);
        }
    }
}

public class ProcessorImpl2 extends AbstractProcessor {

    public ProcessorImpl2(Processor next) {
        super(next);
    }

    @Override
    public void process(String param) {
        System.out.println("processor 2 is processing:" + param);
        if (getNextProcessor() != null) {
            getNextProcessor().process(param);
        }
    }
}

使用示例:

static void test1() {
    Processor p1 = new ProcessorImpl1(null);
    Processor p2 = new ProcessorImpl2(p1);
    p2.process("something happened");
}

用java8重構(gòu)后,只需要一個新接口。

@FunctionalInterface
public interface NewProcessor {
    Consumer<String> process(String param);
}

同樣的效果,可以寫得很簡潔:

static void test2() {
    Consumer<String> p1 = param -> System.out.println("processor 1 is processing:" + param);
    Consumer<String> p2 = param -> System.out.println("processor 2 is processing:" + param);
    p2.andThen(p1).accept("something happened");
}

andThen天然就是getNextProcessor的另一種表達(dá)。

重要提示:什么時候該用lambda,什么時候不用,這是要看情況的,如果處理邏輯相對比較簡單,可以用lamdba來重構(gòu),以便讓代碼更簡潔易讀,如果處理邏輯很復(fù)雜,應(yīng)該還是用“類”。

責(zé)任編輯:武曉燕 來源: 一安未來
相關(guān)推薦

2022-08-19 08:39:34

OrderMySql數(shù)據(jù)庫

2024-08-06 09:43:54

Java 8工具編程

2021-11-16 12:02:29

Java代碼集合

2023-11-02 09:02:55

Java模式

2024-10-14 11:08:53

程序異常延遲

2012-05-15 01:16:19

開發(fā)重構(gòu)Java

2024-02-23 08:57:42

Python設(shè)計模式編程語言

2015-08-11 09:39:25

重構(gòu)提高代碼質(zhì)量

2021-11-29 10:27:24

設(shè)計模式程序員

2017-03-20 18:03:51

2025-10-27 01:33:00

if-else代碼重構(gòu)

2013-08-15 10:58:47

云計算SaaS企業(yè)應(yīng)用

2019-01-15 10:49:57

傳統(tǒng)存儲私有云塊存儲

2013-05-22 10:30:57

SDN軟件定義網(wǎng)絡(luò)網(wǎng)絡(luò)架構(gòu)

2019-03-21 15:30:05

JavaStream性能

2021-07-29 14:42:55

設(shè)計模式Java

2022-07-04 07:37:51

模板模式重構(gòu)

2020-05-14 14:48:15

架構(gòu)模式單庫

2018-10-07 06:30:40

代碼設(shè)計模式面向?qū)ο笤瓌t

2010-03-04 09:46:38

Ubuntu PC
點贊
收藏

51CTO技術(shù)棧公眾號

日产亚洲一区二区三区| 一级黄色在线播放| 黄色国产在线| 精品一区二区久久| 亚州精品天堂中文字幕| 蜜乳av中文字幕| 韩国一区二区三区视频| 欧美日韩国产激情| 亚洲人成影视在线观看| 高潮毛片7777777毛片| 肉色丝袜一区二区| 欧美夫妻性生活视频| 少妇人妻好深好紧精品无码| 免费观看亚洲天堂| 在线观看日韩电影| 999在线观看视频| 日本免费在线视频| 久久久综合网站| 99视频在线免费观看| 中文无码av一区二区三区| 国产精品啊啊啊| www.国产精品一二区| 艳妇乳肉亭妇荡乳av| 国产高清日韩| 欧美日韩亚洲综合一区二区三区| 久久国产精品网| 麻豆影院在线| 国产女人aaa级久久久级 | **精品中文字幕一区二区三区| 午夜不卡在线视频| 国产亚洲精品久久久久久久| 自拍视频在线免费观看| 久久人人超碰精品| 国产在线观看一区| 亚洲国产视频一区二区三区| 激情久久久久久久久久久久久久久久| 国产91久久婷婷一区二区| 国产午夜福利精品| 国产综合视频| 欧美成人免费观看| 三上悠亚作品在线观看| 欧美精品乱码| 亚洲一区av在线播放| 亚洲成人日韩在线| 女人抽搐喷水高潮国产精品| 精品成人在线观看| 亚洲精品鲁一鲁一区二区三区 | 黄色网址视频在线观看| 久久久久久一二三区| 精品91免费| 色欲av伊人久久大香线蕉影院| 国产精品资源网| 亚洲a∨日韩av高清在线观看| 国产精品国产精品国产专区| 蜜桃91丨九色丨蝌蚪91桃色| 国产精品久久久久免费a∨| 国产精品露脸视频| 青青草91视频| 国产情人节一区| 91午夜交换视频| 激情五月婷婷综合| 91网免费观看| 黄色片一区二区| 99视频国产精品| 国内精品二区| 国产亚洲依依| 国产精品欧美一级免费| 国产精品美女在线播放| av网址在线| 一区二区三区免费在线观看| 男女私大尺度视频| 乡村艳史在线观看| 欧美亚洲高清一区| 亚洲18在线看污www麻豆| 久久伊人影院| 亚洲黄页视频免费观看| 一道本在线观看| 99精品在线| 久久久噜噜噜久久中文字免| 国产专区第一页| 九九国产精品视频| 99一区二区三区| 你懂得在线网址| 成人免费在线播放视频| 黄色成人在线看| 澳门av一区二区三区| 欧美一区二区三区四区高清| 日本一区二区在线免费观看| 波多野结衣在线播放一区| 久久精品视频导航| 99精品视频99| 久久国产精品第一页| 国产精品美女诱惑| 成人精品一区二区三区校园激情| 亚洲免费在线观看视频| 国产一区二区在线视频播放| 玖玖精品在线| 亚洲高清一二三区| 1024在线看片| a91a精品视频在线观看| 国产欧美精品久久久| 人人妻人人玩人人澡人人爽| 国产女人水真多18毛片18精品视频 | 亚洲欧洲日本精品| 欧美a级网站| 久久精品小视频| 国产99久久久| 国产成人免费视频网站高清观看视频| 任我爽在线视频精品一| 免费av不卡在线观看| 欧美性猛交xxxx黑人交| 波多野结衣视频播放| 天天做天天爱天天综合网2021 | 天天干天天干天天操| 国产又黄又大久久| 日韩欧美一区二区三区四区| h片在线观看下载| 欧美日韩国产一二三| 玖玖爱在线观看| 狠狠入ady亚洲精品经典电影| 国产日韩一区在线| 户外极限露出调教在线视频| 亚洲va韩国va欧美va| 爱豆国产剧免费观看大全剧苏畅| 国产不卡av一区二区| 午夜精品福利在线观看| 国产成人免费看一级大黄| 国产无人区一区二区三区| 成人精品视频在线播放| 欧美一级大片在线视频| 在线视频中文亚洲| 亚洲中文无码av在线| 97久久人人超碰| 日韩成人手机在线| 麻豆一区在线| 久久天天躁夜夜躁狠狠躁2022| 五月天中文字幕| 久久久噜噜噜久噜久久综合| 国产在线青青草| 欧美成人专区| 78m国产成人精品视频| 日韩一级免费视频| 亚洲妇熟xx妇色黄| 911亚洲精选| 伊人久久综合| 国产伦精品一区二区三区高清| 日本无删减在线| 亚洲精品在线观| 国产精品第一页在线观看| 国产成人免费高清| 欧日韩免费视频| 老司机aⅴ在线精品导航| 97精品久久久| 男人av在线| 在线观看网站黄不卡| 人妻精品久久久久中文| 免费观看成人鲁鲁鲁鲁鲁视频| 亚洲高清乱码| 国产午夜亚洲精品一级在线| 欧美精品在线免费| 日韩在线观看视频网站| 一本久久a久久免费精品不卡| 成年人免费观看视频网站| 日本不卡视频在线| 一区一区视频| 一区二区视频| 2019中文字幕免费视频| 国产在线观看免费网站| 欧美日韩免费视频| 青青草免费av| 99re66热这里只有精品3直播| 久久国产乱子伦免费精品| 国产一区二区三区天码| 91免费在线视频网站| 搞黄网站在线看| 亚洲色图美腿丝袜| 国产精品爽爽久久久久久| 亚洲国产视频一区二区| 国产特级黄色录像| 韩国精品在线观看| 欧美极品欧美精品欧美| 国产日产一区 | 久久精品色综合| 日本亚洲欧美三级| 国产在线观看av| 亚洲国产中文字幕在线观看| 男操女视频网站| 亚洲精选视频在线| 欧美图片第一页| 国产一区二区三区免费| 草草久久久无码国产专区| 四季av一区二区凹凸精品| 成人3d动漫一区二区三区91| 日日夜夜天天综合| 欧美激情亚洲国产| 国产视频第一区| 日韩美女视频在线| 中国女人真人一级毛片| 亚洲地区一二三色| 日本 欧美 国产| 91免费版在线| 夜夜爽久久精品91| 视频在线观看国产精品| 日产精品久久久久久久蜜臀| 成人一级毛片| 久久偷看各类wc女厕嘘嘘偷窃| 国产精品美女久久久久| 国产精品91久久久久久| 黄色小说在线播放| 深夜福利91大全| 青青草视频在线免费观看| 欧美一级艳片视频免费观看| 在线观看国产区| 午夜日韩在线观看| 波多野结衣在线网址| 国产欧美一区二区三区沐欲| 国产原创剧情av| 韩国女主播成人在线| 精品久久久久久久无码| 一本久道久久综合狠狠爱| 男人草女人视频| 天天久久综合| 亚洲视频精品一区| 久久综合亚洲| 久久久久久国产精品mv| 91精品国产自产在线丝袜啪 | 亚洲老女人视频免费| 国产精品乱子乱xxxx| 免费欧美网站| 91在线免费观看网站| 九九九精品视频| 国产精品久久久久久久久免费看 | 亚洲二区在线| 男人c女人视频| 永久91嫩草亚洲精品人人| 中文字幕日韩一区二区三区不卡| 精品国产不卡| 日韩妆和欧美的一区二区| 欧美美乳视频| 日韩精品国内| 日韩亚洲一区在线| 亚洲精品成人久久久998| 超碰成人久久| 亚洲草草视频| 国产精品成人一区二区不卡| 亚洲春色综合另类校园电影| 久久免费精品视频在这里| 亚洲欧洲国产精品久久| 欧美伦理在线视频| 在线观看亚洲视频啊啊啊啊| 91蜜臀精品国产自偷在线| 中文精品视频一区二区在线观看| 久久久久久久久久久久久久久久久久 | 亚洲成人免费在线观看| 好吊操这里只有精品| 色婷婷香蕉在线一区二区| 天天天天天天天干| 欧美肥妇毛茸茸| 亚洲国产成人精品一区二区三区| 亚洲成人久久网| 手机亚洲第一页| 亚洲午夜精品久久久久久性色| 成人在线播放视频| 久久成年人免费电影| 毛片在线网址| 热re91久久精品国99热蜜臀| 99只有精品| 91香蕉亚洲精品| 国产精品极品| 青青成人在线| 欧美黄在线观看| 国产精品沙发午睡系列| 青青草伊人久久| 国产亚洲精品成人a| 91免费精品国自产拍在线不卡| 欧美福利第一页| 亚洲女人的天堂| www.国产色| 欧美日韩国产免费一区二区| 成 人 黄 色 片 在线播放 | 蜜芽在线免费观看| 欧美激情aaaa| 写真福利精品福利在线观看| 91网站免费观看| 曰本一区二区三区视频| 一区高清视频| 久久国产精品久久w女人spa| 欧美特黄aaa| 91美女在线视频| 欧美爱爱免费视频| 欧美午夜片在线免费观看| 在线观看中文字幕码| 亚洲精品国产欧美| 黄色在线视频网站| 日本在线观看天堂男亚洲| 精品视频在线观看免费观看| 日韩经典在线视频| 狠狠爱www人成狠狠爱综合网| www.亚洲高清| 99久久精品99国产精品| 男女性高潮免费网站| 一本大道久久a久久综合| 亚洲AV无码精品国产| 色偷偷亚洲男人天堂| 樱桃视频成人在线观看| 国产精品成人一区二区三区| 99久久夜色精品国产亚洲1000部 | 韩日欧美一区二区三区| 欧美丰满少妇人妻精品| 一区二区三区中文字幕电影| 中文在线免费观看| 日韩美女av在线| 丁香花在线观看完整版电影| 国产在线播放不卡| 欧美另类69xxxxx| 久久久久久久激情| 成人免费高清视频| 国产在线一卡二卡| 欧美日韩你懂的| 搞黄视频免费在线观看| 欧美在线国产精品| 嗯用力啊快一点好舒服小柔久久| 黄色网址在线免费看| 久久激情五月激情| 欧美一区二区三区粗大| 在线观看国产精品网站| 日韩有码电影| 91精品国产网站| 精品三级在线观看视频| youjizz.com在线观看| 国产美女精品在线| 国产精品视频一区二区在线观看| 欧美影院一区二区| 1769视频在线播放免费观看| 国产成人亚洲综合91| 国产成人影院| 可以在线看的黄色网址| 久久一区二区三区四区| 九九热在线视频播放| 亚洲精品国产精品国自产在线 | 无码人妻丰满熟妇啪啪网站| 亚洲乱码国产乱码精品精98午夜| 一区二区www| 操91在线视频| 日本在线视频一区二区三区| 日韩精品福利片午夜免费观看| 国产美女娇喘av呻吟久久| 国产一区二区播放| 欧美成人精精品一区二区频| 毛片在线网址| 久久久久久a亚洲欧洲aⅴ| 久久久久久自在自线| 人人妻人人澡人人爽| 欧美视频在线观看一区| 成人区精品一区二区不卡| 91亚洲国产精品| 好吊一区二区三区| 老司机免费视频| 色婷婷亚洲婷婷| 一级毛片视频在线| 91亚洲人电影| 影音先锋一区| 免费污网站在线观看| 欧美日韩一卡二卡三卡| 1区2区在线观看| 精品无码久久久久久久动漫| 爽好久久久欧美精品| 亚洲天堂一级片| 精品毛片乱码1区2区3区| 韩国成人漫画| 一区精品视频| aaa亚洲精品| 中文字幕+乱码+中文字幕明步 | 亚洲成人久久电影| 日韩a**中文字幕| 青少年xxxxx性开放hg| 成人av在线网站| 亚洲大尺度在线观看| 欧美超级乱淫片喷水| 亚州国产精品| 国内av免费观看| 欧美日韩国产一区二区| 日本三级在线视频| 国产伦精品一区二区三区四区免费| 久久午夜av| 麻豆亚洲av熟女国产一区二| 亚洲人成毛片在线播放| 精品国产一区二| 午夜精品久久久内射近拍高清| 综合电影一区二区三区 | 按摩亚洲人久久| 久久男人av| 亚洲免费999| 欧美日韩国产色| 黄色网页在线播放| 看欧美日韩国产| 国产suv一区二区三区88区| 色老头一区二区| 欧美激情手机在线视频| 日韩久久电影|