1. 程式人生 > >設計模式---策略模式(組合)

設計模式---策略模式(組合)

策略模式(通過組合封裝演算法,把一些特性委託給別人處理)
一、定義:定義演算法家族,分別封裝起來,讓他們之間可以互相替換,此模式讓演算法的變化獨立於使用演算法的客戶。(演算法也可以理解為某一行為特性)

  • 繼承的好處:讓共同部分,可以複用.避免重複程式設計.
  • 繼承的不好:耦合性高.一旦超類新增一個新方法,子類都繼承,擁有此方法,若子類相當部分不實現此方法,則要進行大批量修改.此外,採用繼承時,子類就不可繼承其它類了.
  • 介面的好處:解決了繼承耦合性高的問題.且可讓實現類,繼承或實現其它類或介面.
  • 介面的不好:不能真正實現程式碼的複用.可用以下的策略模式來解決.沒增加一個特性就需要增加一個介面的實現

在構造方法中對屬性進行賦值與用屬性的setter的區別:
構造方法中對屬性進行賦值:固定,不可變;
用屬性的setter,可以在例項化物件後,動態的變化,比較靈活。

設計原則:
1、找出應用中可能需要變化之處、把他們獨立出來,不要把他們和不需要變化的程式碼混在一起。
2、針對介面程式設計,而不是針對實現程式設計
3、多用組合,少用繼承


類之間的關係
是一個:繼承
有一個:組合
 

//目標類
public abstract class Duck {
     QuackBehavior quackBehavior;
     FlyBehavior flyBehavior;


     public Duck() {
     }
     public abstract void display();
     //把一些特性委託給別人實現
     public void performFly() {
          flyBehavior.fly();
     }
     public void performQuack() {
          quackBehavior.quack();
     }
     public void swim() {
          System.out.println("swimming.....");
     }
     //使用set進行賦值
     public void setQuackBehavior(QuackBehavior quackBehavior) {
          this.quackBehavior = quackBehavior;
     }
     public void setFlyBehavior(FlyBehavior flyBehavior) {
          this.flyBehavior = flyBehavior;
     }
}
//目標類的一個實現
public class MallardDuck extends Duck {

     //使用建構函式賦值
     public MallardDuck() {
          quackBehavior = new Quack();
          flyBehavior = new Flywithwings();
     }

     @Override
     public void display() {
          System.out.println("i am a real MallardDuck.....");

     }

}

//行為1的介面及其實現
public interface QuackBehavior {
     public void quack();
}

public class Quack implements QuackBehavior {

     @Override
     public void quack() {
          System.out.println("quack.....");

     }

}
public class NuteQuack implements QuackBehavior {

     @Override
     public void quack() {
          System.out.println("silence.....");
     }

}

//行為2的介面及其實現
public interface FlyBehavior {
     public void fly();
}
public class Flynoway implements FlyBehavior {

     @Override
     public void fly() {
          System.out.println("fly no way.....");

     }

}
public class Flywithwings implements FlyBehavior {

     @Override
     public void fly() {
          System.out.println("fly with wings.....");

     }

}
//測試
public class T {

     /**
      * @param args
      */
     public static void main(String[] args) {
          Duck mallard = new MallardDuck();
          mallard.performFly();
          mallard.performQuack();

     }

}
結果:
fly with wings.....
quack.....

參考:

《head first 設計模式》

相關推薦

Java設計模式8——創建型模式之合成組合模式

span color java設計 合成 src 一致性 rdquo img spa 一、概述   定義   將對象以樹形結構組織起來,以達成“部分-整體” 的層次結構,使得客戶端對單個對象和組合對象的使用具有一致性。   簡圖    J

設計模式---策略模式組合

策略模式(通過組合封裝演算法,把一些特性委託給別人處理) 一、定義:定義演算法家族,分別封裝起來,讓他們之間可以互相替換,此模式讓演算法的變化獨立於使用演算法的客戶。(演算法也可以理解為某一行為特性) 繼承的好處:讓共同部分,可以複用.避免重複程式設計. 繼承的不好:耦合

設計模式學習總結策略模式(Strategy)

isp 筆記本 override div ont 角色 write stat 通過   策略模式,主要是針對不同的情況采用不同的處理方式。如商場的打折季,不同種類的商品的打折幅度不一,所以針對不同的商品我們就要采用不同的計算方式即策略來進行處理。   一、示例展示:   以

設計模式——策略模式

提高 {} xiang 有一個 ble 問題 其它 add 新的 轉載地址:http://blog.csdn.net/lifuxiangcaohui/article/details/8065059 這篇文章講述的策略模式非常棒,在此轉載。 設計模式; 一個程序員對設計模

Python設計模式——策略模式孫悟空用什麽打妖怪

就是 作用 oop 事情 input 邏輯控制 except exce one #coding:utf-8 ''' 策略模式作用: 就是使用多種算法來解決一個問題,最大的特性的是:能夠在運行時透明地切換算法(客戶端代碼對變化無感知)

設計模式-策略模式strategy pattern

pre rac uml類圖 獨立 CA 使用 dep () nes 來說說設計模式吧,最近開始看設計模式,覺得挺有意思的。設計模式網上的資料的挺多的,而且大部分是大家相互轉來轉去的。感覺也挺沒有意思。我就自己寫一點吧! 開始 學習設計模式,我

