大話設計模式之策略模式

第二章:商場促銷——策略模式

策略模式的定義:
策略模式是一種定義一系列算法的方法,從概念上來看,所有這些算法完成的都是相同的工作,知識實現不同,他可以以相同的方式調用所有的算法,減少了各類算法類與使用算法類之間的耦合
策略模式的優點 :
1. 策略模式的Strategy 類層次為Context定義了一些列的可供重用的算法或行為。繼承有助于析取這些算法中的公共功能
2.簡化了單元測試,因為每個算法都要自己的類,可以通過自己的接口單獨測試
當不同的行為堆砌在一個類中時,就很難避免使用條件語句來選擇合適的行為,將這些行為封裝在一個個獨立的Strategy類中,可以在使用這些行為的類中消除條件語句
策略模式就是用來封裝算法的,但是在實踐中,我們發現可以用它來封裝幾乎任何類型的規則,只要在分析過程中聽到需要在不同實踐應用不同的業務規則,就可以考慮使用策略模式處理這種變化的可能性
在基本的策略模式中,選擇所用具體實現的職責有客戶端對象承擔,并轉給策略模式的Context對象

父類CashSuper

CashSuper.h

@interface CashSuper : NSObject
-(double)acceptCash:(double)money;
@end

CashSuper.m

@implementation CashSuper

-(double)acceptCash:(double)money{

? ? return money;

}

@end

正常消費類 CashNormal

CashNormal.h

#import <Foundation/Foundation.h>
#import "CashSuper.h"
@interface CashNormal : CashSuper@end

CashNormal.m

#import "CashNormal.h"@implementation CashNormal
-(double)acceptCash:(double)money{return money;
}
@end

打折消費類CashRebate

CashRebate.h

#import <Foundation/Foundation.h>
#import "CashSuper.h"
@interface CashRebate : CashSuper
@property(assign,nonatomic)double Rebate;
-(instancetype)initWithRebate:(double) Rebate;
@end

CashRebate.m

#import "CashRebate.h"@implementation CashRebate
- (instancetype)initWithRebate:(double)Rebate{self = [super init];if (self) {_Rebate=Rebate;}return self;
}
-(double)acceptCash:(double)money{return money*_Rebate;
}
@end

返利消費類CashReturn

CashReturn.h

#import <Foundation/Foundation.h>
#import "CashSuper.h"
@interface CashReturn : CashSuper
@property(assign,nonatomic)double moneyCondition;
@property(assign,nonatomic)double moneyReturn;
-(instancetype)initWithMoneyCondition:(double)moneyCondition :(double)moneyReturn;
@end

CashReturn.m

#import "CashReturn.h"@implementation CashReturn
-(instancetype)initWithMoneyCondition:(double)moneyCondition :(double)moneyReturn
{self = [super init];if (self) {_moneyCondition=moneyCondition;_moneyReturn=moneyReturn;}return self;
}
-(double)acceptCash:(double)money{double result=money;if (money>=_moneyCondition) {result=money-((int)(money/_moneyCondition))*_moneyReturn;}return result;
}
@end

配置類,維護對對象的使用CashContext類

CashContext.h

#import <Foundation/Foundation.h>
#import "CashSuper.h"
@interface CashContext : NSObject
@property(nonatomic,strong)CashSuper *cashsuper;
-(instancetype)initWith:(CashSuper *)csuper;
-(double)GetResult:(double)money;
@end

CashContext.m

#import "CashContext.h"@implementation CashContext
- (instancetype)initWith:(CashSuper *)csuper
{self = [super init];if (self) {_cashsuper=csuper;}return self;
}
-(double)GetResult:(double)money{return  [_cashsuper acceptCash:money];}
@end

主函數

#import <Foundation/Foundation.h>
#import "CashContext.h"
#import "CashSuper.h"
#import "CashNormal.h"
#import "CashRebate.h"
#import "CashReturn.h"
int main(int argc, const char * argv[]) {@autoreleasepool {char type='B';double result=0.0;CashContext *cc=nil;switch (type) {case 'N':cc=[[CashContext alloc]initWith:[[CashNormal alloc]init]];break;case 'B':cc=[[CashContext alloc]initWith:[[CashRebate alloc]initWithRebate:0.7]];break;case 'T':cc=[[CashContext alloc]initWith:[[CashReturn alloc] initWithMoneyCondition:300 :100]];break;}result = [cc GetResult:500];NSLog(@"%f",result);}return 0;
}

