1. 程式人生 > >設計模式系列之四_策略模式 和 模版方法模式(Template method)

設計模式系列之四_策略模式 和 模版方法模式(Template method)

1.策略模式

1.1 策略模式

  策略模式定義了一系列的演算法,並將每一個演算法封裝起來,而且使它們還可以相互替換。
策略模式讓演算法獨立於使用它的客戶而獨立變化。
  策略模式屬於物件的行為模式。其用意是針對一組演算法,將每一個演算法封裝到具有
共同介面的獨立的類中,從而使得它們可以相互替換。策略模式使得演算法可以在不影響到
客戶端的情況下發生變化。  

1.2 策略模式的組成

  (1)抽象策略角色: 策略類,通常由一個介面或者抽象類實現。
  (2)具體策略角色:包裝了相關的演算法和行為。
類圖如下:
  

1.3 使用場景  

  假設:現在要設計一個販賣各類書籍的電子商務網站的購物車系統。
  一個最簡單的情況就是把所有貨品的單價乘上數量,但是實際情況肯定比這要複雜。
比如,本網站可能對所有的高階會員提供每本20%的促銷折扣;對中級會員提供每本
10%的促銷折扣;對初級會員沒有折扣。
  根據描述,折扣是根據以下的幾個演算法中的一個進行的:
 演算法一:對初級會員沒有折扣。
 演算法二:對中級會員提供10%的促銷折扣。
 演算法三:對高階會員提供20%的促銷折扣。
實現程式碼如下:
/**
 * @Title:商品抽象折扣類
 * @Description:TODO
 * @Company: Orclight's Studio
 * @author: shuzl  2013-3-12 下午03:24:53
 * @motto: Never put off what you can do today until Tomorrow
 * @version 1.0.0 
 */
public interface MemberStrategy {
	public double discountPrice(double bookPrice);
}

/**
 * @Title:初級會員--折扣類
 * @Description:TODO
 * @Company: Orclight's Studio
 * @author: shuzl  2013-3-12 下午03:53:59
 * @motto: Never put off what you can do today until Tomorrow
 * @version 1.0.0 
 */
public class JuniorMemberStrategy implements MemberStrategy{
	public double discountPrice(double bookPrice) {
		return bookPrice;
	}
}

/**
 * @Title:中級會員--折扣類
 * @Description:TODO
 * @Company: Orclight's Studio
 * @author: shuzl  2013-3-12 下午03:58:01
 * @motto: Never put off what you can do today until Tomorrow
 * @version 1.0.0 
 */
public class InterMediateMemberStrategy implements MemberStrategy{
	@Override
	public double discountPrice(double bookPrice) {
		return bookPrice*0.9;
	}
}

/**
 * @Title:高階會員--折扣類
 * @Description:TODO
 * @Company: Orclight's Studio
 * @author: shuzl  2013-3-12 下午03:59:30
 * @motto: Never put off what you can do today until Tomorrow
 * @version 1.0.0 
 */
public class AdvancedMemberStrategy implements MemberStrategy{
	@Override
	public double discountPrice(double bookPrice) {
		return bookPrice*0.8;
	}
}

/**
 * @Title:圖書價格類
 * @Description:TODO
 * @Company: Orclight's Studio
 * @author: shuzl  2013-3-12 下午04:15:57
 * @motto: Never put off what you can do today until Tomorrow
 * @version 1.0.0 
 */
public class BookPrice {
	private MemberStrategy strategy;
	private double price;
	/**
	 * @param strategy
	 */
	public BookPrice(MemberStrategy strategy,double price) {
		super();
		this.strategy = strategy;
		this.price=price;
	}
	/**
	 * 
	 * getRealBookPrice(獲取折扣後的價格)
	 * @return double
	 * @createDate 2013-3-12 下午04:30:26
	 * @since  1.0.0
	 */
	public double getRealBookPrice() {
		return strategy.discountPrice(this.price);
	}
	
	public MemberStrategy getStrategy() {
		return strategy;
	}
	public void setStrategy(MemberStrategy strategy) {
		this.strategy = strategy;
	}
}

/**
 * @Title:圖書打折後的價格--測試類
 * @Description:TODO
 * @Company: Orclight's Studio
 * @author: shuzl  2013-3-12 下午04:17:23
 * @motto: Never put off what you can do today until Tomorrow
 * @version 1.0.0 
 */
public class TestBookPrice {
	public static void main(String[] args) {
		MemberStrategy strategy=new AdvancedMemberStrategy();
		BookPrice bookPrice = new BookPrice(strategy,99.0);
		System.out.println("圖書價格是:"+bookPrice.getRealBookPrice());
	}
}

