亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

適配器模式

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

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

實(shí)現(xiàn)

20162384930660.png (475×274)

1. Target - 定義Client需要使用的方法。
2. Adapter - 繼承或者實(shí)現(xiàn)Target,適配Adaptee的方法到Target。
3. Adaptee - 定義一個(gè)已經(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(); 
  } 
} 

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

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


橋接模式

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

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

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

20162384958680.png (629×299)

1. Abstraction - 定義抽象方法。
2. AbstractionImpl - 使用實(shí)現(xiàn)接口來實(shí)現(xiàn)抽象方法。
3. Implementor - 為具體實(shí)現(xiàn)行為定義接口。
4. ConcreteImplementor1, ConcreteImplementor2 - 實(shí)現(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(); 
    } 
  } 
} 

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

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

相關(guān)文章

  • 解決mybatis映射mapper.xml文件不編譯的問題

    解決mybatis映射mapper.xml文件不編譯的問題

    這篇文章主要介紹了解決mybatis映射mapper.xml文件不編譯的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • mybatis-plus中的常用注解

    mybatis-plus中的常用注解

    這篇文章主要介紹了mybatis-plus中的常用注解,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 透徹理解Java中Synchronized(對象鎖)和Static Synchronized(類鎖)的區(qū)別

    透徹理解Java中Synchronized(對象鎖)和Static Synchronized(類鎖)的區(qū)別

    這篇文章主要介紹了Java中Synchronized(對象鎖)和Static Synchronized(類鎖)的區(qū)別,希望對大家有所幫助,一起跟隨小編過來看看吧
    2018-05-05
  • java文件操作輸入輸出結(jié)構(gòu)詳解

    java文件操作輸入輸出結(jié)構(gòu)詳解

    這篇文章主要介紹了java文件操作輸入輸出詳解,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-07-07
  • Mybatis實(shí)現(xiàn)分表插件

    Mybatis實(shí)現(xiàn)分表插件

    隨著系統(tǒng)的發(fā)展,數(shù)據(jù)量也會越來越大,分庫分表可以有效的緩解數(shù)據(jù)庫的壓力,本文主要介紹了Mybatis實(shí)現(xiàn)分表插件,感興趣的可以了解一下
    2021-05-05
  • Java SimpleDateFormat中英文時(shí)間格式化轉(zhuǎn)換詳解

    Java SimpleDateFormat中英文時(shí)間格式化轉(zhuǎn)換詳解

    這篇文章主要為大家詳細(xì)介紹了Java SimpleDateFormat中英文時(shí)間格式化轉(zhuǎn)換,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Java如何在臨界區(qū)中避免競態(tài)條件

    Java如何在臨界區(qū)中避免競態(tài)條件

    這篇文章主要介紹了Java如何在臨界區(qū)中避免競態(tài)條件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 帶你快速了解Java中類和對象的關(guān)系

    帶你快速了解Java中類和對象的關(guān)系

    這篇文章主要給大家介紹了關(guān)于Java中類和對象關(guān)系的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 詳解eclipse將項(xiàng)目打包成jar文件的兩種方法及問題解決方法

    詳解eclipse將項(xiàng)目打包成jar文件的兩種方法及問題解決方法

    本文給大家介紹了eclipse中將項(xiàng)目打包成jar文件的兩種方法及其遇到問題解決方法,本文圖文并茂給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2017-12-12
  • JMS 之 Active MQ 的消息傳輸(詳解)

    JMS 之 Active MQ 的消息傳輸(詳解)

    下面小編就為大家?guī)硪黄狫MS 之 Active MQ 的消息傳輸(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06

最新評論