設計模式學習筆記——策略模式

count forname tst code tchar 類名 適用於 動態 自由 一、概述   策略模式屬於對象的行為模式。其用意是針對一組算法,將每一個算法封裝到具有共同接口的獨立的類中,從而使得它們之間可以互相替換。策略模式使得算法可以在不影響客戶端的情況下發生變化。

圖解設計模式讀書筆記——Strategy策略模式

顧名思義,策略模式一般應用在使用多種策略(演算法)的情況下,比如一些棋牌遊戲中,電腦會有多種策略去應付使用者,如入門級別,高手級別等。 策略模式將操作抽象成介面,具體的演算法由子類實現,有一個上下文環境Context來使用策略進行操作,context只需持有Strategy

【程式設計素質】設計模式-策略模式Strategy,政策模式Policy

1,概念 定義了演算法族,分別封裝起來,讓它們之間可以互相替換。 核心思想就是面向物件程式設計的多形性的思想. 是硬編碼(Hard Coding)的替換。如查詢、排序等,硬編碼是在一個類中,提供多個方法,每一個方法對應一個具體的查詢演算法。如果需要增加一種

設計模式 c++版13——策略模式

定義: 定義一組演算法,將每個演算法都封裝起來,並且使他們之間可以互換 示例一:策略模式(通用版) 1. 類圖18-3 2. 類圖說明 策略模式使用的就是面向物件的繼承和多型機制 Context 封裝角色。也叫上下文角色,起承上啟下的封裝作用,遮蔽高層模組對策

設計模式與XML組合模式、橋接模式和介面卡模式(C++)

一、實驗目的及要求 1、掌握結構型模式的概念。 2、掌握介面卡模式、橋接模式、組合模式、裝飾器模式、外觀模式、享元模式、代理模式的構造方式及使用情景。 二、實驗裝置(環境) 1、   軟體需求: Dev-Cpp5.4, Rat

設計模式與XML策略模式(C++)

一、實驗目的及要求 1、掌握行為型模式的概念。 2、掌握備忘錄模式、觀察者模式、狀態模式、策略模式、模板模式、訪問者模式的構造方式及使用情景。 二、實驗裝置(環境)    1、   軟體需求: Dev-Cpp5.4, Rational Rose / Microsoft

設計模式之UML類圖以及類間關係泛化 、實現、依賴、關聯、聚合、組合

類圖用於描述系統中所包含的類以及它們之間的相互關係,幫助人們簡化對系統的理解,它是系統分析和設計階段的重要產物,也是系統編碼和測試的重要模型依據。接下來我們就來談談類圖的組成,在下一篇中我們將討論一下類圖之間的關係。 一、類圖的組成 1. 普通類 上圖

設計模式C++實現2——策略模式

       軟體領域中的設計模式為開發人員提供了一種使用專家設計經驗的有效途徑。設計模式中運用了面向物件程式語言的重要特性:封裝、繼承、多型,真正領悟設計模式的精髓是可能一個漫長的過程,需要大量實踐經驗的積累。最近看設計模式的書,對於每個模式,用C++寫了個小例子,加深一

C++設計模式-策略模式Strategy基本輪廓

策略模式(Strategy):它定義了演算法家族,分別封裝起來,讓他們之間可以互相替換,此模式讓演算法的變化,不會影響到使用演算法的客戶。 context,用一個ConcreteStrategy來配置,維護一個對Strategy物件的引用。 策略模式和工廠模式的不同之處:

設計模式之美:Composite組合

索引 意圖 將物件組合成樹形結構以表示 “部分-整體” 的層次結構。 Composite 使得使用者對於單個物件和組合物件的使用具有一致性。 Compose objects into tree structures to represent part-whole hierarchies. Co

java/android 設計模式學習筆記12---組合模式

  這篇我們來介紹一下組合模式(Composite Pattern),它也稱為部分整體模式(Part-Whole Pattern),結構型模式之一。組合模式比較簡單,它將一組相似的物件看作一個物件處理,並根據一個樹狀結構來組合物件,然後提供一個統一的方法去訪問相

設計模式-策略模式結合JDK原始碼

策略模式:定義了一系列演算法族,並將每一個演算法封裝起來,而且使他們可以互相替換。策略模式讓演算法獨立於使用它的客戶而獨立變化。 問題:假設我們有一個類,提供為List排序功能,分別有選擇使用快速排序,氣泡排序。 我們常使用的最普通的實現方式: /** * 排序工具類

C++設計模式之八:Composite組合

一、意圖: 將物件組合成樹形結構以表示成“部分-整體”的層次結構; 二、類圖: 三、組成元素: Component:頂層介面,用於訪問子元件; Leaf:葉節點,沒有子節點; Composite:用於儲存子節點; 四、程式碼實現: #include <

設計模式學習總結適配器模式(Adapter)

實現接口 國外 手機 額外 sed ges program ebe 通過   適配器模式主要是通過適配器來實現接口的統一,如要實現國內手機在國外充電,則需要在不同的國家采用不同的適配器來進行兼容!   一、示例展示:   以下例子主要通過給筆記本電腦添加類似手機打電話和發短