1. 程式人生 > >Android使用的設計模式2——策略模式

Android使用的設計模式2——策略模式

  今天講解一下策略模式,策略模式也是很常用的設計模式,對多種演算法或者資料結構選擇使用的情況下,經常會使用策略模式來管理這些演算法。下面會簡單講解一下策略模式的概念和基本實現。然後結合Android裡面的實際應用來說明。

1、策略模式概念

  定義一系列演算法,把他們獨立封裝起來,並且這些演算法之間可以相互替換。策略模式主要是管理一堆有共性的演算法,客戶端可以根據需要,很快切換這些演算法,並且保持可擴充套件性。

策略模式的本質:分離演算法,選擇實現

2、策略模式實現

  下面針對策略模式說一個小型的實現例子,個人覺得學習設計模式,最好的方法是看看設計模式概念,然後先看看簡單的模式實現的例子。策略模式實現起來,主要需要3部分:抽象介面、實現演算法、上下文。

//演算法的介面
public interface PriceStrategy
{
    public int setPrice(int orgPrice);
}
//實現一個介面,打7折商品
public class sevenPercentStrategy implements PriceStrategy
{
  public int setPrice(int orgPrice)
    {
          System.out.println("打7折商品");
          return orgPrice*0.7;
    }

}

//實現一個介面,打5折商品 public class fivePercentStrategy implements PriceStrategy {   public int setPrice(int orgPrice) { System.out.println("打5折商品"); return orgPrice*0.5; } }
//實現一個上下文物件
public class DstPrice
{  
    private PriceStrategy mPriceStrategy;  
      
    
public void setPriceMode(PriceStrategy priceMode) { mPriceStrategy = priceMode; } public int ExeCalPrice(int price) { mPriceStrategy.SetPrice(price); } }

  上面是一個最簡單的策略模式的實現方式,按照功能分為3個部分,定義演算法抽象介面,然後根據具體演算法實現這些介面,最後需要定義一個上下文物件。這裡的上下文物件主要用來切換演算法,上下文物件裡面也是針對介面程式設計,具體演算法實現被封裝了。

3、策略模式的理解

  上面實現的只是一種最簡單的策略模式的框架,實際應用的時候,我們可以針對不同情況修改上下文物件和具體的演算法實現。比如說,可以增加一個抽象類實現作為演算法模板。抽象類裡面我們可以封裝一些公共的方法。這樣實現具體的演算法的時候,每個演算法公共部分就被分離出來。

  策略模式的目的是把具體的演算法抽離出來,把每個演算法獨立出來。形成一系列有共同作用的演算法組,然後這個演算法組裡面的演算法可以根據實際情況進行相互替換。

  策略模式的中心不是如何實現這些演算法,而是如何組織和呼叫這些演算法。也就是把我們平時寫到一塊的演算法解耦出來,獨立成一個模組,增強程式的擴充套件性。

  策略模式裡面的演算法通常需要資料執行,我們可以根據實際情況把資料放在不同地方。例如可以放在上下文類裡面,然後每個演算法都可以使用這些資料。或者對介面封裝一個抽象類,在抽象類裡面新增資料。這些可以根據實際的情況綜合考慮。設計模式裡面沒有一成不變的萬能模式,每種模式都有變化版本,需要根據實際的專案進行變通。