運行打折類

轉載于:https://www.cnblogs.com/qianLL/p/5232126.html

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

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

相關文章

【Python學習】——語言風格(變量賦值、深淺拷貝、for循環陷阱)

目錄 1、賦值 2、賦值的分類——引用賦值、值賦值 1) 不可變對象引用賦值——字符串、數值、元組等 2&#xff09;可變對象引用賦值——列表、集合、字典 3&#xff09;可變與不可變對象的引用賦值內部分析 4&#xff09;在py文件中&#xff0c;和作用域有關&#xff0c;如…

underscore.js 頁面數據渲染

1.underscore.js 源碼 // Underscore.js 1.8.3 // http://underscorejs.org // (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors // Underscore may be freely distributed under the MIT license.(function() {// …

判斷莊家是否出貨

1. 大盤處于強勢的時候 日平均線在橫盤的時候&#xff0c;緩慢拉升然后急劇下跌 高位盤整的時候 2. 有利好消息發布的時候 因為莊家會利用這個對于散戶來說這個買入時機來進行出貨操作&#xff0c;可見莊家真是陰險狡詐轉載于:https://www.cnblogs.com/dcz1001/p/6115893.html

【深度學習】——常見深度學習模型總結、anchor-free和anchor-based

目錄 1、faster rcnn&#xff1a; 2、SSD&#xff1a; 3、YOLOv1: 小結&#xff1a; 拓展&#xff1a;anchor-based和anchor-free anchor 1、faster rcnn&#xff1a; FasterRcnn 算法原理講解筆記&#xff08;非常詳細&#xff09;https://blog.csdn.net/xjtdw/article…

PHP PDO函數庫詳解

PDO是一個“數據庫訪問抽象層”&#xff0c;作用是統一各種數據庫的訪問接口&#xff0c;與mysql和mysqli的函數庫相比&#xff0c;PDO讓跨數據庫的使用更具有親和力&#xff1b;與ADODB和MDB2相比&#xff0c;PDO更高效。目前而言&#xff0c;實現“數據庫抽象層”任重而道遠&…

數據交互相關分享

Python與web Python Web.py與AJAX交互轉載于:https://juejin.im/post/5a40af3d6fb9a044ff31b1f5

springMVC 相對于 Structs 的優勢

智者說&#xff0c;沒有經過自己的思考和估量&#xff0c;就不能接受別人的東西。資料只能是一個參考&#xff0c;至于是否正確&#xff0c;還得自己去分辨 SpringMVC相對于Structs的幾個優勢&#xff1a; 1、springMVC安全性更高&#xff0c;structs2框架是類級別的攔截&#…

YOLOV1學習

YOLOV1學習&#xff08;輸入的圖像固定大小為448X448X3&#xff09; 參考文獻 模型結構 將輸入的圖像歸一化為大小為448x448x3的圖像&#xff0c;然后將經過中間24層的卷積后得到了7x7x1024的特征圖&#xff0c;然后后面連接的是兩個全連接層&#xff0c;分別是4096和1470&am…

KUKA通信 CREAD問題

嗨。 我想通過串行端口1發送X&#xff0c;Y&#xff0c;Z&#xff0c;A&#xff0c;B&#xff0c;C坐標給機器人。 G1: ...... CREAD(HANDLE,SR_T,MR_T,TIMEOUT,OFFSET,"%F",X) P.XX CREAD(HANDLE,SR_T,MR_T,TIMEOUT,OFFSET,"%F",Y) P.YY ...... GOTO G1…

bzoj 1901: Zju2112 Dynamic Rankings

Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 6245 Solved: 2593[Submit][Status][Discuss]Description 給定一個含有n個數的序列a[1],a[2],a[3]……a[n]&#xff0c;程序必須回答這樣的詢問&#xff1a;對于給定的i,j,k&#xff0c;在a[i],a[i1],a[i2]……a[j]中第k小的…

