成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

巧妙的運用裝飾器,讓你的代碼高出一個逼格!

開發(fā) 開發(fā)工具
裝飾器模式,顧名思義,就是在一個類上增加功能,以起到裝飾的作用。今天我們一起來看看深度了解一下裝飾器的玩法!

一、介紹

裝飾器模式,顧名思義,就是在一個類上增加功能,以起到裝飾的作用。

我們都知道,如果想給某個類新增功能,但又要避免在原類上修改代碼,最常用的方式就是新增一個類來繼承目標類,但是如果增加多的話,會使類的數量爆炸式增長,為管理帶來巨大的麻煩,裝飾器模式就比較好地解決了這一點。

[[426041]]

從設計的角度看,裝飾器模式涉及到四個角色:

  • 被裝飾類:要進行擴展的源類;
  • 裝飾器類:通過該類可以給被裝飾類動態(tài)添加額外的方法,多以抽象為主;
  • 具體的裝飾類:該類實現自裝飾器類,已完成完整的算法;
  • 客戶角色:客戶類提出使用具體類的請求;

今天我們一起來看看深度了解一下裝飾器的玩法!

二、代碼示例

下面以生產一件衣服為例,一塊布料裁剪好了之后做出的衣服樣子還可以,但是這樣的衣服是賣不出去的,因為毫無美感,因此我們需要通過一些裝飾來使衣服變得好看。

我們先來創(chuàng)建一個抽象類或者接口,定義一個骨架,如下:

  1. /** 
  2.  * 建立基本骨架 
  3.  */ 
  4. public interface Clothes { 
  5.  
  6.     void makeClothes(); 

接著創(chuàng)建一個我們需要裝飾的源類,如下:

  1. /** 
  2.  * 被裝飾類 
  3.  */ 
  4. public class MakeClothes implements Clothes { 
  5.  
  6.     @Override 
  7.     public void makeClothes() { 
  8.         System.out.println("制作一件衣服"); 
  9.     } 

再來創(chuàng)建我們的主角,裝飾類,如下:

  1. /** 
  2.  * 裝飾類 
  3.  */ 
  4. public class Decorator implements Clothes { 
  5.  
  6.     private Clothes clothes; 
  7.  
  8.     public Decorator(Clothes clothes) { 
  9.         this.clothes = clothes; 
  10.     } 
  11.  
  12.     @Override 
  13.     public void makeClothes() { 
  14.         clothes.makeClothes(); 
  15.     } 
  16.  

最后,分別創(chuàng)建兩個具體的裝飾類,如下:

  1. /** 
  2.  * 具體的裝飾類 
  3.  */ 
  4. public class EmbroideryDecorator extends Decorator { 
  5.  
  6.  
  7.     public EmbroideryDecorator(Clothes clothes) { 
  8.         super(clothes); 
  9.     } 
  10.  
  11.     @Override 
  12.     public void makeClothes() { 
  13.         super.makeClothes(); 
  14.         System.out.println("給衣服繡制花朵"); 
  15.     } 

 

  1. /** 
  2.  * 具體的裝飾類 
  3.  */ 
  4. public class MickeyDecorator extends Decorator { 
  5.  
  6.  
  7.     public MickeyDecorator(Clothes clothes) { 
  8.         super(clothes); 
  9.     } 
  10.  
  11.     @Override 
  12.     public void makeClothes() { 
  13.         super.makeClothes(); 
  14.         System.out.println("給衣服繪制米老鼠圖案"); 
  15.     } 

怎么用呢?請看下面的測試類:

  1. /** 
  2.  * 客戶端 
  3.  */ 
  4. public class DecorateClient { 
  5.  
  6.     public static void main(String[] args) { 
  7.         Clothes clothes = new MakeClothes(); 
  8.         clothes = new EmbroideryDecorator(clothes);//給衣服繡花 
  9.         clothes = new MickeyDecorator(clothes);//給衣服添加米老鼠圖案 
  10.         clothes.makeClothes(); 
  11.         System.out.println("成品已經完成!"); 
  12.     } 

輸出結果如下:

  1. 制作一件衣服 
  2. 給衣服繡制花朵 
  3. 給衣服繪制米老鼠圖案 
  4. 成品已經完成 

制作一件衣服給衣服繡制花朵給衣服繪制米老鼠圖案成品已經完成

從結果上,可以看到,我們成功的給MakeClothes這個類,動態(tài)添加了2個方法,一個是給衣服繡花,另一個是給衣服添加米老鼠圖案,最后成品完成!

可見裝飾的效果還不錯~

三、應用

其實在 jdk 中,裝飾者設計模式也有很多典型的場景應用,例如我們熟悉的io包中的字節(jié)輸入、輸出流,就用到了裝飾者設計模式!

其中FilterInputStream、FilterOutputStream就是裝飾類,用于動態(tài)給輸入、輸出流增加方法!

四、總結

巧妙采用裝飾器模式,可以很好的解決類繼承數量過多的問題,讓代碼清晰可讀。

但是如果裝飾層數過多,也會影響到代碼的維護,因此在實際的使用過程中,還需靈活使用!

 

責任編輯:趙寧寧 來源: Java極客技術
相關推薦

2021-07-12 07:08:54

責任鏈模式對象

2024-12-02 10:15:15

2021-04-15 07:32:02

java 代碼Stream

2021-08-11 06:57:17

驗證碼圖片顯示

2024-09-12 15:32:35

裝飾器Python

2011-04-01 09:49:54

Python

2024-04-29 06:50:45

Python代碼運行

2020-06-08 15:18:50

Python圖片PIL

2017-12-07 15:05:50

全球互聯網創(chuàng)新峰會

2022-10-31 07:09:15

拷貝代碼項目

2021-07-26 07:32:48

模式適配器包裝器

2020-12-21 13:33:00

medit編輯器Linux

2017-12-28 11:05:38

負載均衡算法巧妙

2016-11-17 12:49:36

云運維銀行卡建設

2020-04-13 16:05:25

JS裝飾器前端

2024-10-11 11:21:39

適配器模式系統

2017-11-09 08:48:49

JavaScript編程黑科技

2022-02-07 20:18:29

Redis緩存裝飾

2023-11-23 16:46:55

LinuxAWK運維

2024-12-05 08:13:18

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产一区精品在线 | 曰韩三级 | 综合九九 | 2022国产精品| 国产精品久久久久永久免费观看 | 午夜精品一区二区三区在线观看 | 久久在线免费 | 免费观看一级特黄欧美大片 | 欧美久久久久久久 | 狠狠爱视频 | 色综合天天天天做夜夜夜夜做 | 在线日韩 | 97精品一区二区 | 亚洲国产成人精品女人久久久 | 日韩视频一区 | 国产精品亚洲第一区在线暖暖韩国 | 毛片a | 亚洲最大看片网站 | 免费在线一区二区 | 国产精品免费福利 | 成人在线看片 | 在线一区视频 | 成人免费在线观看 | 综合精品 | 蜜桃视频成人 | 性高湖久久久久久久久 | 最新av在线播放 | 欧美人成在线视频 | 日本一级淫片免费啪啪3 | 日韩免费av一区二区 | 一二三区视频 | 99精品视频免费观看 | 一级网站 | 一区二区在线看 | 99亚洲精品视频 | 男女一区二区三区 | 欧美日韩一区精品 | 国产999精品久久久 精品三级在线观看 | 日本中文字幕日韩精品免费 | 成人精品鲁一区一区二区 | 久久精品久久久久久 |