目錄
前言
外觀模式
裝飾器模式
首頁 Java java教程 Java設計模式中外觀模式和裝飾器模式的介紹(程式碼範例)

Java設計模式中外觀模式和裝飾器模式的介紹(程式碼範例)

Sep 12, 2018 pm 04:06 PM
外觀模式 裝飾器模式

這篇文章帶給大家的內容是關於Java設計模式中外觀模式和裝飾器模式的介紹(程式碼範例) ,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

前言

上一篇中我們學習了結構型模式的適配器模式和橋接模式。本篇則來學習下結構型模式的外觀模式和裝飾模式。

外觀模式

簡介

外觀模式隱藏系統的複雜性,並向客戶端提供了一個客戶可以存取系統的介面。這種類型的設計模式屬於結構型模式,它向現有的系統添加一個接口,來隱藏系統的複雜性。

簡單的來說就是對外提供一個簡單接口,隱藏實現的邏輯。例如常用電腦的電源鍵,我們只要按電源鍵,就可以讓它啟動或關閉,無需知道它是怎麼啟動的(啟動CPU、啟動記憶體、啟動硬碟),怎麼關閉的(關閉硬碟、關閉記憶體、關閉CPU);

這裡我們還是可以用電腦玩遊戲的例子來外觀模式進行簡單的講解。
電腦上有一些網路遊戲,分別是DNF、LOL和WOW,我們只需雙擊電腦上的圖示就可以啟動並玩遊戲了,無需關心遊戲是怎麼啟動和運行的了。

需要實現的步驟如下:

  1. 建立遊戲的介面;

  2. 建立LOL、DNF和WOW的類別並實作遊戲的介面;

  3. 定義一個外觀​​類,提供給客戶端呼叫。

  4. 呼叫外觀類別。

程式碼範例:

interface Game{
    void play();
}

class DNF implements Game{

    @Override
    public void play() {
        System.out.println("正在玩DNF...");
    }
}

class LOL implements Game{
    @Override
    public void play() {
        System.out.println("正在玩LOL...");
    }
}

class WOW implements Game{
    @Override
    public void play() {
        System.out.println("正在玩WOW...");
    }
}

class Computer{
    
    private Game dnf;
    private Game lol;
    private Game wow;
    
    public Computer() {
        dnf=new DNF();
        lol=new LOL();
        wow=new WOW();
    }
    
    public void playDNF(){
        dnf.play();
    }
    
    public void playLOL(){
        lol.play();
    }
    
    public void playWOW(){
        wow.play();
    }   
}

public static void main(String[] args) {
        Computer computer=new Computer();
        computer.playDNF();
        computer.playLOL();
        computer.playWOW();
    }
登入後複製

#執行結果:

    正在玩DNF...
    正在玩LOL...
    正在玩WOW...
登入後複製

在上述程式碼範例中,我們在想玩遊戲的時候,只用實例化外觀類別呼叫其中的遊戲方法即可,無需關心遊戲是怎麼啟動和運行的。而且每個遊戲之間也互相獨立,互不影響,不會因為某個遊戲玩不了導致其它的遊戲也無法運作。其實感覺外觀模式和我們平常使用接口很相像,都是對外提供接口,並不需要關心是如何實現的。

外觀模式的優點:

降低了耦合,從某種方面來說也提升了安全性。

外觀模式的缺點:

不符合開閉原則,不易更改。

使用場景

系統中有多個複雜的模組或子系統的時候。

裝飾器模式

簡介

裝飾模式允許為現有的物件新增新的功能,同時又不改變其結構。這種類型的設計模式屬於結構型模式,它是作為現有的類別的包裝。

裝飾器模式,顧名思義,也就是把某個東西裝飾起來,讓它可以提供一些額外的功能。例如對人進行裝飾,做不同的事情的時候穿上不同的服裝。例如穿上球衣是準備去打球,穿上泳衣是準備去游泳之類的。

裝飾器模式可以動態地為一個物件添加一些額外的職責。

這裡我們依舊用一個範例來進行說明。
在現在的玩具模型中,有兩種​​模型很受歡迎,高達(GUNDAM)模型扎古(MrGu)模型,在我們拼接模型的時候,一般都是先將模型拼接好,然後再來加入一些額外的配件,例如武器。這裡我們在拼接好高達(GUNDAM)模型扎古(MrGu)模型之後,為它們裝上各自的武器。

具體實現的步驟如下:

  1. 建立一個抽象構件的模型接口,有組裝這個方法;

  2. 創建具體構件的類別(GUNDAM類別和MrGu類別),並實作上述的模型介面;

  3. 定義一個裝飾器,用於接受客戶端的請求,並根據客戶端的請求進行相應的呼叫;

  4. 定義個具體實現裝飾的類,用於為物件添加相應的功能。

程式碼範例:

interface Model{
    void  assemble();
}

class GUNDAM implements Model{
    @Override
    public void  assemble() {
        System.out.println("组装一个高达模型");
    }
}

class MrGu implements Model{
    @Override
    public void  assemble() {
        System.out.println("组装一个扎古模型");
    }
}

abstract class  AddExtra implements Model{
    protected  Model model;
    
    public AddExtra(Model model){
        this.model=model;
    }
    public  void assemble(){
        model.assemble();
    }
}

class LightSaber extends AddExtra{

    public LightSaber(Model model) {
        super(model);
    }
    
    public  void assemble(){
        model.assemble();
        addLightSaber();
    }
    public void addLightSaber(){
        System.out.println("添加光剑");
    }
}


class RocketLauncher extends AddExtra{

    public RocketLauncher(Model model) {
        super(model);
    }
    
    public  void assemble(){
        model.assemble();
        addRocketLauncher();
    }
    public void addRocketLauncher(){
        System.out.println("添加火箭筒");
    }
}

public static void main(String[] args) {
    
        Model gundam=new GUNDAM();
        Model mrgu=new MrGu();
        gundam.assemble();
        mrgu.assemble();
            
        Model gModel=new LightSaber(new GUNDAM());
        gModel.assemble();
        Model mModel=new RocketLauncher(new MrGu());
        mModel.assemble();
}
登入後複製

執行結果:

    组装一个高达模型
    组装一个扎古模型
    
    组装一个高达模型
    添加光剑
    组装一个扎古模型
    添加火箭筒
登入後複製

在上面的程式碼中,我們如果只想組裝高達或這札古的模型的話,可以直接實例化模型類,呼叫其中的方法即可。假若需要在組裝模型的時候,添加一個武器,只需透過裝飾器的類別進行相應添加相應的功能即可。
透過這個範例,我們發現,在使用裝飾器模式的試試,可以對一些類別進行擴展,並且不影響先前的功能,提升了靈活度。

裝飾器模式的優點:

#裝飾類別和被裝飾類別可以獨立發展,耦合度低,易於擴展,靈活方便。

裝飾器模式的缺點:

過多的對某個類別進行裝飾,會增加複雜度。

使用場景
原型不變,動態增加一些功能的時候。

相關推薦:

Java設計模式中適配器模式和橋接模式的介紹(程式碼範例)

Java設計模式中建造者模式和原型模式的介紹(程式碼範例)

以上是Java設計模式中外觀模式和裝飾器模式的介紹(程式碼範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

公司安全軟件導致應用無法運行?如何排查和解決? 公司安全軟件導致應用無法運行?如何排查和解決? Apr 19, 2025 pm 04:51 PM

公司安全軟件導致部分應用無法正常運行的排查與解決方法許多公司為了保障內部網絡安全,會部署安全軟件。 ...

如何使用MapStruct簡化系統對接中的字段映射問題? 如何使用MapStruct簡化系統對接中的字段映射問題? Apr 19, 2025 pm 06:21 PM

系統對接中的字段映射處理在進行系統對接時,常常會遇到一個棘手的問題:如何將A系統的接口字段有效地映�...

如何優雅地獲取實體類變量名構建數據庫查詢條件? 如何優雅地獲取實體類變量名構建數據庫查詢條件? Apr 19, 2025 pm 11:42 PM

在使用MyBatis-Plus或其他ORM框架進行數據庫操作時,經常需要根據實體類的屬性名構造查詢條件。如果每次都手動...

如何將姓名轉換為數字以實現排序並保持群組中的一致性? 如何將姓名轉換為數字以實現排序並保持群組中的一致性? Apr 19, 2025 pm 11:30 PM

將姓名轉換為數字以實現排序的解決方案在許多應用場景中,用戶可能需要在群組中進行排序,尤其是在一個用...

IntelliJ IDEA是如何在不輸出日誌的情況下識別Spring Boot項目的端口號的? IntelliJ IDEA是如何在不輸出日誌的情況下識別Spring Boot項目的端口號的? Apr 19, 2025 pm 11:45 PM

在使用IntelliJIDEAUltimate版本啟動Spring...

Java對像如何安全地轉換為數組? Java對像如何安全地轉換為數組? Apr 19, 2025 pm 11:33 PM

Java對象與數組的轉換:深入探討強制類型轉換的風險與正確方法很多Java初學者會遇到將一個對象轉換成數組的�...

電商平台SKU和SPU數據庫設計:如何兼顧用戶自定義屬性和無屬性商品? 電商平台SKU和SPU數據庫設計:如何兼顧用戶自定義屬性和無屬性商品? Apr 19, 2025 pm 11:27 PM

電商平台SKU和SPU表設計詳解本文將探討電商平台中SKU和SPU的數據庫設計問題,特別是如何處理用戶自定義銷售屬...

使用TKMyBatis進行數據庫查詢時,如何優雅地獲取實體類變量名構建查詢條件? 使用TKMyBatis進行數據庫查詢時,如何優雅地獲取實體類變量名構建查詢條件? Apr 19, 2025 pm 09:51 PM

在使用TKMyBatis進行數據庫查詢時,如何優雅地獲取實體類變量名以構建查詢條件,是一個常見的難題。本文將針...

See all articles