1. 程式人生 > >《Head First 設計模式》___第一章 策略模式

《Head First 設計模式》___第一章 策略模式

一、策略模式的書面定義

      策略模式定義了演算法族,分別封裝起來,讓他們之間可以互相替換,此模式讓演算法的變化獨立於使用演算法的客戶.(聽起來真的很難懂.書中用的是Duck來做的例子.我自己也想了一個,幫助理解.下面來一起體會一下...)

     策略模式就像是花店插花的一個過程.花店都有好多種不同組的花,(每組中的花都有差別).當客戶要買一束花的時候,店員進行插花.將每組花按照一個策略插成一整束滿足客戶需求的產品.嗯,策略模式大概就是這個過程.下面我們把上述的過程和程式聯絡起來.

     上述過程使用到了三類東西.並與程式對應如下

1.花籃(插花的容器). --------------> 抽象類

2.花店裝每組花的桶--------------> 介面

3.每一隻花.              --------------> 介面實現類

   那我們為什麼要使用這種策略模式,生活的方式簡單點不好嗎?

1.程式碼複用性.

2.靈活可擴充套件.

3.動態組合例項.

   書中的例子,以及程式碼實現:

目標,實現一個modelduck類有一個飛的方法和一個叫的方法.當我們建立這個類的時候可以根據不同的策略動態的得到一個模型鴨例項.

    做法分析:

1.將飛與叫這兩個行為寫成兩個不同介面.FlyBehavior擁有fly()和QuackBehavior擁有quack()


package com.hx.strategy;
//飛的行為
public interface IFlyBehavior {
	void fly();
}

package com.hx.strategy;
//叫的行為
public interface IQuackBehavior {
	void quack();
}

2.寫多個實現上述兩個行為介面的實現類.實現不同姿勢的飛和不同的叫聲.

package com.hx.strategy;
//不會飛
public class FlyNoWay implements IFlyBehavior{

	@Override
	public void fly() {
		System.out.println("我不會飛!");
	}

}

package com.hx.strategy;
//會飛
public class FlyWithWings implements IFlyBehavior{

	@Override
	public void fly() {
		System.out.println("我正在飛!");
	}

}

package com.hx.strategy;
//叫聲1
public class Quack implements IQuackBehavior{

	@Override
	public void quack() {
		
		System.out.println("呱呱叫!");
		
	}

}

package com.hx.strategy;
//叫聲2
public class Squeak implements IQuackBehavior{

	@Override
	public void quack() {
		
		System.out.println("吱吱叫!");
		
	}
	
	
}

3.建立抽象類,這個類就是我們的Duck類.設定上述的兩個行為介面.並提供相應set方法引數為相應介面型別.以及performFly()和performQuack()方法.分別呼叫介面的fly()和quack()方法.

package com.hx.strategy;

public abstract class Duck {
	IFlyBehavior flyBehavior;
	IQuackBehavior quackBehavior;
	public Duck(){
		
	}
	public abstract void display();
	
	public void performFly(){
		flyBehavior.fly();
	}
	public void performQuack(){
		quackBehavior.quack();
	}
	public void setFlyBehavior(IFlyBehavior flyBehavior){
		this.flyBehavior = flyBehavior;
	}
	public void setFlyBehavior(IQuackBehavior quackBehavior){
		this.quackBehavior = quackBehavior;
	}
}

4.實現modelDuck類

package com.hx.strategy;

public class ModelDuck extends Duck{

	@Override
	public void display() {
		System.out.println("我是模型鴨!");
	}
	
}

5.測試類;

package com.hx.strategy;

public class Test {
	public static void main(String[] args) {
		//動態建立具有某功能的鴨子只需要在基類增加set例項的方法就可以:
		ModelDuck modelDuck = new ModelDuck();//製造一個會飛會呱呱叫的鴨子
		modelDuck.setFlyBehavior(new FlyWithWings());
		modelDuck.setFlyBehavior(new Quack());
		modelDuck.performFly();
		modelDuck.performQuack();
	}
}

最後:本章書中提到了三條設計原則:

1.多用組合,少用繼承

2.針對介面程式設計,而不是針對實現程式設計

3.儘可能的找到程式中會經常發生變化的程式碼,提取出來,將其與不需變化的程式碼分離.

相關推薦

Head First 設計模式___第一 策略模式

一、策略模式的書面定義       策略模式定義了演算法族,分別封裝起來,讓他們之間可以互相替換,此模式讓演算法的變化獨立於使用演算法的客戶.(聽起來真的很難懂.書中用的是Duck來做的例子.我自己也想了一個,幫助理解.下面來一起體會一下...)      策略模式就像是

Head First 設計模式第一 ----策略模式

設計原則 設計模式告訴我們如何組織類和物件以解決某種問題。 第一個設計原則:找出應用中可能需要變化之處,把它們獨立出來,不要和那些不需要變化的程式碼混在一起。 (把會變化的部分取出並“封裝“起來,好讓其他部分不會受到影響) 第二個設計原則:針對介面程式設計,而不是針對實現

Head First Python 筆記總結——第一

Python術語 “BIF"——內建函式 “組”(suite)——Python程式碼塊,會通過縮排來指示分組。 “功能齊全(Vatteries included)”——這是指Python提供了快速高效完成工作所需的大多數功能。 IDLE說明 IDLE shell允許你在編

大話設計模式(C++)第二-策略模式

  策略模式:他定義了演算法家族,分別封裝起來,讓他們之間可以互相替換,此模式讓演算法的變化,不會影響到使用演算法的客戶。   三、優點與解析 (1)策略模式是一種定義一系列演算法的方法,從概念上來看,所有這些演算法完成的都是相同的工作,只是實現不同,他可以

