Java設計模式之七大結構型模式

總體來說設計模式分為三大類:創建型模式、結構型模式和行為型模式。

結構型模式,共有七種:適配器模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。

其中適配器模式主要分為三類:類的適配器模式、對象的適配器模式、接口的適配器模式。其中的對象的適配器模式是各種結構型模式的起源。

一、適配器模式

適配器模式主要分為三類:類的適配器模式、對象的適配器模式、接口的適配器模式。
適配器模式將某個類的接口轉換成客戶端期望的另一個接口表示,目的是消除由于接口不匹配所造成的類的兼容性問題。有點抽象,我們來看看詳細的內容。

1.1 類的適配器模式

類的適配器模式核心思想就是:有一個Source類,擁有一個方法,待適配,目標接口是Targetable,通過Adapter類,將Source的功能擴展到Targetable里。

public class Source {public void method1() {  System.out.println("this is original method!");  }  
}
public interface Targetable {/* 與原類中的方法相同 */public void method1();/* 新類的方法 */public void method2();
}
public class Adapter extends Source implements Targetable {public void method2() {System.out.println("this is the targetable method!");}
}
public class AdapterTest {public static void main(String[] args) {Targetable target = new Adapter();target.method1();target.method2();}
}

運行結果如下:

this is original method!
this is the targetable method!

1.2 對象的適配器模式

對象的適配器模式的基本思路和類的適配器模式相同,只是將Adapter類作修改成Wrapper,這次不繼承Source類,而是持有Source類的實例,以達到解決兼容性的問題。

public class Wrapper implements Targetable {private Source source;public Wrapper(Source source) {super();this.source = source;}@Overridepublic void method2() {System.out.println("this is the targetable method!");}@Overridepublic void method1() {source.method1();}
}
public class AdapterTest {public static void main(String[] args) {Source source = new Source();Targetable target = new Wrapper(source);target.method1();target.method2();}
}

運行結果跟類的適配器模式例子的一樣。

1.3 接口的適配器模式

接口的適配器是這樣的:有時我們寫的一個接口中有多個抽象方法,當我們寫該接口的實現類時,必須實現該接口的所有方法,這明顯有時比較浪費,因為并不是所有的方法都是我們需要的,有時只需要某一些,此處為了解決這個問題,我們引入了接口的適配器模式,借助于一個抽象類,該抽象類實現了該接口,實現了所有的方法,而我們不和原始的接口打交道,只和該抽象類取得聯系,所以我們寫一個類,繼承該抽象類,重寫我們需要的方法就行了。

二、裝飾模式

裝飾模式:在不必改變原類文件和使用繼承的情況下,動態地擴展一個對象的功能。它是通過創建一個包裝對象,也就是裝飾來包裹真實的對象。

裝飾模式的特點:

  • 裝飾對象和真實對象有相同的接口。這樣客戶端對象就能以和真實對象相同的方式和裝飾對象交互。
  • 裝飾對象包含一個真實對象的引用(reference)
  • 裝飾對象接受所有來自客戶端的請求。它把這些請求轉發給真實的對象。
  • 裝飾對象可以在轉發這些請求以前或以后增加一些附加功能。這樣就確保了在運行時,不用修改給定對象的結構就可以在外部增加附加的功能。在面向對象的設計中,通常是通過繼承來實現對給定類的功能擴展。繼承不能做到這一點,繼承的功能是靜態的,不能動態增刪。

代碼如下:

public interface Sourceable {public void method();
}
public class Source implements Sourceable {@Overridepublic void method() {System.out.println("the original method!");}
}
public class Decorator implements Sourceable {private Sourceable source;public Decorator(Sourceable source) {super();this.source = source;}@Overridepublic void method() {System.out.println("before decorator!");source.method();System.out.println("after decorator!");}
}
public class DecoratorTest {public static void main(String[] args) {//(1) 裝飾對象和真實對象有相同的接口。這樣客戶端對象就能以和真實對象相同的方式和裝飾對象交互。//(2) 裝飾對象包含一個真實對象的引用(reference)//(3) 裝飾對象接受所有來自客戶端的請求。它把這些請求轉發給真實的對象。//(4) 裝飾對象可以在轉發這些請求以前或以后增加一些附加功能。這樣就確保了在運行時,不用修改給定對象的結構就可以在外部增加附加的功能。//    在面向對象的設計中,通常是通過繼承來實現對給定類的功能擴展。//    繼承不能做到這一點,繼承的功能是靜態的,不能動態增刪。Sourceable source = new Source();Sourceable obj = new Decorator(source);obj.method();}
}

運行結果如下:

before decorator!
the original method!
after decorator!

======以上為創建型模式的兩種設計模式,下面陸續記錄代理等創建型模式。

為什么叫創建型模式呢?

先來看看設計模式的六大原則:http://yyqian.com/post/1456847694817/

