日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java设计模式笔记(8)装饰模式

發布時間:2023/12/10 java 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java设计模式笔记(8)装饰模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

裝飾模式:動態地給一個對象添加一些額外的職責(以對客戶端透明的方式擴展對象的功能),就增加功能來說,裝飾模式相比生成子類更為靈活,是繼承關系的一個替代方案。

裝飾模式的四個角色:

  • 抽象構件(Component)角色:給出一個抽象接口,以規范準備接收附加責任的對象。在裝飾模式中,必然有一個最基本、最原始、最核心的接口或者抽象類充當Component抽象構件。
  • 具體構件(ConcreteComponent)角色:定義一個將要接收附加責任的類。
  • 裝飾(Decorator)角色:持有一個構件(Component)對象的實例,并定義一個與抽象構件接口一致的接口。
  • 具體裝飾(ConcreteDecorator)角色:負責給構件對象“貼上”附加的責任。
1. 透明性的要求
裝飾模式對客戶端的透明性要求程序不要聲明一個ConcreteComponent類型的變量,而應當聲明一個Component類型的變量。
下面的做法是對的:Component component = new ConcreteComponent(); component = new ConcreteDecorator(component); 而下面的做法是不對的: Component component = new ConcreteComponent(); ConcreteDecorator componentDecorator = new ConcreteDecorator(component);
2.?半透明的裝飾模式
純粹的裝飾模式很難找到。裝飾模式的用意是在不改變接口的前提下,增強所考慮的類的性能。在增強性能的時候,往往需要建立新的公開的方法,即在具體裝飾(ConcreteDecorator)角色里增加一個newMethod()方法。這就導致了大多數的裝飾模式的實現都是“半透明”的,而不是完全透明的。換言之,允許裝飾模式改變接口,增加新的方法。這意味著客戶端可以聲明ConcreteDecorator類型的變量,從而可以調用ConcreteDecorator類中才有的方法:
Component component = new ConcreteComponent(); ConcreteDecorator componentDecorator = new ConcreteDecorator(component); componentDecorator.newMethod();半透明的裝飾模式是介于裝飾模式和適配器模式之間的。適配器模式的用意是改變所考慮的類的接口,也可以通過改寫一個或幾個方法,或增加新的方法來增強或改變所考慮的類的功能。大多數的裝飾模式實際上是半透明的裝飾模式,這樣的裝飾模式也稱做半裝飾、半適配器模式。

3. 裝飾模式的優點
  • 裝飾模式與繼承關系的目的都是要擴展對象的功能,但是裝飾模式可以提供比繼承更多的靈活性。裝飾模式允許系統動態決定“貼上”一個需要的“裝飾”,或者除掉一個不需要的“裝飾”。繼承關系則不同,繼承關系是靜態的,它在系統運行前就決定了。
  • 通過使用不同的具體裝飾類以及這些裝飾類的排列組合,設計師可以創造出很多不同行為的組合。
4. 裝飾模式的缺點
  • 由于使用裝飾模式,可以比使用繼承關系需要較少數目的類。使用較少的類,當然使設計比較易于進行。但是,在另一方面,使用裝飾模式會產生比使用繼承關系更多的對象。更多的對象會使得查錯變得困難,特別是這些對象看上去都很相像。
1. 模版代碼 //抽象構件 public abstract class Component {//抽象的方法public abstract void operate(); }//具體構件 public class ConcreteComponent extends Component {//具體實現@Overridepublic void operate() {System.out.println("do Something");}}//抽象的裝飾者類 public abstract class Decorator extends Component {private Component component = null;//通過構造函數傳遞被修飾者public Decorator(Component _component){this.component = _component;}//委托給被修飾者執行@Overridepublic void operate() {this.component.operate();}}//具體的裝飾類1 public class ConcreteDecorator1 extends Decorator {//定義被修飾者public ConcreteDecorator1(Component _component){super(_component);}//定義自己的修飾方法private void method1(){System.out.println("method1 修飾");}//重寫父類的Operation方法public void operate(){this.method1();super.operate();} }//具體的裝飾類2 public class ConcreteDecorator2 extends Decorator {//定義被修飾者public ConcreteDecorator2(Component _component){super(_component);}//定義自己的修飾方法private void method2(){System.out.println("method2修飾");}//重寫父類的Operation方法public void operate(){super.operate();this.method2();} }//場景類 public class Client {public static void main(String[] args) {Component component = new ConcreteComponent();//第一次修飾component = new ConcreteDecorator1(component);//第二次修飾component = new ConcreteDecorator2(component);//修飾后運行component.operate();}}

總結

以上是生活随笔為你收集整理的Java设计模式笔记(8)装饰模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。