1. 程式人生 > >Android中介面卡模式

Android中介面卡模式

  三毛:”我的白,你用過第三方圖片載入庫Glide嘛”

  小白:嗯嗯,平常大概就像下面那樣使用

 Glide.with(this)
      .load("url")
      .error(R.mipmap.error)
      .diskCacheStrategy(DiskCacheStrategy.SOURCE)
      .into(imageView);

一、常見需求場景

  三毛:”如果要你Glide載入的圖片是圓形或圓角圖片,你認為要怎麼整捏(不考慮自定義的ImageView)”

二、基本解決方法

  小白:如果沒方法設定的話,我想直接改原始碼,也就是在原始碼那裡,新增多個方法,當設定圖片的時候,給客戶端選擇要正常圖片還是圓形或圓角圖片

三、基本解決方法存在的問題

  三毛:”可是你沒有把Glide專案拉下來作為module,也就是你根本沒有原始碼,炸麼改?就算你本地有原始碼,你為了個圖片型別就修改原始碼,違反設計模式的開閉原則不說,萬一到時候因為改原始碼出了bug…”

  小白:那要怎麼做好捏這裡寫圖片描述

四、介面卡模式寫法

介面卡模式定義:把一個類的介面換成客戶端所期待的另一種介面,從而使原本因介面不匹配而無法在一起工作的兩個類能夠在一起工作。


  三毛:”對於這種原本介面無法完全滿足當前的需求時,可以使用介面卡模式。下面是大話設計模式的一段話”

從功能上講這些介面不相容的類一般具有相同或相似的功能。通常我們通過修改該類的介面來解決這種介面不相容的情形,但是如果我們不願意為了某個功能或應用而去修改原有的介面,或我們壓根就沒有原有物件的原始碼怎麼辦呢


  三毛:”其實Glide在設計的時候人家也是考慮到了,雖然不是直接設定型別,但是提供了一個方法transform(),方法裡的引數要傳BitmapTransformation類例項,然後你想怎麼自定義就怎麼自定義”

  小白:奧,之前沒用過,不知道


  三毛:”下面我們寫個轉換類(其實就是介面卡模式),把圖片轉換成我們想要的形狀”

//繼承Glide提供的抽象類BitmapTransformation
public class CircleAdapter extends BitmapTransformation {

