Java中常用的設計模式之裝飾器模式詳解

優點

1.裝飾類和被裝飾類可以獨立發展,不會相互耦合,裝飾模式是繼承的一個替代模式,裝飾模式可以動態擴展一個實現類的功能。

缺點

2.多層裝飾比較復雜。

使用場景

1.擴展一個類的功能。

2.動態增加功能,動態撤銷。

一、實現方式

假設一個場景,我們房間每天起床都要刷牙, 睡覺也要刷牙,刷牙的動作就是一個裝飾器的作用,這樣更利於我們的口腔健康。接下來我們就看看具體的裝飾器如何實現。

1、每天生活的接口

package com.asurplus.common.decorator;
/**
 * 每天的生活接口
 */
public interface Live {
    /**
     * 每天需要做的事情
     */
    void live();
}

2、起床的實現類

package com.asurplus.common.decorator;
import lombok.extern.slf4j.Slf4j;
/**
 * 起床實現類
 */
@Slf4j
public class GetUpLive implements Live {
    @Override
    public void live() {
        log.info("起床瞭");
    }
}

3、睡覺的實現類

package com.asurplus.common.decorator;
import lombok.extern.slf4j.Slf4j;
/**
 * 睡覺實現類
 */
@Slf4j
public class SleepLive implements Live {
    @Override
    public void live() {
        log.info("睡覺瞭");
    }
}

4、裝飾器類

package com.asurplus.common.decorator;
import lombok.extern.slf4j.Slf4j;
/**
 * 裝飾器類
 */
@Slf4j
public class LiveDecorator {
    private Live live;
    public LiveDecorator(Live live) {
        this.live = live;
    }
    public void live() {
        // 生活
        live.live();
        // 刷牙
        brushTeeth();
    }
    private void brushTeeth() {
        log.info("刷牙去咯");
    }
}

二、測試

package com.asurplus.common.decorator;
/**
 * 裝飾器模式
 */
public class TestMain {
    public static void main(String[] args) {
        // 起床
        LiveDecorator getUp = new LiveDecorator(new GetUpLive());
        getUp.live();
        System.out.println();
        // 睡覺
        LiveDecorator sleep = new LiveDecorator(new SleepLive());
        sleep.live();
    }
}

輸出結果

在這裡插入圖片描述

可以看出,起床和睡覺,都刷瞭牙,從而實現瞭我們的裝飾器模式。

總結

本篇文章就到這裡瞭,希望能夠給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!  

推薦閱讀: