精通Java設計模式從初見到相愛之工廠+策略模式(3)

為什么80%的碼農都做不了架構師?>>> ??hot3.png

1、公司項目需求。

????用戶簽到活動,會員簽到怎么處理,超級會員怎么處理,普通用戶簽到怎么處理,針對不同的檔次,有不同的方案,所以在項目中用到了策略模式以及簡單工廠模式。

? ? 其實生活中,我們用到的軟件系統都會有這樣的制定級別,比如我們是實體店,他也有一個會員制度,打9折,打七折,打六折的都有,包括我們做頭發,也都有不同級別的剪發卡.... 這些理發店啊、服裝店啊還有什么美容spa店等等用的軟件都會涉及,這就是我們所說的策略模式。

2、策略模式的概念

? ? 概念:針對一類問題,用不同的方式的解決,這就是策略模式!

? ? 舉例1:明星演唱會,我們去買門票,路人甲買的一等座,路人乙買的二等座,路人丙買的外圍座,雖然他們都能看到明星演唱,但是位置不同,針對買座位的不同級別來設置他們的觀看明星位置,就是策略模式!

? ? 舉例2:去李寧專賣店買衣服,路人甲和路人乙買同一件衣服,雖然都能買到衣服,但是路人甲是會員,路人乙是普通用戶,他們支付的錢不一樣,路人甲花錢少,針對買衣服不同人的級別折扣不一樣,就是策略模式!

3、代碼實現

? ? 項目中用到的比較多,例如商城會員、簽到級別、游戲上、這種項目用的策略設計模式比較多

? ? 說個場景,服裝店,買衣服,會員級別分別是:AVip、BVip、CVip 和沒有會員的用戶NoVip,四個級別,打折情況分別是0.6、0.7、0.9和沒有打折

? ? 打折的接口

public interface DisCount {//買東西給折扣Double disCount(Double money);
}

不同會員級別的實現類,不同的折扣

package ceLve;public class AVip implements DisCount {@Overridepublic Double disCount(Double money) {return money * 0.6 ;}
}
package ceLve;public class BVip implements DisCount {@Overridepublic Double disCount(Double money) {return money * 0.7;}
}
package ceLve;public class CVip implements DisCount {@Overridepublic Double disCount(Double money) {return money * 0.9;}
}
package ceLve;public class NoVip implements DisCount {//普通用戶不能打折@Overridepublic Double disCount(Double money) {return money;}
}
package ceLve;public class Customer  {//客戶消費總金額private Double totalAccount =0D;//客戶目前消費金額private Double currentAccount = 0D;//默認消費者 沒有會員等級private DisCount disCount = new NoVip();//消費者 消費商品、衣服的方法public void buy(Double money){this.currentAccount = money;totalAccount       += money;if (totalAccount >= 10000){disCount= new AVip();}else if (totalAccount >= 6000){disCount= new BVip();}else if (totalAccount >= 3000){disCount= new CVip();}else {disCount= new NoVip();}}// 消費者支付public double pay(){return disCount.disCount(currentAccount);}public Double getTotalAccount() {return totalAccount;}public void setTotalAccount(Double totalAccount) {this.totalAccount = totalAccount;}public Double getCurrentAccount() {return currentAccount;}public void setCurrentAccount(Double currentAccount) {this.currentAccount = currentAccount;}}

最后在main函數中執行:

package ceLve;public class Main {public static void main(String[] args){Customer customer = new Customer();customer.buy(5000.00);System.out.println(customer.pay());}
}

運行結果:4500.00

????上面是純粹的是策略模式,現在我要加上簡單工廠模式,其實加上與不加上沒有什么區別,就自我感覺就是吃飯為什么非要用右手使用筷子,而不是左手,小時候家長我只要用左手就打我手。因為我們中國的傳統就是右手,所以因為傳統的原因,目前簡單工廠設計模式也如此,也基本沒什么用,但有人會說硬編碼,不能隨隨便便new,那好吧,今天把簡單工廠模式也加進去。

? ? 修改方案:修改Customer類,新增簡單工廠類CountFactory

package ceLve;public class Customer  {//客戶消費總金額private Double totalAccount =0D;//客戶目前消費金額private Double currentAccount = 0D;//默認消費者 沒有會員等級private DisCount disCount = new NoVip();//消費者 消費商品、衣服的方法public void buy(Double money){this.currentAccount = money;totalAccount       += money;disCount = CountFactory.createCount(this);}// 消費者支付public double pay(){return disCount.disCount(currentAccount);}public Double getTotalAccount() {return totalAccount;}public void setTotalAccount(Double totalAccount) {this.totalAccount = totalAccount;}public Double getCurrentAccount() {return currentAccount;}public void setCurrentAccount(Double currentAccount) {this.currentAccount = currentAccount;}}
public class CountFactory {private CountFactory(){}public static DisCount createCount(Customer customer){if (customer.getTotalAccount() >= 10000){return new AVip();}else if (customer.getTotalAccount() >= 6000){return new BVip();}else if (customer.getTotalAccount() >= 3000){return new CVip();}else {return new NoVip();}}
}

main函數代碼不變

結果依然4500.00

其實大家看下來就感覺沒那么多必要的,我直接if else也可以解決的,沒有這么麻煩呀,不對的,簡單的小項目可以這樣,但是如果活動量增加的話,沒必要在controller或者service層去判斷它應用那種策略,他其實說白了就是一個處理方式的一個工具類!我們把它封裝好,什么時候用,什么時候調用就好,就像jdk中的時間,其實我們項目中也會有很多工具類,他其實有點類似那樣!

????

?

轉載于:https://my.oschina.net/mdxlcj/blog/1787501

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/283729.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/283729.shtml
英文地址,請注明出處:http://en.pswp.cn/news/283729.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

jquery weui 中alert彈出框在ios中跳動問題

問題描述: jquery-weui中的彈出框在ios上會有一個右下角向中間滑動的效果,在Android上沒有這個效果。 解決方法: 修該jquery-weui.js中的openModal方法如下圖: 轉載于:https://www.cnblogs.com/xianZJ/p/6773097.html

WPF效果第一百九十五篇之又玩ListBox

ListBox一直是我的最愛;今天再次基于他玩耍一下不一樣的效果;閑話不多扯直接看效果:1、這次直接用的ItemContainerStyle:2、通過HitTest實現點選邊框:Point point e.GetPosition(LightDarkListBox); VisualTreeHelper.HitTest(LightDarkListBox, new HitTestFilter…

Web3,互聯網新造神“機器”?

本文來自微信公眾號:每經頭條 (ID:nbdtoutiao),作者:李蕾,編輯:肖芮冬,頭圖來自:視覺中國 “與目前的互聯網相比,Web3基于區塊鏈等底層技術&#…

Gradle實戰:發布aar包到maven倉庫

查看原文:http://blog.csdn.net/u0108184... Gradle實戰系列文章:《Gradle基本知識點與常用配置》《Gradle實戰:Android多渠道打包方案匯總》《Gradle實戰:不同編譯類型的包同設備共存》《Gradle實戰:執行sql操作hive…

synchronized與Lock的區別

類別synchronizedLock存在層次Java的關鍵字,在jvm層面上是一個類鎖的釋放1、以獲取鎖的線程執行完同步代碼,釋放鎖 2、線程執行發生異常,jvm會讓線程釋放鎖在finally中必須釋放鎖,不然容易造成線程死鎖鎖的獲取假設A線程獲得鎖&am…

even兼容

var eventarguments.callee.caller.arguments[0]||window.event;//消除瀏覽器差異 var ewindow.event||event; //消除瀏覽器差異 轉載于:https://www.cnblogs.com/webqiand/articles/11250768.html

普通中年人的真實出路

閱讀本文大概需要6分鐘。互聯網人甚至中國整體的用工市場的確有中年淘汰的問題,我們可以當它不存在,甚至當有人給出解法的時候,我們也可以認為他們在傳播焦慮,但事實就是事實,它的存在不隨個人意愿而轉移。最近抖音上有…

項目管理常見的問題

綜合管理 缺乏企業級的項目管理平臺;項目目標不清楚;項目經理不了解項目管理流程和工具;項目模板不統一;計劃意識薄弱,缺乏規范的分解。難以過程監控,實時地了解項目進度,靠手工統計和匯報項目進度,難以真實反映進度。項目控制不力&#xff0…

常用小提示

阿里云Linux安裝軟件鏡像源 第一步:備份你的原鏡像文件,以免出錯后可以恢復。 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup第二步:下載新的CentOS-Base.repo 到/etc/yum.repos.d/ CentOS 5 wget -O /etc…

抽象工廠模式(Absraact Factory)介紹與實現

創建一個IProduct,后面模擬業務時要用到 package com.xiawei.factory; public class IProduct { private String productNo "";} package com.xiawei.factory;/** * 規范工廠接口 </p> *///創建一個所有工廠的規范接口,后面所有的工廠類都要來實現這個接口,并…

【溫故知新】C# Linq中 Select SelectMany 使用技巧

微信公眾號&#xff1a;趣編程ACE關注可了解更多的.NET日常實戰開發技巧&#xff0c;如需源碼 后臺回復 源碼 即可;如果覺得對你有幫助&#xff0c;歡迎關注C# Linq中 Select && SelectMany 使用技巧Select 和 SelectMany 是我們開發中對集合常用的兩個擴展方法&#x…

bzoj4870

http://www.lydsy.com/JudgeOnline/problem.php?id4870 矩陣快速冪。。。 人話題意&#xff1a;從nk個物品里選模k余r個物品&#xff0c;問方案數模P 那么我們有方程 f[i][j]f[i-1][j]f[i-1][j-1] 跟組合數一個樣子 j∈(0,k) 這個物品選還是不選加起來 構造矩陣&#xff1a;x.…

15000 字的 SQL 語句大全,值得收藏!

基礎 1、說明&#xff1a;創建數據庫 CREATE DATABASE database-name 2、說明&#xff1a;刪除數據庫 drop database dbname 3、說明&#xff1a;備份sql server --- 創建 備份數據的 device USE master EXEC sp_addumpdevice disk, testBack, c:\mssql7backup\MyNwind_1.dat -…

Codeforces Round #410 (Div. 2) D. Mike and distribution 思維+數學

鏈接&#xff1a; http://codeforces.com/contest/798/problem/D 題意&#xff1a; 給你兩個長度為n的數列a和b&#xff0c;讓你選n/21個下標&#xff0c;使得2*∑ai>suma,2*∑bi>sumb 題解1&#xff1a; 用一個叫random_shuffle的東西&#xff0c;每次都亂選&#xff0c…

PerfView專題 (第三篇):如何尋找 C# 中的 VirtualAlloc 內存泄漏

一&#xff1a;背景 上一篇我們聊到了如何用 PerfView 去偵察 NTHeap 的內存泄漏&#xff0c;這種內存泄漏往往是用 C 的 malloc 或者 C 的 new 分配而不釋放所造成的&#xff0c;這一篇我們來聊一下由 VirtualAlloc 方法造成的泄漏如何去甄別&#xff1f;了解 VirtualAlloc 的…

[APP]- 找回Xcode7的代碼折疊功能

為什么80%的碼農都做不了架構師&#xff1f;>>> 原 找回Xcode7的代碼折疊功能 升級到Xcode7后&#xff0c;會發現代碼折疊功能不見了&#xff0c;這是怎么回事&#xff1f; 其實這個功能還在的&#xff0c;只是蘋果默認把這個功能禁掉了&#xff1a;在Xcode菜單里選…

有哪些值得推薦的.NET ORM框架?

前言&#xff1a; 最近有很多同學問我.NET方面有哪些好用的ORM框架&#xff0c;我覺得這方面的介紹網上應該會介紹的比較全面文章&#xff0c;于是我想搜一篇全面的介紹文章發給他們結果我發現網上說來說去基本上就是那幾個&#xff0c;于是就有了這篇文章。 什么是ORM? ORM 是…

從S3中導入數據到Dynamodb

本節如果你已經從Dynamodb中導出過數據&#xff0c;而且導出的文件以及被存入S3。文件內部結構會在Verify Data Export File 中描寫敘述。我們稱之前導出數據的原始表為source table&#xff0c;數據將要被導入的表為destination table。你能夠將S3中的導出文件導入到dynamodb的…

HTML5程序開發范例寶典 完整版 (韓旭等著) 中文pdf掃描版

HTML5程序開發范例寶典緊密圍繞編程者在編程中遇到的實際問題和開發中應該掌握的技術&#xff0c;全面介紹了利用HTML進行程序開發的各方面技術和技巧。全書共16章&#xff0c;內容包括HTML網頁布局、HTML基本元素、HTML高級元素、表單的使用、列表的使用、超鏈接、表格應用、圖…

ASP.NET Core 6框架揭秘實例演示[11]:診斷跟蹤的幾種基本編程方式

在整個軟件開發維護生命周期內&#xff0c;最難的不是如何將軟件系統開發出來&#xff0c;而是在系統上線之后及時解決遇到的問題。一個好的程序員能夠在系統出現問題之后馬上定位錯誤的根源并找到正確的解決方案&#xff0c;一個更好的程序員能夠根據當前的運行狀態預知未來可…