Head First設計模式 第一策略模式

模擬鴨子應用: 繼承: 設計一個遊戲。裡面有各種鴨子。一開始我們建立一個鴨子超類(Suprclass),並讓各種鴨子來繼承這個類。 如: 對所有鴨子通用的方法由超類來實現,對每個鴨子子類不同的方法由各個子類來實現該方法。 這時,如果我們想讓鴨子能飛,我們又在超類

策略模式-《Head Firsh 設計模式第一

本文要點: 定義 設計原則一:封裝變換部分 設計原則二:針對介面程式設計,而不是針對實現程式設計。 設計原則三:多用組合,少用繼承。 例項:鴨子與行為 策略模式(Strategy Pattern) 一、定

Head First設計模式讀書筆記八 第九下 組合模式

組合模式+迭代器模式 接著上一節最後的例子,例子的最終list結構圖是這樣的: 若要給DinerMenu新加一種Menu(即下面這樣),則需要對現有結構進行較大改動。 可以看到,目前的結構中分為兩種結構,一種是menu,是一種容器,可以包含選單項,而第二種

Head First設計模式讀書筆記九 第十 狀態模式

狀態模式例項 用Java設計糖果機吧 大致流程: 上圖中,有四種狀態:沒有硬幣,有硬幣,準備售出狀態以及糖果售罄狀態。而控制糖果機狀態轉換的則是各種動作(Action),這些動作分別是投入硬幣,超時判斷,轉動曲柄,判斷糖果決定是否售出。 GumballMac

Head First 設計模式策略設計模式

假設有一個鴨子超類,各種不同的鴨子要具有叫和游泳得動作。如果我們把鴨子的叫和游泳的動作放入進鴨子超類中,這樣鴨子子類就可以繼承過來這些方法,如果有一天有一隻鴨子變異會飛了。那麼這個鴨子就要自己去實現這個飛行的方法因為超類中沒有該方法,慢慢的隨著時間的推移,有很多

Head First設計模式 第二:觀察者模式

觀察者模式是JDK中使用最多的模式之一。 氣象監測應用: 任務: WeatherData物件負責追蹤目前的天氣狀況(溫度、溼度、氣壓)。建立一個應用,有三種佈告板,分別顯示目前的狀況、氣象統計及簡單的預報。當WeatherObject 物件獲得最新的測量資料時, 三種佈

Head First 設計模式讀書筆記——策略模式

最近研究了一些優秀的開源框架,學習了很多開源框架中自己不熟悉的知識,發現一些優秀的開源框架都或多或少的使用了設計模式,正好為了能分析原始碼不那麼頭疼乾脆先複習一下以前只看過的設計模式,於是我翻出了壓箱底的head first 設計模式,這本書圖文並茂,就是廢話很多不過它完全順

Head First設計模式:策略模式

策略模式: package com.zoey.allTest.pattern.headFirst.strategyPattern.book; public abstract class Duck

Head First設計模式》之策略模式

設計模式原則總結 封裝變化:找出應用中可能需要變化之處,把它們獨立出來,不要和那些不需要變化的程式碼混在一起。 少用組合,多用繼承。 針對介面程式設計,而不是針對實現程式設計 策略模式定義: 將物件

Head First設計模式——策略模式

《Head First設計模式》是一本介紹設計模式的書籍,書中的設計模式主要是用Java語言進行實現,由於本人對C++比較熟悉,因此在閱讀這本書籍時,儘自己所能,用C++重新去實現書中所涉及到的設計模式。若有錯誤或需要進一步討論之處,望閱覽者不吝賜教! 策略模式——

Head First 設計模式》:策略模式

# 正文 ## 一、定義 策略模式定義了演算法族,分別封裝起來,讓它們之間可以相互替換,此模式讓演算法的變化獨立於使用演算法的客戶。 **要點:** * 策略模式把系統中會變化的部分抽出來封裝。 ## 二、實現步驟 ### 1、建立策略介面 ``` /** * 策略介面 */ public

Head First 設計模式》學習筆記——復合模式

listener 解讀 out 部件 register != file 窗體 event 模型-視圖-控制器(MVC模式)是一種很經典的軟件架構模式。在UI框架和UI設計思路中扮演著很重要的角色。從設計模式的角度來看,MVC模式是一種復合模式。它將多個設計模式在

Head First設計模式之模板方法模式

names 去除 缺點 ide 個數 write ima 父類 public 一、定義 在一個方法中定義一個算法的骨架,而將一些步驟延遲到子類中,使得子類可以不改變算法結構的情況下,重定義該算法中的某些特定步驟。 比較通俗的說法,子類決定如何實現算法中的某些步驟,比如兩

Head First設計模式之外觀模式

實現 add ads important pac mar private 入口 summary 一、定義 外觀模式提供了一個統一的接口,用來訪問子系統中的一群接口。外觀定義了一個高層接口,讓子系統更容易使用。 外觀模式不只是簡化了接口,也將客戶從組件的子系統中解耦。

Head First設計模式之代理模式

collect prot indent margin 虛擬代理 ans sig smart ati 一、定義 定義:為其他對象提供一種代理以控制對這個對象的訪問 在代理模式中,我們創建具有現有對象的對象,以便向外界提供功能接口。 二、結構 代理模式一般會有三個角

Head First設計模式之享元模式(蠅量模式

logs sign face isp ria reat 定義 ogr sans 一、定義 享元模式(Flyweight Pattern)主要用於減少創建對象的數量,以減少內存占用和提高性能。這種類型的設計模式屬於結構型模式,它提供了減少對象數量從而改善應用所需的對象結構的