設計模式之策略模式(strategy)

基礎概念

-定義:按套路先解釋一下什么是策略模式:一個類的行為,能夠在運行時,被更改,是行為模式的一種.(直接傳傳遞一個對象不就好了)
-場景: 排序工具類, 需要對任何對象進行排序,需要對任何對象進行比較.但有一個前提,你不能改變sort方法本身(設計原則:開閉原則)
-實現(xiàn)方式:按功能,設計接口, Comparator ,定義了compare方法. (PS單方法體接口,可以用lambda表達式),定義ComparatorImpl 實現(xiàn)compare 接口,一種策略一種比較方式.在sort方法中,傳入 Comparator 對象即可.這樣就可以實現(xiàn)不改變sort本身,來實現(xiàn)增加策略的方式.
-目的:思考這個問題,很簡單,如果不用這種方式,你需要做到針對各種策略,按身高排序的sort1 按體重排序的sort2,破壞了原來色sort類.(目的只有一個,橫向擴展,而不是垂直式的修改)

源碼應用

  • Comparator(比較器)
int compare(T o1, T o2);
  • spring Resource ,Spring 會針對不同的底層資源兼雄,提供不同的 Resource 實現(xiàn)類
* @see WritableResource
* @see ContextResource
* @see UrlResource
* @see FileUrlResource
* @see FileSystemResource
* @see ClassPathResource
* @see ByteArrayResource
* @see InputStreamResource
public interface Resource extends InputStreamSource {
    boolean exists();
    default boolean isReadable() {
        return exists();
    }
    default boolean isOpen() {
        return false;
    }
    default boolean isFile() {
        return false;
    }
    URL getURL() throws IOException;
   
    URI getURI() throws IOException;
    File getFile() throws IOException;
   
    default ReadableByteChannel readableChannel() throws IOException {
        return Channels.newChannel(getInputStream());
    }
    long contentLength() throws IOException;
   
    long lastModified() throws IOException;
   
    Resource createRelative(String relativePath) throws IOException;
   
    @Nullable
    String getFilename();
    String getDescription();
}
  • InstantiationStrategy 負責使用 Bean 類的默認構(gòu)造函數(shù)脉课、帶參構(gòu)造函數(shù)或者工廠方法等來實例化 Bean,是一個策略模式的接口在塔。InstantiationStrategy 接口源碼如下。
public interface InstantiationStrategy {
    Object instantiate(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner)
            throws BeansException;
    Object instantiate(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner,
            Constructor<?> ctor, Object... args) throws BeansException;
    Object instantiate(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner,
            @Nullable Object factoryBean, Method factoryMethod, Object... args)
            throws BeansException;
}

模式核心

  1. 對象:client(sort類) , N策略對象以及其對應的接口
  2. 組裝方式, 可以直接以屬性注入,也可以以方法參數(shù)傳入.這種方式,就是直接以靜態(tài)屬性的方式注入.(可以對比一下comparable ,comparable只能固定一種實現(xiàn),畢竟 是以接口實現(xiàn)方式,無法做到不同的實現(xiàn).)
   private static Comparator YXTopComparator = new Comparator() {
        public int compare(Object var1, Object var2) {
            Curve var3 = ((Edge)var1).getCurve();
            Curve var4 = ((Edge)var2).getCurve();
            double var5;
            double var7;
            if ((var5 = var3.getYTop()) == (var7 = var4.getYTop()) && (var5 = var3.getXTop()) == (var7 = var4.getXTop())) {
                return 0;
            } else {
                return var5 < var7 ? -1 : 1;
            }
        }
    };

3.優(yōu)化了哪種代碼?業(yè)務場景如下(優(yōu)化if,else),這種寫法的問題,如果業(yè)務有變化,需要增加 e,f,g 甚至更多的類型,每次都需要去更改調(diào)用類(這種方式是特別不友好的,),因此需要抽象一個策略接口,去做實體類,橫向擴展,即可

 //根據(jù)類型不同,調(diào)用不同的物流接口(比如說順豐,申通等等)
if (type == "a") {
       
} else if (type=="b") {
      
} else  if (type=="c"){
        
}
//優(yōu)化,抽象物流策略接口
public interface ShipStrategy{
//發(fā)運接口
void ship();
}

//順豐物流發(fā)運,策略實現(xiàn)類
public class SFShipStrategy implement ShipStrategy {
//發(fā)運接口
  void ship(){
  //發(fā)運
  .....
  }
}

//客戶端調(diào)用(調(diào)用問題解決了,如何解決對象構(gòu)造的if -else? ,根據(jù) type = a  構(gòu)建  a的策略)

shipStrategy.ship();

//1.維護 type 和class的映射關系. 2.通過spring獲取策略對象(原理是反射.)
Enum ShipType{
SF("SF", "com.dzq.ship.SFShipStrategy "), ADD("ST",  "com.dzq.shipSTShipStrategy");
}


//2.通過反射獲取到到對象
Class.forName(clazz).newInstance()
.....
image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市饭聚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌搁拙,老刑警劉巖秒梳,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異箕速,居然都是意外死亡酪碘,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門盐茎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來兴垦,“玉大人,你說我怎么就攤上這事√皆剑” “怎么了狡赐?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長扶关。 經(jīng)常有香客問我阴汇,道長,這世上最難降的妖魔是什么节槐? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任搀庶,我火速辦了婚禮,結(jié)果婚禮上铜异,老公的妹妹穿的比我還像新娘哥倔。我一直安慰自己,他們只是感情好揍庄,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布咆蒿。 她就那樣靜靜地躺著,像睡著了一般蚂子。 火紅的嫁衣襯著肌膚如雪沃测。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天食茎,我揣著相機與錄音蒂破,去河邊找鬼。 笑死别渔,一個胖子當著我的面吹牛附迷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播哎媚,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼喇伯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了拨与?” 一聲冷哼從身側(cè)響起稻据,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎买喧,沒想到半個月后攀甚,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡岗喉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年秋度,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钱床。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡荚斯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情事期,我是刑警寧澤滥壕,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站兽泣,受9級特大地震影響绎橘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜唠倦,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一称鳞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧稠鼻,春花似錦冈止、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至慌盯,卻和暖如春周霉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背亚皂。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工俱箱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人孕讳。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像巍膘,于是被迫代替她去往敵國和親厂财。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容