  1. 開閉原則:對擴展開放,對修改關閉
  2. 里氏替換原則:面向對象設計的基本原則之一。==任何基類可以出現的地方,子類一定可以出現。==LSP是繼承復用的基石,只有當衍生類可以替換掉基類。
  3. 依賴倒轉原則:針對接口編程,依賴于抽象而不是具體。
  4. 接口隔離原則:使用多個隔離的接口,比使用單個接口要好。還是一個降低類之間的耦合度的意思。【降低依賴,降低耦合】
  5. 迪米特法則(最少知道原則):一個實體應當盡量少的與其它實體之間發生相互作用,使得系統功能模塊相對獨立。
  6. 合成復用原則:意思是盡量使用合成聚合的方式,而不是使用繼承。

回過頭解釋為什么叫創建型設計模式。創建型設計模式就是處理對象創建的設計模式,試圖根據實際情況使用合適的方式創建對象。基本的對象創建方式可能會導致設計上的問題,或增加設計的復雜度。創建型模式通過以某種方式控制對象的創建來解決問題。

創建型模式由兩個主導思想構成。一是將系統使用的具體類封裝起來,二是隱藏這些具體類的實例創建和結合的方式。

創建型模式又分為對象創建型模式和類創建型模式。對象創建型模式處理對象的創建,類創建型模式處理類的創建。詳細地說,對象創建型模式把對象創建的一部分推遲到另一個對象中,而類創建型模式將它對象的創建推遲到子類中。[2]

參考:

