电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Java通俗易懂系列設計模式之策略模式

瀏覽:28日期:2022-08-13 18:09:37
介紹

策略設計模式是行為設計模式之一。當我們為特定任務使用多個算法時,使用策略模式,客戶端決定在運行時使用的實際實現。

Java通俗易懂系列設計模式之策略模式

策略模式的最佳示例之一是Collections.sort()采用Comparator參數的方法。基于Comparator接口的不同實現,對象將以不同的方式進行排序。

實例

對于我們的示例,我們將嘗試實施一個簡單的購物車,我們有兩種付款策略 - 使用信用卡或使用PayPal。

首先,我們將為我們的策略模式示例創建接口,在我們的例子中,支付金額作為參數傳遞。支付方式:PaymentStrategy.java

package com.journaldev.design.strategy;public interface PaymentStrategy {public void pay(int amount);}

現在我們將不得不使用信用卡/借記卡或通過PayPal為支付創建具體的算法實現。

信用卡付款:CreditCardStrategy.java

package com.journaldev.design.strategy;public class CreditCardStrategy implements PaymentStrategy {private String name;private String cardNumber;private String cvv;private String dateOfExpiry;public CreditCardStrategy(String nm, String ccNum, String cvv, String expiryDate){this.name=nm;this.cardNumber=ccNum;this.cvv=cvv;this.dateOfExpiry=expiryDate;}@Overridepublic void pay(int amount) {System.out.println(amount +' paid with credit/debit card');}}

Paypal付款:PaypalStrategy.java

package com.journaldev.design.strategy;public class PaypalStrategy implements PaymentStrategy {private String emailId;private String password;public PaypalStrategy(String email, String pwd){this.emailId=email;this.password=pwd;}@Overridepublic void pay(int amount) {System.out.println(amount + ' paid using Paypal.');}}

現在我們的策略模式示例算法準備好了。我們可以實施購物車和付款方式將需要輸入作為付款策略。

package com.journaldev.design.strategy;public class Item {private String upcCode;private int price;public Item(String upc, int cost){this.upcCode=upc;this.price=cost;}public String getUpcCode() {return upcCode;}public int getPrice() {return price;}}

ShoppingCart.java