2 模版方法模式

2.1 模版方法模式

  定義一個演算法的骨架,而將一些實現步驟延遲到子類中。把不變的行為搬到超類,
去除子類中重複的程式碼來體現他的優勢。
類圖如下:


2.2 應用場景

  (1)一次性實現一個演算法的不變的部分,並將可變的行為留給子類來實現
  (2)各子類中公共的行為應被提取出來並集中到一個公共父類中以避免程式碼重複。
首先識別現有程式碼中的不同之處,並且將不同之處分離為新的操作。最後,用一個
呼叫這些新的操作的模板方法來替換這些不同的程式碼。

實現程式碼如下:
/**
 * @Title:模版方法抽象類--定義一個業務的骨架,而將一些實現步驟延遲到子類中
 * @Description:TODO
 * @Company: Orclight's Studio
 * @author: shuzl  2013-3-12 下午02:10:38
 * @motto: Never put off what you can do today until Tomorrow
 * @version 1.0.0 
 */
public abstract class AbstractTemplate {
	/**
	 * 
	 * executeMain(需要在子類實現) 
	 * @createDate 2013-3-12 下午02:12:43
	 * @since  1.0.0
	 */
	public abstract void executeMain();
	
	public void execute() {
		beforeAction();
		executeMain();
		afterAction();
	}
	
	public void beforeAction() {
		System.out.println("before Action...");
	}
	
	public void afterAction() {
		System.out.println("after Action...");
	}
}

/**
 * @Title:模版方法子類--實現其中可變的部分
 * @Description:TODO
 * @Company: Orclight's Studio
 * @author: shuzl  2013-3-12 下午02:13:09
 * @motto: Never put off what you can do today until Tomorrow
 * @version 1.0.0 
 */
public class TemplateImpl extends AbstractTemplate{
	public void executeMain() {
		System.out.println("核心操作處理...實現方式一");
	}
}

/**
 * @Title:模版方法測試類
 * @Description:TODO
 * @Company: Orclight's Studio
 * @author: shuzl  2013-3-12 下午02:14:18
 * @motto: Never put off what you can do today until Tomorrow
 * @version 1.0.0 
 */
public class TestTemplate {
	public static void main(String[] args) {
		AbstractTemplate temp = new TemplateImpl();
		temp.execute();
	}
}

參考文章:
1.策略模式_百度百科  
2.《JAVA與模式》26天系列—第16天—策略模式  
3.Java之模板方法模式  

相關推薦

設計模式系列_策略模式 模版方法模式(Template method)

1.策略模式 1.1 策略模式   策略模式定義了一系列的演算法,並將每一個演算法封裝起來,而且使它們還可以相互替換。 策略模式讓演算法獨立於使用它的客戶而獨立變化。   策略模式屬於物件的行為模式。其用意是針對一組演算法,將每一個演算法封裝到具有 共同介面的獨立的類中,

設計模式系列:建造者模式

1.定義 將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示 2.通用類圖 Product 產品類:表示被構造的複雜物件。通常實現了模板方法模式,也就是有基本方法和模板方法 Builder 抽象建造者:規範產品的元件,一

.NET設計模式-模版方法Template Method

摘要:Template Method模式是比較簡單的設計模式之一,但它卻是程式碼複用的一項基本的技術,在類庫中尤其重要。主要內容1.概述2.Template Method解說3..NET中的Template Method模式4.適用性及實現要點概述變化一直以來都是軟體設計的永恆話題,在XP程式設計中提倡擁抱變

scrapy爬蟲系列--爬取列表詳情

ont str extra utf-8 book line col turn detail 功能點:如何爬取列表頁,並根據列表頁獲取詳情頁信息? 爬取網站:東莞陽光政務網 完整代碼:https://files.cnblogs.com/files/bookwed/yang

【為什麼學習模板方法Template Method模式模板方法Template Method模式主要解決的問題】

轉載 https://blog.csdn.net/eson_15/article/details/51323902 1. 模板方法的一個例項         這一節主要來學習一下設計模式中的模板方法模式。我們先來看一個例子:假如現在老闆讓你做一個汽車的模型,要求只要完成基

java設計模式系列設計模式概要(1)

而不是 行為型模式 一句話 創建 rom 多次 ati 代理模式 之間 一、什麽是設計模式   設計模式(Design pattern)是一套被反復使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。

(原創)我眼中的設計模式系列簡單工廠模式(一)

