国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

java設計模式之 Decorator(裝飾)

2019-11-18 12:14:59
字體:
來源:轉載
供稿:網友

  Decorator常被翻譯成"裝飾",我覺得翻譯成"油漆工"更形象點,油漆工(decorator)是用來刷油漆的,那么被刷油漆的對象我們稱decoratee.這兩種實體在Decorator模式中是必須的.
  
  Decorator定義:
  動態給一個對象添加一些額外的職責,就象在墻上刷油漆.使用Decorator模式相比用生成子類方式達到功能的擴充顯得更為靈活.
  
  為什么使用Decorator?
  我們通常可以使用繼續來實現功能的拓展,假如這些需要拓展的功能的種類很繁多,那么勢必生成很多子類,增加系統的復雜性,同時,使用繼續實現功能拓展,我們必須可預見這些拓展功能,這些功能是編譯時就確定了,是靜態的.
  
  使用Decorator的理由是:這些功能需要由用戶動態決定加入的方式和時機.Decorator提供了"即插即用"的方法,在運行期間決定何時增加何種功能.
  
  如何使用?
  舉Adapter中的打樁示例,在Adapter中有兩種類:方形樁 圓形樁,Adapter模式展示如何綜合使用這兩個類,在Decorator模式中,我們是要在打樁時增加一些額外功能,比如,挖坑 在樁上釘木板等,不關心如何使用兩個不相關的類.
  
  我們先建立一個接口:
  
  public interface Work
  {
    public void insert();
  
  }
  
  接口Work有一個具體實現:插入方形樁或圓形樁,這兩個區別對Decorator是無所謂.我們以插入方形樁為例:
  
  public class SquarePeg implements Work{
    public void insert(){
      System.out.    }
  }
  
  現在有一個應用:需要在樁打入前,挖坑,在打入后,在樁上釘木板,這些額外的功能是動態,可能隨意增加調整修改,比如,可能又需要在打樁之后釘架子(只是比喻).
  
  那么我們使用Decorator模式,這里方形樁SquarePeg是decoratee(被刷油漆者),我們需要在decoratee上刷些"油漆",這些油漆就是那些額外的功能.
  
  public class Decorator implements Work{
  
    private Work work;
    //額外增加的功能被打包在這個List中
    private ArrayList others = new ArrayList();
  
    //在構造器中使用組合new方式,引入Work對象;
    public Decorator(Work work)
    {
      this.work=work;
    
      others.add("挖坑");
  
      others.add("釘木板");
    }
  
    public void insert(){
  
      newMethod();
    }
  
    //在新方法中,我們在insert之前增加其他方法,這里次序先后是用戶靈活指定的   
    public void newMethod()
    {
      otherMethod();
      work.insert();
  
    }
  
    public void otherMethod()
    {
      ListIterator listIterator = others.listIterator();
      while (listIterator.hasNext())
      {
        System.out.println(((String)(listIterator.next())) + " 正在進行");
      }
  
    }
  }
  
  在上例中,我們把挖坑和釘木板都排在了打樁insert前面,這里只是舉例說明額外功能次序可以任意安排.
  
  好了,Decorator模式出來了,我們看如何調用:
  
  Work squarePeg = new SquarePeg();
  Work decorator = new Decorator(squarePeg);
  decorator.insert();
  
  Decorator模式至此完成.
  
  假如你細心,會發現,上面調用類似我們讀取文件時的調用:
  
  FileReader fr = new FileReader(filename);
  BufferedReader br = new BufferedReader(fr);
  
  實際上
java 的I/O API就是使用Decorator實現的,I/O變種很多,假如都采取繼續方法,將會產生很多子類,顯然相當繁瑣.
  
  Jive中的Decorator實現
  在論壇系統中,有些非凡的字是不能出現在論壇中如"打倒XXX",我們需要過濾這些"反動"的字體.不讓他們出現或者高亮度顯示.
  
  在IBM Java專欄中專門談Jive的文章中,有談及Jive中ForumMessageFilter.java使用了Decorator模式,其實,該程序并沒有真正使用Decorator,而是提示說:針對非凡論壇可以設計額外增加的過濾功能,那么就可以重組ForumMessageFilter作為Decorator模式了.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 饶平县| 南溪县| 锡林郭勒盟| 玛曲县| 铜梁县| 庄浪县| 宁海县| 旬阳县| 英吉沙县| 大悟县| 黄冈市| 荣成市| 蕲春县| 时尚| 巫山县| 宜兰县| 甘洛县| 南汇区| 彭阳县| 凭祥市| 平遥县| 郑州市| 饶平县| 团风县| 平南县| 延川县| 华宁县| 隆子县| 罗定市| 金堂县| 昌平区| 毕节市| 京山县| 五大连池市| 平远县| 车险| 梅河口市| 赫章县| 利津县| 竹山县| 和硕县|