4、策略模式優缺點

  定義一系列演算法:策略模式的功能就是定義一系列演算法,實現讓這些演算法可以相互替換。所以會為這一系列演算法定義公共的介面,以約束一系列演算法要實現的功能。如果這一系列演算法具有公共功能,可以把策略介面實現成為抽象類,把這些公共功能實現到父類裡面,對於這個問題,前面講了三種處理方法,這裡就不羅嗦了。

  避免多重條件語句:根據前面的示例會發現,策略模式的一系列策略演算法是平等的,可以互換的,寫在一起就是通過if-else結構來組織,如果此時具體的演算法實現裡面又有條件語句,就構成了多重條件語句,使用策略模式能避免這樣的多重條件語句。

  更好的擴充套件性:在策略模式中擴充套件新的策略實現非常容易,只要增加新的策略實現類,然後在選擇使用策略的地方選擇使用這個新的策略實現就好了。

  客戶必須瞭解每種策略的不同:策略模式也有缺點,比如讓客戶端來選擇具體使用哪一個策略,這就可能會讓客戶需要了解所有的策略,還要了解各種策略的功能和不同,這樣才能做出正確的選擇,而且這樣也暴露了策略的具體實現。

  增加了物件數目:由於策略模式把每個具體的策略實現都單獨封裝成為類,如果備選的策略很多的話,那麼物件的數目就會很可觀。

  只適合扁平的演算法結構:策略模式的一系列演算法地位是平等的,是可以相互替換的,事實上構成了一個扁平的演算法結構,也就是在一個策略介面下,有多個平等的策略演算法,就相當於兄弟演算法。而且在執行時刻只有一個演算法被使用,這就限制了演算法使用的層級,使用的時候不能巢狀使用。

5、Android中的應用

  下面說說在Android裡面的應用。在Android裡面策略模式的其中一個典型應用就是Adapter,在我們平時使用的時候,一般情況下我們可能繼承BaseAdapter,然後實現不同的View返回,GetView裡面實現不同的演算法。外部使用的時候也可以根據不同的資料來源,切換不同的Adapter。

參考:

《研磨設計模式》

Edited by mythou

相關推薦

Android使用的設計模式2——策略模式

  今天講解一下策略模式,策略模式也是很常用的設計模式,對多種演算法或者資料結構選擇使用的情況下,經常會使用策略模式來管理這些演算法。下面會簡單講解一下策略模式的概念和基本實現。然後結合Android裡面的實際應用來說明。 1、策略模式概念   定義一系列演算法,把他們獨立封裝起來,並且這些演算法之間

設計模式系列2 策略模式

什麼是策略模式 策略是對演算法的封裝,是一種形為模式,將每一個演算法封裝到具有共同介面的獨立的類中,從而使得它們可以相互替換。 策略模式和簡單工廠很相似,確有不同,策略是一種行為模式,而簡單工廠是建立型模式。 為什麼用策略模式/策略模式的好處 優點 是一種行為

設計模式學習筆記2: 策略模式(Strategy)