package com.journaldev.design.strategy;import java.text.DecimalFormat;import java.util.ArrayList;import java.util.List;public class ShoppingCart {//List of itemsList<Item> items;public ShoppingCart(){this.items=new ArrayList<Item>();}public void addItem(Item item){this.items.add(item);}public void removeItem(Item item){this.items.remove(item);}public int calculateTotal(){int sum = 0;for(Item item : items){sum += item.getPrice();}return sum;}public void pay(PaymentStrategy paymentMethod){int amount = calculateTotal();paymentMethod.pay(amount);}}

請注意,購物車的付款方式需要付款算法作為參數,并且不會將其作為實例變量存儲在任何位置。

讓我們用一個簡單的程序測試我們的策略模式示例設置。

ShoppingCartTest.java

package com.journaldev.design.strategy;public class ShoppingCartTest {public static void main(String[] args) {ShoppingCart cart = new ShoppingCart();Item item1 = new Item('1234',10);Item item2 = new Item('5678',40);cart.addItem(item1);cart.addItem(item2);//pay by paypalcart.pay(new PaypalStrategy('myemail@example.com', 'mypwd'));//pay by credit cardcart.pay(new CreditCardStrategy('Pankaj Kumar', '1234567890123456', '786', '12/15'));}}

上述程序的輸出是:

50 paid using Paypal.

50 paid with credit/debit card

類圖

Java通俗易懂系列設計模式之策略模式

總結

我們可以使用組合為策略創建實例變量,但我們應該避免這種情況,因為我們希望將特定策略應用于特定任務。在Collections.sort()和Arrays.sort()方法中遵循相同的方法,將比較器作為參數。

策略模式與狀態模式(State Pattern)非常相似。其中一個區別是Context包含狀態作為實例變量,并且可以有多個任務,其實現可以依賴于狀態,而策略模式策略作為參數傳遞給方法,上下文對象沒有任何變量來存儲它。

當我們為特定任務提供多個算法時,策略模式很有用,我們希望我們的應用程序可以靈活地在運行時為特定任務選擇任何算法。

優點:1、算法可以自由切換。2、避免使用多重條件判斷。3、擴展性良好。 缺點:1、策略類會增多。 2、所有策略類都需要對外暴露。 主要解決:在有多種算法相似的情況下,使用 if...else 所帶來的復雜和難以維護。 何時使用:一個系統有許多許多類,而區分它們的只是他們直接的行為。 如何解決:將這些算法封裝成一個一個的類,任意地替換。 關鍵代碼:實現同一個接口。 使用場景: 1、如果在一個系統里面有許多類,它們之間的區別僅在于它們的行為,那么使用策略模式可以動態地讓一個對象在許多行為中選擇一種行為。 2、一個系統需要動態地在幾種算法中選擇一種。 3、如果一個對象有很多的行為,如果不用恰當的模式,這些行為就只好使用多重的條件選擇語句來實現。 注意事項:如果一個系統的策略多于四個,就需要考慮使用混合模式,解決策略類膨脹的問題。

以上就是Java通俗易懂系列設計模式之策略模式的詳細內容,更多關于Java設計模式的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
主站蜘蛛池模板: 东莞工厂厂房装修_无尘车间施工_钢结构工程安装-广东集景建筑装饰设计工程有限公司 | HEYL硬度计量泵-荧光法在线溶解氧仪-净时测控技术(上海)有限公司 | 手持式3d激光扫描仪-便携式三维立体扫描仪-北京福禄克斯 | 寮步纸箱厂_东莞纸箱厂 _东莞纸箱加工厂-东莞市寮步恒辉纸制品厂 | 日本SMC气缸接头-速度控制阀-日本三菱伺服电机-苏州禾力自动化科技有限公司 | 培训一点通 - 合肥驾校 - 合肥新亚驾校 - 合肥八一驾校 | 电伴热系统施工_仪表电伴热保温箱厂家_沃安电伴热管缆工业技术(济南)有限公司 | 日本SMC气缸接头-速度控制阀-日本三菱伺服电机-苏州禾力自动化科技有限公司 | 沈阳真空机_沈阳真空包装机_沈阳大米真空包装机-沈阳海鹞真空包装机械有限公司 | 3d可视化建模_三维展示_产品3d互动数字营销_三维动画制作_3D虚拟商城 【商迪3D】三维展示服务商 广东健伦体育发展有限公司-体育工程配套及销售运动器材的体育用品服务商 | 郑州外墙清洗_郑州玻璃幕墙清洗_郑州开荒保洁-河南三恒清洗服务有限公司 | X光检测仪_食品金属异物检测机_X射线检测设备_微现检测 | 振动筛,震动筛,圆形振动筛,振动筛价格,振动筛厂家-新乡巨宝机电 蒸汽热收缩机_蒸汽发生器_塑封机_包膜机_封切收缩机_热收缩包装机_真空机_全自动打包机_捆扎机_封箱机-东莞市中堡智能科技有限公司 | 食品质构分析仪-氧化诱导分析仪-瞬态法导热系数仪|热冰百科 | 深圳宣传片制作_产品视频制作_深圳3D动画制作公司_深圳短视频拍摄-深圳市西典映画传媒有限公司 | 拉力机-拉力试验机-万能试验机-电子拉力机-拉伸试验机-剥离强度试验机-苏州皖仪实验仪器有限公司 | 大型多片锯,圆木多片锯,方木多片锯,板材多片锯-祥富机械有限公司 | 特材真空腔体_哈氏合金/镍基合金/纯镍腔体-无锡国德机械制造有限公司 | 自动螺旋上料机厂家价格-斗式提升机定制-螺杆绞龙输送机-杰凯上料机 | 餐饮小吃技术培训-火锅串串香培训「何小胖培训」_成都点石成金[官网] | 【灵硕展览集团】展台展会设计_展览会展台搭建_展览展示设计一站式服务公司 | 小青瓦丨古建筑瓦丨青瓦厂家-宜兴市徽派古典建筑材料有限公司 | 【化妆品备案】进口化妆品备案流程-深圳美尚美化妆品有限公司 | 仿真植物|仿真树|仿真花|假树|植物墙 - 广州天昆仿真植物有限公司 | 【电子厂招聘_普工招工网_工厂招聘信息平台】-工立方打工网 | 德国UST优斯特氢气检漏仪-德国舒赐乙烷检测仪-北京泽钏 | 无轨电动平车_轨道平车_蓄电池电动平车★尽在新乡百特智能转运设备有限公司 | 【甲方装饰】合肥工装公司-合肥装修设计公司,专业从事安徽办公室、店面、售楼部、餐饮店、厂房装修设计服务 | 东莞市踏板石餐饮管理有限公司_正宗桂林米粉_正宗桂林米粉加盟_桂林米粉加盟费-东莞市棒子桂林米粉 | 注塑机-压铸机-塑料注塑机-卧式注塑机-高速注塑机-单缸注塑机厂家-广东联升精密智能装备科技有限公司 | 两头忙,井下装载机,伸缩臂装载机,30装载机/铲车,50装载机/铲车厂家_价格-莱州巨浪机械有限公司 | Q361F全焊接球阀,200X减压稳压阀,ZJHP气动单座调节阀-上海戎钛 | [官网]叛逆孩子管教_戒网瘾学校_全封闭问题青少年素质教育_新起点青少年特训学校 | 广州印刷厂_广州彩印厂-广州艺彩印务有限公司 | 成人纸尿裤,成人尿不湿,成人护理垫-山东康舜日用品有限公司 | 轴承振动测量仪电箱-轴承测振动仪器-测试仪厂家-杭州居易电气 | 工作心得_读书心得_学习心得_找心得体会范文就上学道文库 | 广州物流公司_广州货运公司_广州回程车运输 - 万信物流 | 乳化沥青设备_改性沥青设备_沥青加温罐_德州市昊通路桥工程有限公司 | 阁楼货架_阁楼平台_仓库仓储设备_重型货架_广州金铁牛货架厂 | SDG吸附剂,SDG酸气吸附剂,干式酸性气体吸收剂生产厂家,超过20年生产使用经验。 - 富莱尔环保设备公司(原名天津市武清县环保设备厂) |