第 36 章 RRDTool

36.1. install $ apt-get install rrdtool原文出處&#xff1a;Netkiller 系列 手札 本文作者&#xff1a;陳景峯 轉載請與作者聯系&#xff0c;同時請務必標明文章原始出處和作者信息及本聲明。

手機號碼已經注冊寫到數據庫中,如何利用相同手機號碼再次注冊?

手機號碼已經注冊寫到數據庫中&#xff0c;如何利用相同手機號碼再次注冊&#xff1f; 解&#xff1a;刪除數據庫中以前注冊的手機號碼就可以了啊&#xff0c;delete那條記錄&#xff0c;轉載于:https://www.cnblogs.com/panxuejun/p/6122499.html

騰訊技術研究類和數據分析第一次筆試(2021.8.22)——Python

第一題&#xff1a;開鎖——數學期望 # 最優策略&#xff1a;鑰匙的選擇先從消耗時間最少的開始選擇&#xff0c;然后選擇第二小的依次類推 # 開鎖概率1/n def openLockTime(n, m, time):time_reverse [] # (n,m)->(m,n)for i in range(m):m_time []for j in range(n):m…

教你怎樣選擇伺服電機控制方式

伺服電機一般都有三種控制方式&#xff1a;速度控制方式&#xff0c;轉矩控制方式&#xff0c;位置控制方式 。 速度控制和轉矩控制都是用模擬量來控制的。位置控制是通過發脈沖來控制的。具體采用什么控制方式要根據客戶的要求&#xff0c;滿足何種運動功能來選擇。 …

.Net Discovery系列之四 深入理解.Net垃圾收集機制(下)

上一節給大家介紹了 .Net GC的運行機制&#xff0c;下面來講下與GC相關的重要方法。 第二節&#xff0e;GC關鍵方法解析 1.Dispose()方法 Dispose可用于釋放所有資源&#xff0c;包括托管的和非托管的&#xff0c;需要自己實現。 大多數的非托管資源都要求手動釋放&#xff0c;…

真靜態和偽靜態的區別

首先肯定的是純靜態和偽靜態都是SEO的產物&#xff0c;但純靜態和偽靜態還是有很大區別的。 純靜態是生成真實的HTML頁面保存到服務器端&#xff0c;用戶訪問時直接訪問這 個HTML頁面即可&#xff0c;從而大大的減輕了服務器壓力&#xff08;如dedecms就是采用的純靜態&#xf…

非常有趣的Console

console覺醒之路&#xff0c;打印個動畫如何&#xff1f; 原文地址: http://www.helloweba.com/view-blog-383.html 批量去掉或替換文本中的換行符&#xff08;notepad、sublime text2&#xff09; 原文地址&#xff1a;http://m.blog.csdn.net/article/details?id43228729 有…

shopee蝦皮科技測試工程師第一次筆試

10道單選題 10道多選題 2道編程題 第一題&#xff1a;十進制轉二進制計算1的個數&#xff08;負數轉為補碼&#xff09; #!/usr/bin/env python # -*- coding: utf-8 -*- # Time : 2021/8/23 15:44 # Author : linlianqin # Site : # File : 十進制轉換為二進制&am…

假期實踐

第一天 地點:杭州頤高數碼城 第一天&#xff0c;我來到了自己家附近的頤高數碼城。文三路這邊有一個賣數碼產品的一條街&#xff0c;這里也是最貼近我專業實踐的地方&#xff0c;所以第一天的實踐我選擇了這里。 2001年開業的頤高數碼廣場座落于“電子一條街”文三路、學院路口…

3.AngularJS-過濾器

轉自&#xff1a;https://www.cnblogs.com/best/p/6225621.html 二、過濾器 使用過濾器格式化數據&#xff0c;變換數據格式&#xff0c;在模板中使用一個插值變量。語法格式如下&#xff1a; {{ express | filter:parameter1:p2:p3… | … | …}} 過濾器分了內置過濾器與自定義…