模擬 Comparable public interface Comparable { int compareTo(Object ob); } public class Test { public static void main(String

Android設計模式策略模式

策略模式的定義: 策略模式定義了一系列演算法,並將每一個演算法封裝起來,而且使它們還可以相互替換。策略模式讓演算法獨立於使用它的客戶而獨立變化。 策略模式的使用場景: 1.針對同一型別問題的多種處理方式,僅僅是具體行為有差別時。 2.需要安全封裝多種同一型別的操作時。

設計模式策略模式

條件 cti round ces 配置 urn 表單提交 spa 成了 在web項目中,表單的驗證和提交是我們經常開發的功能之一。下面我們來看一下一般情況下我們如何驗證一個用戶的註冊。 需求: 註冊需要用戶名,密碼,手機號碼,郵箱 所有選項不能為空 密碼要長度不能少於8位,

設計模式策略模式&簡單工廠模式

抽象 jsb args watermark amp pri eas 時間 並且 學習設計模式已經有非常長一段時間了。事實上先前已經敲過一遍了,可是老認為沒有學到什麽,認識也不夠深刻,如今趁著重構機房。再又一次來過,也不晚。 事實上在敲了機房之後,看看模式,事實

PHP設計模式策略模式

lang 女裝 keyword 種類 tty protect 電子產品 number 添加 1.概念 策略模式:將一組特定的行為和算法封裝成類。以適應某些特定的上下文環境,這樣的模式就是策略模式 2.功能 使用策略模式實現Ioc,

設計模式策略模式

concrete 方法 行為 無法 策略模式 避免 mint his 多態 1、定義 1.1標準定義 策略模式(StrategyPattern)是一種比較簡單的模式,也叫做政策模式(PolicyPattern)。其定義如下:Defineafamilyofalgorithms

java設計模式策略模式總結

客戶端 出場 cnblogs ava java設計 bsp image 需要 com 策略模式的定義:(定義截自http://www.cnblogs.com/whgk/p/6087064.html) 1、策略模式定義了算法族,分別封裝起來,讓他們之間可以互相替換,此模式讓算

java23中設計模式策略模式

log author 批量 isp contex view strategy ext 不同 package com.bjsxt.strategy; /** * 負責和具體的策略類交互 * 這樣的話,具體的算法和直接的客戶端調用分離了,使得算法可以獨立於客戶端獨立

Java設計模式策略模式

pattern 管理 父類 interface face 缺點 this err 相互 策略模式屬於對象的行為模式,策略模式定義了一系列的算法,並將每一個算法封裝起來,而且使它們還可以相互替換,策略模式讓算法獨立於使用它的客戶而獨立變化。策略模式使這些算法在客

設計模式策略模式

算法 nal class 我們 mint images iss factor () 策略模式屬於對象行為型的設計模式 定義 :封裝了一些列算法,它們之前可以相互替換,此模式使得算法的改變,不會影響到使用它們的客戶端 策略模式有以下3個角色組成 抽象策略類 : 所有

2 策略模式

集合 可能性 單元測試 一個個 context png style star line 面向對象的編程,並不是類越多越好,類的劃分是為了封裝,但分類的基礎是抽象,具有相同屬性和功能的對象的抽象集合才是類。 策略模式:它定義了算法家族,分別封裝起來,讓它們之間可以互相替換

PHP設計模式策略模式

php interface 設計模式 策略模式 步驟1.定義策略接口#UserStrategy.php 用戶策略 <?php namespace celvmoshi; /**用戶策略接口 * Interface UserStategy * @package celvmoshi

設計模式策略模式在地鐵票價系統中的應用

我們 分享圖片 地鐵 不同類 mes public 包括 lock 1.0 引言 設計模式是面向對象編程的一個非常精彩的部分。使用設計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性,它能幫助我們將應用組織成容易了解,容易維護,具有彈性的架構。本文通過一個簡單的

設計模式(II)策略模式

所有 sys private 它的 @override new ember 情況 implement 策略模式定義了一系列的算法,並將每一個算法封裝起來,而且使它們還可以相互替換,策略模式讓算法獨立於使用它的客戶而獨立變化。策略模式使這些算法在客戶端調用它們的時

JavaScript設計模式策略模式

一個 是否 strong 今天 自帶 所有 log 執行 修改 所謂“條條道路通羅馬”,在現實中,為達到某種目的往往不是只有一種方法。比如掙錢養家:可以做點小生意,可以打分工,甚至還可以是偷、搶、賭等等各種手段。在程序語言設計中,也會遇到這種類似的情況,要實現某種功能可以有

【javascript】javasrcipt設計模式策略模式

影響 配置 可能 pan style 類庫 ava 自由 AC 策略模式支持在運行時由使用者選擇合適的算法,對於使用者而言不用關心背後的具體事項,而使用者自動根據當前程序執行的上下文和配置,從已有的算法列表中選擇出合適的算法來處理當前任務。 1.要解決的問題 2.如何實現

大話設計模式策略模式

系統 AC 抽象類 技術 algo str stat 出現 args 背景: 商場促銷期間,可能會出現8折、5折的促銷活動,也可能出現滿100減10、滿200減30的促銷活動,設計一個收銀系統。 策略模式:定義了算法家族,讓它們之間可以互相替換,此模式讓算法的變化不會影響到

前端也要學系列:設計模式策略模式

語句 做的 一個 code IE 說我 目的 ret 曾經 做前端開發已經好幾年了,對設計模式一直沒有深入學習總結過。隨著架構相關的工作越來越多,越來越能感覺到設計模式成為了我前進道路上的一個阻礙。所以從今天開始深入學習和總結經典的設計模式以及面向對象的幾大原則。 今天