Java设计模式之七大结构型模式
總體來說設(shè)計模式分為三大類:創(chuàng)建型模式、結(jié)構(gòu)型模式和行為型模式。
結(jié)構(gòu)型模式,共有七種:適配器模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。
其中適配器模式主要分為三類:類的適配器模式、對象的適配器模式、接口的適配器模式。其中的對象的適配器模式是各種結(jié)構(gòu)型模式的起源。
一、適配器模式
適配器模式主要分為三類:類的適配器模式、對象的適配器模式、接口的適配器模式。
適配器模式將某個類的接口轉(zhuǎn)換成客戶端期望的另一個接口表示,目的是消除由于接口不匹配所造成的類的兼容性問題。有點抽象,我們來看看詳細的內(nèi)容。
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();} }運行結(jié)果如下:
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();} }運行結(jié)果跟類的適配器模式例子的一樣。
1.3 接口的適配器模式
接口的適配器是這樣的:有時我們寫的一個接口中有多個抽象方法,當我們寫該接口的實現(xiàn)類時,必須實現(xiàn)該接口的所有方法,這明顯有時比較浪費,因為并不是所有的方法都是我們需要的,有時只需要某一些,此處為了解決這個問題,我們引入了接口的適配器模式,借助于一個抽象類,該抽象類實現(xiàn)了該接口,實現(xiàn)了所有的方法,而我們不和原始的接口打交道,只和該抽象類取得聯(lián)系,所以我們寫一個類,繼承該抽象類,重寫我們需要的方法就行了。
二、裝飾模式
裝飾模式:在不必改變原類文件和使用繼承的情況下,動態(tài)地擴展一個對象的功能。它是通過創(chuàng)建一個包裝對象,也就是裝飾來包裹真實的對象。
裝飾模式的特點:
- 裝飾對象和真實對象有相同的接口。這樣客戶端對象就能以和真實對象相同的方式和裝飾對象交互。
- 裝飾對象包含一個真實對象的引用(reference)
- 裝飾對象接受所有來自客戶端的請求。它把這些請求轉(zhuǎn)發(fā)給真實的對象。
- 裝飾對象可以在轉(zhuǎn)發(fā)這些請求以前或以后增加一些附加功能。這樣就確保了在運行時,不用修改給定對象的結(jié)構(gòu)就可以在外部增加附加的功能。在面向?qū)ο蟮脑O(shè)計中,通常是通過繼承來實現(xiàn)對給定類的功能擴展。繼承不能做到這一點,繼承的功能是靜態(tài)的,不能動態(tài)增刪。
代碼如下:
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) 裝飾對象接受所有來自客戶端的請求。它把這些請求轉(zhuǎn)發(fā)給真實的對象。//(4) 裝飾對象可以在轉(zhuǎn)發(fā)這些請求以前或以后增加一些附加功能。這樣就確保了在運行時,不用修改給定對象的結(jié)構(gòu)就可以在外部增加附加的功能。// 在面向?qū)ο蟮脑O(shè)計中,通常是通過繼承來實現(xiàn)對給定類的功能擴展。// 繼承不能做到這一點,繼承的功能是靜態(tài)的,不能動態(tài)增刪。Sourceable source = new Source();Sourceable obj = new Decorator(source);obj.method();} }運行結(jié)果如下:
before decorator! the original method! after decorator!======以上為創(chuàng)建型模式的兩種設(shè)計模式,下面陸續(xù)記錄代理等創(chuàng)建型模式。
為什么叫創(chuàng)建型模式呢?
先來看看設(shè)計模式的六大原則:http://yyqian.com/post/1456847694817/
回過頭解釋為什么叫創(chuàng)建型設(shè)計模式。創(chuàng)建型設(shè)計模式就是處理對象創(chuàng)建的設(shè)計模式,試圖根據(jù)實際情況使用合適的方式創(chuàng)建對象。基本的對象創(chuàng)建方式可能會導(dǎo)致設(shè)計上的問題,或增加設(shè)計的復(fù)雜度。創(chuàng)建型模式通過以某種方式控制對象的創(chuàng)建來解決問題。
創(chuàng)建型模式由兩個主導(dǎo)思想構(gòu)成。一是將系統(tǒng)使用的具體類封裝起來,二是隱藏這些具體類的實例創(chuàng)建和結(jié)合的方式。
創(chuàng)建型模式又分為對象創(chuàng)建型模式和類創(chuàng)建型模式。對象創(chuàng)建型模式處理對象的創(chuàng)建,類創(chuàng)建型模式處理類的創(chuàng)建。詳細地說,對象創(chuàng)建型模式把對象創(chuàng)建的一部分推遲到另一個對象中,而類創(chuàng)建型模式將它對象的創(chuàng)建推遲到子類中。[2]
參考:
- Java經(jīng)典設(shè)計模式(2):七大結(jié)構(gòu)型模式
- CSDN:七大結(jié)構(gòu)型模式
- 圖解設(shè)計模式
- 面試總結(jié)
總結(jié)
以上是生活随笔為你收集整理的Java设计模式之七大结构型模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到父亲吐血是什么意思
- 下一篇: md5和SHA校验码