    public CircleAdapter(Context context) {
        super
(context); } @Override protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) { //在這裡把圖片轉換成你需要的形狀... return result; } @Override public String getId() { return getClass().getName(); } } //使用 Glide.with(this) .load("url") .error(R.mipmap.error) .diskCacheStrategy(DiskCacheStrategy.SOURCE) .transform(new CircleAdapter(this))//利用Glide提供給的方法使用我們寫好的轉換器 .into(imageView);



介面卡模式解釋:

  小白: 這裡寫圖片描述 這不是繼承重寫嘛,難道繼承重寫就是介面卡模式?


  三毛:”繼承重寫當然不是介面卡模式”

  小白: 這裡寫圖片描述那你為嘛還說上面就是介面卡模式

  三毛:”我現在舉個介面卡模式標準例子”

//介面IA
public interface IA {
    void A();
}

//類A
public class A implements IA{
    @Override
    public void A() {
        init();
        //下一步操作...
    }

    public void init(){
        //初始化操作...
    }
}


//------------------------分割線------------------------//


//介面IB
public interface IB {
    void B();
}

//現在要寫個CircleAdapterB類,要實現介面IB
public class CircleAdapterB  implements IB{
    @Override
    public void B() {
        //在這裡做操作前,也要初始化,發現上面的類B已經寫好的初始化方法,
        //也和這裡要寫的初始化方法一樣
    }
}

//那麼只要繼承類A就好了
public class CircleAdapterB extends A implements IB {
    @Override
    public void B() {
        init();
        //下一步操作...
    }
}



  小白:上面IA,IB介面不同,但是CircleAdapterB類使它們能夠在一起工作,這就是介面卡模式,原來牙齒

  三毛:”既然你明白了上面的小例子,對於前面的CircleAdapter類也是一個意思,繼承某介面(只不過它是抽象類)重寫transform方法,然後呼叫了某類的方法(這裡呼叫父類建構函式進行初始化)”

  小白:這裡寫圖片描述 感覺怪怪的,但是又說不上來…


  三毛:“那是因為BitmapTransformation是抽象類,而小例子A不是抽象類,其實沒多大區別,你不能因為別人換了個包裝,你就不認識它,說它不是介面卡模式了啊,這也說明你對抽象類還是不能很好的理解使用呦,我的白”

  三毛:”除了這個,像ListView的自定義介面卡(繼承BaseAdapter)、基類…都使用了介面卡模式喔”

  小白:這裡寫圖片描述


  三毛:“介面卡模式一般分為兩種寫法,但是不管有多少種寫法,它的本質’原本因介面不匹配而無法在一起工作的兩個類能夠在一起工作’是不會變的,下面我舉幾個簡單小例子給你看看兩種寫法方式”

介面卡模式一般分為兩種寫法:(1)類介面卡模式;

              (2)物件介面卡模式。



(1)類介面卡模式

原理:通過繼承來實現介面卡功能。

//介面IA
public interface IA {
    void A();
}

//類A
public class A implements IA{
    @Override
    public void A() {
        init();
        //下一步操作...
    }

    public void init(){
        //初始化操作...
    }
}


//------------------------分割線------------------------//


//介面IB
public interface IB {
    void B();
}

//現在要寫個CircleAdapterB類,要實現介面IB
public class CircleAdapterB  implements IB{
    @Override
    public void B() {
        //在這裡做操作前,也要初始化,發現上面的類B已經寫好的初始化方法,
        //也和這裡要寫的初始化方法一樣
    }
}

//那麼只要繼承類A就好了
public class CircleAdapterB extends A implements IB {
    @Override
    public void B() {
        init();
        //下一步操作...
    }
}



(2)物件介面卡模式

 原理:通過組合來實現介面卡功能。

//介面IA
public interface IA {
    void A();
}

//類A
public class A implements IA{
    @Override
    public void A() {
        init();
        //下一步操作...
    }

    public void init(){
        //初始化操作...
    }
}


//------------------------分割線------------------------//


//介面IB
public interface IB {
    void B();
}

//現在要寫個CircleAdapterB類,要實現介面IB
public class CircleAdapterB  implements IB{
    @Override
    public void B() {
        //在這裡做操作前,也要初始化,發現上面的類B已經寫好的初始化方法,
        //也和這裡要寫的初始化方法一樣
    }
}

//不使用繼承,使用物件
public class CircleAdapterB implements IB {
    private A mA;

    public CircleAdapterB(A a) {
        this.mA = a;
    }

    @Override
    public void B() {
        mA.init();
        //下一步操作...
    }
}

五、介面卡模式和普通寫法區別


1、複用性好;

2、靈活性和擴充套件性好,符合開閉原則;

相關推薦

Android介面卡模式

  三毛:”我的白,你用過第三方圖片載入庫Glide嘛”   小白:嗯嗯,平常大概就像下面那樣使用 Glide.with(this) .load("url") .error(R.mi

Android 介面卡與fragment或者activity的回撥使用

如何使用介面回撥       使用場景:在activity或者fragment與adapter的回撥中        介面卡中使用: public OnUpdat

Android夜間模式的三種實現方式

參考:https://www.jianshu.com/p/f3aaed57fa15 在本篇文章中給出了三種實現日間/夜間模式切換的方案: 使用 setTheme 的方法讓 Activity 重新設定主題; 設定 Android Support Library 中的 UiMode

Android設計模式-Builder模式

遇到多個構造器引數時要考慮使用構建器 引入:當我們建立物件傳遞引數的時候,往往通過構造方法來傳,如下程式碼: public class Person { private String name; private String id;

Android設計模式--狀態模式(將動作委託到當前狀態,狀態之間可以互相轉換)

   狀態模式:將狀態封裝成為獨立類,並將動作委託到當前狀態;狀態之間可以相互轉換,因為實現了相同的介面;狀態改變,則動作會跟著改變。  理解: 1.定義狀態介面,所有的狀態均實現該介面,這樣對於客戶(呼叫者)來說,狀態是可以替換的,客戶不關心具體的狀態是什麼,只是呼叫介

Android設計模式MVC,MVP,MVVM的簡單理解

設計模式VS框架框架是程式碼的重用,可擴充套件。舉幾個簡單的例子。Spring架構,Struts架構。設計模式是設計的重用,是一種抽象的設計方法。例如MVC,MVP,MVVM。下面,我們以android開發為例,簡單比較一下三種不同的設計模式。MVCMVC是指Modle,Vi

AndroidMVP模式講解及實踐

前兩年的時候,我經常逛http://androidweekly.net這個網站,上面就有過很多文章介紹MVP模式,我很感興趣,於是把這個東西介紹給身邊的同事,同事們好像沒有多大反應,可能是當時在國內MVP用的範圍還比較少吧。後來我換了工作,再後來某一天我發

Android設計模式之單例模式的種類

Android開發設計模式中的單例模式       單例模式是設計模式中最常見也最簡單的一種設計模式,保證了在程式中只有一個例項存在並且能全域性的訪問到。比如在android實際APP 開發中用到的 賬號資訊物件管理, 資料庫物件(SQLiteOpenHelp

ANDROID 設計模式的採用--結構型模式

       在GOF所著的設計模式經典著作中對橋接模式與介面卡模式的區別描述為:B r i d g e模式的結構與物件介面卡類似,兩個模式的不同之處主要在於它們各自的用途和出發點:B r i d g e目的是將介面部分和實現部分分離和橋接,從而對它們可以較為容易也相對獨立的加以改變和演化,B r i d

淺談AndroidMVP模式與MVC模式的區別

一、概述 對於MVP(Model View Presenter),大多數人都能說出一二:“MVC的演化版本”,“讓Model和View完全解耦”等等。本篇博文僅是為了做下記錄,提出一些自己的看法,和幫助大家如何針對一個Activity頁面去編寫針對MVP風

[Android學習]AndroidMVP模式初探1

前言: 1. 初識MVP模式時,看到它缺點是需要增加一倍的類的維護量。所以就暫時沒用它。但是,當一個類的程式碼行數達到一定的量(1000行以上),這時候維護類變得好麻煩,主要是功能變得多了,方法數量也變多了。這個時候真的是需要給類“瘦瘦身”。

Android的設計模式--介面卡模式

最近對介面卡有了新的理解,特記錄下。 寫程式碼遇到了使用ScaleAnimation,我想在結束完,執行另一個動畫,於是我增加了一個Animation.AnimationListener。另一個動畫又是使用的animator屬性動畫,我使用了Animator.

Android常見的設計模式

use 都是 string ace ase 模式 .class 創建 是什麽 自己理解的設計模式遵循的原則: 1)功能單一明確,設計一個類的意圖要明確,不能大包大攬什麽功能都繼承進去 2)對於擴展要開放,修改要關閉。軟件通常都有需求變化,變化過程中通過擴展的方式來實現需求變

Android的代理(Proxy)模式

ner try 都是 switch語句 困難 .cn turn 重新 交互 一. Proxy模式定義 Proxy模式,也稱代理模式,是經典設計模式中的一種結構型模式,其定義是為其他對象提供一種代理以控制對這個對象的訪問,簡單的說就是在訪問和被訪問對象中間加上的一個間接層

android開發學習 ------- 【轉】 android的單例模式 (詳解)

lan post tail -- and 使用 href details android開發 https://blog.csdn.net/u011418943/article/details/60139644 這篇文章 前因後果 都說出來了 ,值得學習。 htt

23種設計模式Android的應用

ets ros 而不是 auto 排隊 private eth mail 記錄 所有江湖偶遇,都是宿命相逢 ----《逆水寒》,只是覺得文案不錯,就用了。哈哈! 一.設計原則: 單一職責原則(SRP):任何一個對象都應給只有一個單獨的職責(“低耦合,高內聚”)裏氏替換原則(

Android常用的設計模式

觀察者模式 單例模式 介面卡模式(如ArrayAdapter) 代理模式(Proxy) 工廠模式(Factory Pattern) 命令模式 Build模式 原型模式 策略模式 下面介紹一些Android開發中常用的幾種設計模式 觀察

Android的四種啟動模式

standard 標準模式,每次啟用activity都會建立該activity,並放入任務棧中。 singleTop 如果在任務的棧頂正好存在該Activity的例項,就重用該例項,否則就會建立新的例項並放入棧頂(即使棧中已經存在該Activity例項,此時相當於st

android設計模式——介面卡模式

    定義:介面卡模式就是把一個類的介面變換成客戶端所期待的另一種介面,從而使原本介面不匹配的而無法工作的兩個類能夠一起工作 使用場景: 系統要使用現有的類,但此類的介面不符合系統的需要,即介面不相容。 想要建立一個可以重複使用的類,用於與一些彼此之

Swift 的設計模式 #3 外觀模式介面卡模式

作者:Andrew Jaffee,原文連結,原文日期:2018-09-04 譯者:鄭一一;校對:BigNerdCoding,pmst,Forelax;定稿:Forelax 本文是我的設計模式系列教程的第三篇。在第一篇文章中,我介紹了 建立型模式中的工廠模式和單例模式。在第二篇文章中,又討論了一下