int 業務 text 們的 acc 現在 rgs sub reat 簡單工廠模式   在日常的軟件開發中,我們一般都是按照模塊來劃分工作的。 場景一:   試想我們現在有這麽一個模塊,為其他的模塊提供服務,比如說我們調用了好幾個外部接口,統一返回XML字符串,每個接口返回

多線程系列:Guarded Suspension 模式

ted override 角色 str lis current bsp ride 安全性 一,什麽是Guarded Suspension模式如果執行現在的處理會造成問題,就讓執行處理的線程等待。這種模式通過讓線程等待來保證實例的安全性 二,實現一個簡單的線程間通信的例子 一

設計模式 _招式_模版方法模式

一、定義 定義一個操作中的演算法框架,而將一些步驟延遲到子類中。使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。模版方法模式確實非常簡單,僅使用了Java的繼承機制,是一種應用非常廣泛的模式。 模版方法模式通用類圖如下: AbstractClass叫做抽象模

Java進階篇設計模式十一 ---- 策略模式模板方法模式

前言 在上一篇中我們學習了行為型模式的訪問者模式(Visitor Pattern)和中介者模式(Mediator Pattern)。本篇則來學習下行為型模式的兩個模式,策略模式(Strategy Pattern)和模板模式(Mediator Pattern)。 策略模式 簡介 策略模式(Stra

設計模式系列---工廠模式

工廠模式的特點是將子類的初始化交給子類工廠去做,缺點是容易造成子類工廠的泛濫,需要什麼樣的子類就要建立對應的子類工廠。 具體的程式碼示例如下: package pattern.factoryPattern.framework; /** * Created by thi

設計模式筆記原型模式

原型模式 為什麼引入原型模式? 當我們需要建立某個物件的時候,我們使用new關鍵字,但是當我們需要建立兩個相同的物件,接著new,當數量特定少的時候,我們可以採用直接建立物件,但是當我們需要建立很多物件的時候,我們就不能一直new,首先是因為堆記憶體有限,只允許我們new

【遊戲設計模式 遊戲程式設計模式 全書內容提煉總結

                這是一篇超過萬字讀書筆記,總結了《Game Programming Patterns》(中譯版《遊戲程式設計模式》)一書中所有章節與內容的知識梗概。我們知道,遊戲行業其實一直很缺一本系統介紹遊戲程式設計進階技巧的書籍,而《遊戲程式設計模式》的出現,正好彌補了這一點。之前已經有提

設計模式系列工廠方法模式

學習的最好方法是實踐,如果不去使用設計模式,永遠也感覺不到它的獨到之處!週六沒事在家看了一個大神的文章《》,感觸很深,大神提到了重構和程式碼設計,就想到學下設計模式,沒事經常重構優化下程式碼,而且忍不住

Java設計模式(經典面試題:工廠模式在開發中的運用)

面試題:        寫一個簡單的計算器。  程式碼實現: 抽象一個運算類: package com.qianyan.calcuator; public abstract class Operation { //數字一 private double num

設計模式系列 模式概述

設計模式的六大原則 1、開閉原則(Open Close Principle) 開閉原則的意思是:對擴充套件開放,對修改關閉。在程式需要進行拓展的時候,不能去修改原有的程式碼,實現一個熱插拔的效果。簡言之,是為了使程式的擴充套件性好,易於維護和升級。想要達到這樣的效果,

PHP設計模式系列):工廠方法模式

工廠方法模式 工廠方法模式(Factory Method Pattern)又稱為工廠模式,也叫虛擬構造器(Virtual Constructor)模式或者多型工廠(Polymorphic Factory)模式,它屬於類建立型模式。在工廠方法模式中,工廠父類負責

設計模式系列三:抽象工廠模式

前言 在設計模式有三個模式是與工廠模式相關的,分別是:簡單工廠模式、工廠方法模式以及抽象工廠模式。在前面的文章中已經談到前面兩種,這裡就對抽象工廠模式介紹一下。抽象工廠模式就是提供一個建立一系列相關或者相互依賴的介面(也就是抽象類),而無需指定具體的類。簡單來

設計模式學習(上)—開自己的比薩店

    前面說過其中之一的設計原則我們不應該依賴實現程式設計,但是當我們每次用new時不正是在依賴實現程式設計嗎 Duck duck = new MallardDuck();  正如上面的程式碼,我們使用介面讓程式碼有了彈性,但是還是得建立具體類的例項,當有一群相關的具體類

Java設計模式系列裝飾者模式

color http span alt uml 9.png 模式 方案 image 裝飾者模式的定義 動態地將責任附加到對象上,若要擴展功能,裝飾者提供了比繼承更有彈性的替代方案 裝飾者模式的UML類圖 Java設計模式系列之裝飾者模式