最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java結(jié)構(gòu)型設(shè)計模式中的適配器模式與橋接模式解析

 更新時間:2016年02月03日 08:50:03   作者:lixiang0522  
這篇文章主要介紹了Java結(jié)構(gòu)型設(shè)計模式中的適配器模式與橋接模式,結(jié)構(gòu)型設(shè)計模式是從程序的結(jié)構(gòu)上解決模塊之間的耦合問題,需要的朋友可以參考下

適配器模式

定義
適配器模式(英語:adapter pattern)有時候也稱包裝樣式或者包裝。將一個類的接口轉(zhuǎn)接成用戶所期待的。一個適配使得因接口不兼容而不能在一起工作的類工作在一起。

有兩類適配器模式:
1. 對象適配器模式 - 對象適配器通過關(guān)聯(lián)滿足用戶期待接口,還降低了代碼間的不良耦合。在工作中推薦使用“對象適配”。
2. 類適配器模式 - 這種適配器模式下,適配器繼承自已實現(xiàn)的類(一般多重繼承),java中沒有多重繼承,所以這里不做介紹。

實現(xiàn)

20162384930660.png (475×274)

1. Target - 定義Client需要使用的方法。
2. Adapter - 繼承或者實現(xiàn)Target,適配Adaptee的方法到Target。
3. Adaptee - 定義一個已經(jīng)存在的方法。
4. Client - 調(diào)用Target中的方法。

public class Adaptee { 
  public void specificRequest(){ 
    System.out.println("Hello, I am from Adaptee!"); 
  } 
} 
 
public interface Target { 
  public void request(); 
} 
 
public class Adapter implements Target { 
  Adaptee adaptee; 
  public Adapter(){ 
    adaptee = new Adaptee(); 
  } 
  public void request(){ 
    adaptee.specificRequest(); 
  } 
} 
 
public class Client { 
  public static void main(String[] args) { 
    Target target = new Adapter(); 
    target.request(); 
  } 
} 

要實現(xiàn)類適配器模式,我們需要Adapter繼承Adaptee。

適用場景
1. 你想使用一個舊類,而它的接口不符合你的需求,那么可以使用Adapter類來作為中介類。
2. 你想創(chuàng)建一個可以通用的類,該類可以調(diào)用一些不相關(guān)的類的接口來供你使用。


橋接模式

動機
有些時候一個抽象應(yīng)該有不同的實現(xiàn),比如,保存數(shù)據(jù)時有兩種方式,一種是文件方式,一種是數(shù)據(jù)庫方式,通常的做法是繼承保存數(shù)據(jù)的類,然后實現(xiàn)不同的保存方式。這樣做的問題就是難于修改和擴展保存方式,運行時無法切換保存方式。

定義
橋接模式是軟件設(shè)計模式中最復(fù)雜的模式之一,它將事物的抽象部分與它的實現(xiàn)部分分離,使它們都可以獨立地變化。

如“圓形”、“三角形”歸于抽象的“形狀”之下,而“畫圓”、“畫三角”歸于實現(xiàn)行為的“畫圖”類之下,然后由“形狀”調(diào)用“畫圖”。

20162384958680.png (629×299)

1. Abstraction - 定義抽象方法。
2. AbstractionImpl - 使用實現(xiàn)接口來實現(xiàn)抽象方法。
3. Implementor - 為具體實現(xiàn)行為定義接口。
4. ConcreteImplementor1, ConcreteImplementor2 - 實現(xiàn)Implementor接口。

/** "Implementor" */ 
interface DrawingAPI 
{ 
  public void drawCircle(double x, double y, double radius); 
} 
  
/** "ConcreteImplementor" 1/2 */ 
class DrawingAPI1 implements DrawingAPI 
{ 
  public void drawCircle(double x, double y, double radius)  
  { 
    System.out.printf("API1.circle at %f:%f radius %f\n", x, y, radius); 
  } 
} 
  
/** "ConcreteImplementor" 2/2 */ 
class DrawingAPI2 implements DrawingAPI 
{ 
  public void drawCircle(double x, double y, double radius)  
  {  
    System.out.printf("API2.circle at %f:%f radius %f\n", x, y, radius); 
  } 
} 
  
/** "Abstraction" */ 
interface Shape 
{ 
  public void draw();                      // low-level 
  public void resizeByPercentage(double pct);   // high-level 
} 
  
/** "Refined Abstraction" */ 
class CircleShape implements Shape 
{ 
  private double x, y, radius; 
  private DrawingAPI drawingAPI; 
  public CircleShape(double x, double y, double radius, DrawingAPI drawingAPI) 
  { 
    this.x = x; this.y = y; this.radius = radius;  
    this.drawingAPI = drawingAPI; 
  } 
  
  // low-level i.e. Implementation specific 
  public void draw() 
  { 
    drawingAPI.drawCircle(x, y, radius); 
  }   
  // high-level i.e. Abstraction specific 
  public void resizeByPercentage(double pct) 
  { 
    radius *= pct; 
  } 
} 
  
