設計模式——策略模式:會員價格體系的簡單實現

前言

上面這張圖是京東商城的會員體系,總共包含五種不一樣等級的會員,分別是註冊會員,銅牌會員,銀牌會員,黃金會員,鑽石會員。從上圖能夠看出,不一樣等級會員享有不一樣的優惠服務,那麼這麼多優惠服務在程序中是怎麼實現的呢?最直接了當的方式,就是寫一堆if else去作判斷,這顯然不是最佳實現方式,很不利於後期維護。實際上這裏須要用到設計模式中的策略模式,針對不一樣等級的會員,每一種會員特權都拒用不一樣的優惠策略。java

策略模式

定義算法簇,分別封裝起來,讓他們之間能夠互相替換,此模式讓算法的變化獨立於使用算法的客戶。算法

策略模式結構原型

策略模式的組成

應用場景(Context):設計模式

一、須要使用ConcreteStrategy提供的算法。post

二、 內部維護一個Strategy的實例。this

三、 負責動態設置運行時Strategy具體的實現算法。spa

四、負責跟Strategy之間的交互和數據傳遞。.net

抽象策略(StrategyInterface): 定義了一個公共接口,各類不一樣的算法以不一樣的方式實現這個接口,Context使用這個接口調用不一樣的算法,通常使用接口或抽象類實現。設計

具體策略(Strategy):包裝了相關的算法和行爲。code

具體應用場景

具體策略劃分

咱們如今來模仿京東會員機制,將會員分爲三種等級:普通會員,金牌會員,鑽石會員。如下爲會員優惠服務,不一樣等級的會員擁有不一樣的優惠策略:orm

優惠服務\會員等級 普通會員 黃金會員 鑽石會員
會員特價 正常價 打九折 打九折
運費 5元 5元 包郵

會員策略模型

代碼實現

抽象策略角色

會員接口:MemberInterface.java

package strategy.member;
/**
 * 會員接口
 * @author vision
 */
public interface MemberInterface {
	/**
	 * 會員價格
	 * @param price
	 * @return
	 */
	public Double getPrice(Double price);
	/**
	 * 是否包郵
	 * @return
	 */
	public boolean freeShipping();
}

具體策略角色

普通會員:NormalMember.java

package strategy.member.impl;

import strategy.member.MemberInterface;
/**
 * 普通會員
 * @author vision
 */
public class NormalMember implements MemberInterface{
	/**
	 * 會員價格,正常價
	 */
	public Double getPrice(Double price) {
		//普通會員原價銷售
		return price;
	}
	/**
	 * 不包郵
	 */
	public boolean freeShipping() {
		//普通會員不包郵
		return false;
	}

}

黃金會員:GoldMember.java

package strategy.member.impl;

import strategy.member.MemberInterface;
/**
 * 黃金會員
 * @author vision
 */
public class GoldMember implements MemberInterface{
	/**
	 * 會員價格,打九折
	 */
	public Double getPrice(Double price) {
		return price*0.9;
	}
	/**
	 * 不包郵
	 */
	public boolean freeShipping() {
		return false;
	}
	
}

鑽石會員:DiamondMember.java

package strategy.member.impl;

import strategy.member.MemberInterface;
/**
 * 鑽石會員
 * @author vision
 */
public class DiamondMember implements MemberInterface{
	/**
	 * 會員價格,打九折
	 */
	public Double getPrice(Double price) {
		return price*0.9;
	}
	/**
	 * 包郵
	 */
	public boolean freeShipping() {
		return true;
	}

}

環境角色

PriceHandle.java

package strategy;

import strategy.member.MemberInterface;
import strategy.member.impl.DiamondMember;
import strategy.member.impl.GoldMember;
import strategy.member.impl.NormalMember;
/**
 * 價格處理類
 * @author vision
 * @date 2016年10月12日
 */
public class PriceHandle {
	
	private MemberInterface memberInterface;

	public void setMemberInterface(MemberInterface memberInterface) {
		this.memberInterface = memberInterface;
	}

	/**
	 * 計算出須要支付的費用
	 * @return
	 */
	private Double getMemberPrice(Double price){
		Double postage=5.0;
		if(memberInterface.freeShipping()){
			postage=0.0;
		}
		return (memberInterface.getPrice(price)+postage);
	}
}

客戶端調用

public class TestClass{
	public static void main(String[] args) {
		PriceHandle priceHandle=new PriceHandle();
		//會員等級(0普通會員,1黃金會員,2鑽石會員)
		int memberType=2;
		switch (memberType) {
		case 0:
			priceHandle.setMemberInterface(new NormalMember());
			break;
		case 1:
			priceHandle.setMemberInterface(new GoldMember());
			break;
		case 2:
			priceHandle.setMemberInterface(new DiamondMember());
			break;
		}
		System.out.println(priceHandle.getMemberPrice(10.0));;
	}
}

備註

參考資料:《Head First 設計模式》

相關文章:《設計模式——觀察者模式:天氣推送的兩種實現》

相關文章
相關標籤/搜索