  • Java經典設計模式(2):七大結構型模式
  • CSDN:七大結構型模式
  • 圖解設計模式
  • 面試總結

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/397604.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/397604.shtml
英文地址,請注明出處:http://en.pswp.cn/news/397604.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

一個Option請求引發的深度解析

在當前項目中,前端通過POST方式訪問后端的REST接口時,發現兩條請求記錄,一條請求的Request Method為Options,另一條請求的Reuest Method為Post。想要解決這個疑惑還得從以下3個概念說起。 Http Options Method RFC2616標準&#x…

ionic+AnjularJs實現省市縣三級聯動效果

建議對ionic和AnjularJs有一定了解的人可以用到,很多時候我們要用到選擇省份、城市、區縣的功能,現在就跟著我來實現這個功能吧,用很少的代碼(我這里是根據客戶的要求,只顯示想要顯示的部分省份和其相對應的城市、區縣…

md5和SHA校驗碼

md5已經不安全了,中國山東大學女學霸王小云破解了一系列密碼,當真是巾幗不讓須眉.說是破解,其實就是給你一個md5碼,讓你求出這個md5碼所對應的原始信息,顯然一個md5對應無數種原始信息.而md5的特性就是難以還原初始信息,但是王小云可以迅速找到給定md5碼的可行解.md5的解空間雖…

Confluence 6 附件存儲文件系統的分級

從 Confluence 3.0 開始,附件的存儲方式有了重大的改變和升級。如果你是從 Confluence 2.10 及其早期版本升級上來的,請參考 Upgrading Confluence 頁面中推薦的升級路徑,同時請閱讀 Confluence 3.0 文檔中 Hierarchical File System Attachm…

Fragment與Activity交互(使用接口)

在Fragment中: 1. // 定義一個回調接口,該Fragment所在Activity需要實現該接口// 該Fragment將通過該接口與它所在的Activity交互 { public void onItemSelected(Integer id);}2. // 當該Fragment被添加、顯示到Activity時,回調該方法 public void onA…

java保齡球計分_自己寫的java保齡球記分

package com.java.bowlingscore1;import java.util.Arrays;public class Game { int[] bowlingScore new int[21]; //用來存放投擲擊倒的數目 int ball0; //數組下標 int score;//分數 int countframe0;//記錄當前是第幾輪 boolean firs…

你不知道的JavaScript-0

【數組】 刪除數組的幾種方法: https://www.cnblogs.com/Joans/p/3981122.html http://www.cnblogs.com/qiantuwuliang/archive/2010/09/01/1814706.html 【數字轉換】 parseInt(num, radix): 【寬松相等和嚴格相等】 允許在相等比較中進行強制類型轉換&#xff0c…

真是,原來可以這樣啊

一下午,解決了兩個問題。。。。。 先列上這兩個真是Bug的問題: 1、數據庫有個表book,里面有個字段 create_time Datetime類型的字段,這個字段是 not null 的。下午下代碼往數據庫里插入數據時,總是提示,cre…

1026. Table Tennis (30)

題目如下: A table tennis club has N tables available to the public. The tables are numbered from 1 to N. For any pair of players, if there are some tables open when they arrive, they will be assigned to the available table with the smallest numb…

java運行時異常中文_JAVA——運行時異常(RuntimeException)

Exception中有一個特殊的子類異常RuntimeException運行時異常。如果在函數內拋出該異常,函數上可以不用聲明,編譯一樣通過。如果在函數上聲明了該異常。調用者可以不用進行處理。編譯一樣通過。之所以不用在函數上聲明,是因為不需要讓調用者處…

內置函數isinstance和issubclass

1. isinstance(obj,class) 判斷對象obj是不是由class生成的對象。 class Foo:passobjFoo()print(isinstance(obj,Foo))obj是Foo的生成的對象,返回True。如果不是,則返回False。 d{x:1} #ddict({x:1} #)print(type(d) is dict) pri…

JavaOne 2016——首日亮點

今年,為期5天的JavaOne會議中,4個會場的議題都進行了直播,演講稿也在播出之后一并提供。\\來自Terracotta公司EHCache團隊的Henri Tremblay,做了主題為《學習Java 8:Lambda表達式和函數式編程(Learn Java 8…

指針數據類型 java_C/C++ 指針的小結——指針與其它數據類型(數組、字符串、函數、結構體)的關系...

一、指針與數組和字符串1、指針與數組當聲明數時,編譯器在連續的內存空間分配基本地址和足夠的儲存空間,以容納數組的所有元素。基本地址是數組第一個元素(索引為0)的存儲位置。編譯器還把數組名定義為指向第一個元素的常量指針。元素的地址是通過索引和…

Linux tr命令詳解

tr是個簡單的替換命令,從標準輸入中替換、縮減和/或刪除字符,并將結果寫到標準輸出。 tr常見命令參數 用法:tr [選項]... SET1 [SET2] 從標準輸入中替換、縮減和/或刪除字符,并將結果寫到標準輸出。-c, -C, --complement …

512M內存編譯php出錯

make時錯誤如下 1 virtual memory exhausted: Cannot allocate memory make: *** [ext/fileinfo/libmagic/apprentice.lo] Error 1 內存小造成的,為了成功的話需要加上參數 –disable-fileinfo即可參考鏈接:https://bugs.php.net/bug.php?id48809 轉載于…

Android中插件開發篇總結和概述

剛剛終于寫完了插件開發的最后一篇文章,下面就來總結一下,關于Android中插件篇從去年的11月份就開始規劃了,主要從三個方面去解讀Android中插件開發原理。說白了,插件開發的原理就是:動態加載技術。但是我們在開發插件…

java反射機制 路徑_Java 反射機制詳解

引言本文主要介紹Java中,有關反射機制、類的加載過程、以及控制反轉方面的內容。Java 反射機制Java創建對象的方式有哪些:new、反射、反序列化、克隆class對象獲取的方法有哪些:類名.class、getClass、forName、classLoader.loadClass(‘包類…

prop和attr在 jquery的

https://www.cnblogs.com/Showshare/p/different-between-attr-and-prop.html轉載于:https://www.cnblogs.com/beimingbingpo/p/9254680.html

java傳入數據庫生成柱狀圖_Java讀取數據庫數據生成柱狀圖

此案例是用swing顯示數據的。須要引入jfreechart相關包。不同版本號可能包不同樣。本人用的是此案例在ssi框架下會報錯,不用框架就沒問題。Java后臺邏輯代碼:public class BarChart {ChartPanel frame1;public BarChart() {CategoryDataset dataset get…

SVN系列操作(一)

SVN是什么? SVN是Subversion的簡稱,是一個開放源代碼的版本控制系統,常用于軟件開發項目中,實現代碼、文檔等的歷史版本保存、共享和權限管理。 進入SVN本地目錄,第一步操作就是update。 為什么呢?因為SVN是…