策略模式 极其简单的列子
第一篇博客
本文來(lái)自 自己老師 的博客 http://blog.csdn.net/lovelion/article/details/7818983
題目:某軟件公司為某電影院開(kāi)發(fā)了一套影院售票系統(tǒng),在該系統(tǒng)中需要為不同類(lèi)型的用戶(hù)提供不同的電影票打折方式,具體打折方案如下:
????? (1) 學(xué)生憑學(xué)生證可享受票價(jià)8折優(yōu)惠;
????? (2) 年齡在10周歲及以下的兒童可享受每張票減免10元的優(yōu)惠(原始票價(jià)需大于等于20元);
????? (3) 影院VIP用戶(hù)除享受票價(jià)半價(jià)優(yōu)惠外還可進(jìn)行積分,積分累計(jì)到一定額度可換取電影院贈(zèng)送的獎(jiǎng)品。
????? 該系統(tǒng)在將來(lái)可能還要根據(jù)需要引入新的打折方式
1.要滿(mǎn)足開(kāi)閉原則 二話(huà)不說(shuō)先定義抽象類(lèi)或接口
namespace StrategyTest {/// <summary>/// 抽象策略類(lèi) (折扣類(lèi))/// </summary>public interface IAbsStrategy{/// <summary>/// 打折 抽象方法(用拼音。。)/// </summary>/// <param name="price">價(jià)格</param>/// <returns>double</returns>double DaZhe(double price);} }
2.年齡在十歲以下-10元
namespace StrategyTest {public class ChildrenDaZhe:IAbsStrategy{/// <summary>/// 兒童減10元/// </summary>/// <param name="price"></param>/// <returns></returns>public double DaZhe(double price){Console.Write("兒童價(jià):");return price - 10;}} }
3.學(xué)生打八折
namespace StrategyTest {public class StudentDaZhe:IAbsStrategy{/// <summary>/// 學(xué)生8折/// </summary>/// <param name="price"></param>/// <returns></returns>public double DaZhe(double price){Console.Write("學(xué)生價(jià):");return price * 0.8;}} }
4.VIP打5折
namespace StrategyTest {public class VIPDaZhe:IAbsStrategy{/// <summary>/// VIP打5折 積分增加/// </summary>/// <param name="price"></param>/// <returns></returns>public double DaZhe(double price){Console.Write("VIP價(jià)格:");Console.Write("積分增加 +1 \r\n");//積分這里意思一下。。。return price * 0.5;}} }
?
namespace StrategyTest {/// <summary>/// 電影票 環(huán)境類(lèi)/// 提供兩個(gè)注入方法(注入為抽象類(lèi)) 1.構(gòu)造函數(shù)注入 2.方法注入/// </summary>public class MovieTicket{private IAbsStrategy abs;//抽象打折private double price;//價(jià)格public MovieTicket(){}//構(gòu)造注入public MovieTicket(IAbsStrategy abs){this.abs = abs;}public double Price{get { return price; }set { price = value; }}//方法注入public void SetStrategy(IAbsStrategy myAbs){this.abs = myAbs;}/// <summary>/// 獲取打折后的價(jià)格/// </summary>/// <returns></returns>public double GetPrice(){return abs.DaZhe(price);}} }
?
<?xml version="1.0" encoding="utf-8" ?> <configuration><appSettings><add key="Srtiategy" value="StrategyTest.ChildrenDaZhe"></add></appSettings> </configuration>
?
?
namespace StrategyTest {class Program{static void Main(string[] args){string txt = ConfigurationManager.AppSettings["Srtiategy"].ToString();//讀取配置文件IAbsStrategy abs = Assembly.Load("StrategyTest").CreateInstance(txt) as IAbsStrategy;//創(chuàng)建實(shí)例 MovieTicket move = new MovieTicket(abs);//電影票類(lèi) 環(huán)境類(lèi)(構(gòu)造注入)move.Price = 30;//設(shè)置原始價(jià)格//move.SetStrategy(abs);//方法注入double myPrice= move.GetPrice();//獲取價(jià)格Console.Write("原始價(jià)為:"+move.Price);Console.Write("打完折為:" + myPrice);Console.Read();}} }
結(jié)果: 兒童價(jià): 原始價(jià)為:30打完折為:20
如果需要修改為VIP打折? 則在配置文件中修改
這是我的第一篇文章,說(shuō)實(shí)話(huà)沒(méi)什么技術(shù)含量,寫(xiě)的也很爛。。。。,設(shè)計(jì)模式挺重要的,所以現(xiàn)在復(fù)習(xí)下,馬上畢業(yè)了,希望能有個(gè)好的開(kāi)始,
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/StoneSH/archive/2013/04/04/2999422.html
總結(jié)
以上是生活随笔為你收集整理的策略模式 极其简单的列子的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 求一个姓林好听的女孩名字!
- 下一篇: ubuntu chm文档阅读器