/** "Client" */ 
class BridgePattern { 
  public static void main(String[] args) 
  { 
    Shape[] shapes = new Shape[2]; 
    shapes[0] = new CircleShape(1, 2, 3, new DrawingAPI1()); 
    shapes[1] = new CircleShape(5, 7, 11, new DrawingAPI2()); 
  
    for (Shape shape : shapes) 
    { 
      shape.resizeByPercentage(2.5); 
      shape.draw(); 
    } 
  } 
} 

實例
1. 動機里面提到的數(shù)據(jù)保存。
2. 圖形的繪制框架。類似上面代碼中的實現(xiàn)。

適用場景
1. 你不希望抽象和實現(xiàn)有固定的關(guān)系,希望可以在運行時修改實現(xiàn)的方式。
2. 抽象和實現(xiàn)部分都可以獨立的擴展,而不相互影響。

相關(guān)文章

  • Java多線程中線程間的通信實例詳解

    Java多線程中線程間的通信實例詳解

    這篇文章主要介紹了Java多線程中線程間的通信實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • Spring+MyBatis多數(shù)據(jù)源配置實現(xiàn)示例

    Spring+MyBatis多數(shù)據(jù)源配置實現(xiàn)示例

    本篇文章主要介紹了Spring+MyBatis多數(shù)據(jù)源配置實現(xiàn)示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • Java Map集合使用方法全面梳理

    Java Map集合使用方法全面梳理

    Map是一種依照鍵(key)存儲元素的容器,鍵(key)很像下標(biāo),在List中下標(biāo)是整數(shù)。在Map中鍵(key)可以使任意類型的對象。Map中不能有重復(fù)的鍵(Key),每個鍵(key)都有一個對應(yīng)的值(value)。一個鍵(key)和它對應(yīng)的值構(gòu)成map集合中的一個元素
    2022-04-04
  • Java HttpClient-Restful工具各種請求高度封裝提煉及總結(jié)

    Java HttpClient-Restful工具各種請求高度封裝提煉及總結(jié)

    這篇文章主要介紹了Java HttpClient-Restful工具各種請求高度封裝提煉及總結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • 淺析JVM的垃圾回收器

    淺析JVM的垃圾回收器

    這篇文章主要介紹了JVM垃圾回收器的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)Java虛擬機的相關(guān)知識,感興趣的朋友可以了解下
    2020-11-11
  • 詳解MyBatis中Executor執(zhí)行SQL語句的過程

    詳解MyBatis中Executor執(zhí)行SQL語句的過程

    MyBatis中獲取SqlSession時會創(chuàng)建執(zhí)行器Executor并存放在SqlSession中,本篇文章將以MapperMethod的execute() 方法作為起點,對MyBatis中的一次實際執(zhí)行請求進(jìn)行說明,并結(jié)合源碼對執(zhí)行器Executor的原理進(jìn)行闡釋
    2023-07-07
  • 深入淺析SPI機制在JDK與Spring?Boot中的應(yīng)用

    深入淺析SPI機制在JDK與Spring?Boot中的應(yīng)用

    SPI是一種使軟件框架或庫更加模塊化、可擴展和可維護(hù)的有效方法。通過遵循“開閉原則”,?SPI?確保了系統(tǒng)的穩(wěn)定性和靈活性,從而滿足了不斷變化的業(yè)務(wù)需求,這篇文章主要介紹了SPI機制在JDK與Spring?Boot中的應(yīng)用,需要的朋友可以參考下
    2023-09-09
  • Java中的強引用,軟引用,弱引用,虛引用的作用介紹

    Java中的強引用,軟引用,弱引用,虛引用的作用介紹

    這篇文章主要介紹了Java中的強引用,軟引用,弱引用,虛引用的作用,下文內(nèi)容具有一定的知識參考價值,需要的小伙伴可以參考一下,希望對你有所幫助
    2022-02-02
  • Spring?Boot集成etcd的詳細(xì)過程

    Spring?Boot集成etcd的詳細(xì)過程

    etcd是一個分布式鍵值存儲數(shù)據(jù)庫,用于共享配置和服務(wù)發(fā)現(xiàn),etcd采用Go語言編寫,具有出色的跨平臺支持,很小的二進(jìn)制文件和強大的社區(qū),這篇文章主要介紹了SpringBoot集成etcd,需要的朋友可以參考下
    2023-08-08
  • 詳談java線程與線程、進(jìn)程與進(jìn)程間通信

    詳談java線程與線程、進(jìn)程與進(jìn)程間通信

    下面小編就為大家?guī)硪黄斦刯ava線程與線程、進(jìn)程與進(jìn)程間通信。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04

最新評論

南部县| 兰溪市| 晋宁县| 闸北区| 缙云县| 阆中市| 海淀区| 开封县| 揭阳市| 吉木乃县| 衡南县| 金门县| 色达县| 黄浦区| 南开区| 宝应县| 洪泽县| 绵阳市| 大田县| 株洲市| 阿瓦提县| 斗六市| 平遥县| 九江市| 常熟市| 晴隆县| 嘉禾县| 馆陶县| 锦屏县| 扎鲁特旗| 嫩江县| 防城港市| 游戏| 舟曲县| 古蔺县| 青川县| 包头市| 出国| 四子王旗| 黄冈市| 东明县|