首页 > 策略模式 极其简单的列子

策略模式 极其简单的列子

第一篇博客

本文来自 自己老师 的博客 http://blog.csdn.net/lovelion/article/details/7818983

题目:某软件公司为某电影院开发了一套影院售票系统,在该系统中需要为不同类型的用户提供不同的电影票打折方式,具体打折方案如下:

      (1) 学生凭学生证可享受票价8折优惠;

      (2) 年龄在10周岁及以下的儿童可享受每张票减免10元的优惠(原始票价需大于等于20元);

      (3) 影院VIP用户除享受票价半价优惠外还可进行积分,积分累计到一定额度可换取电影院赠送的奖品。

      该系统在将来可能还要根据需要引入新的打折方式

1.要满足开闭原则 二话不说先定义抽象类或接口

namespace StrategyTest
{/// /// 抽象策略类  (折扣类)/// public  interface IAbsStrategy{/// /// 打折 抽象方法(用拼音。。)/// /// 价格/// doubledouble DaZhe(double price);}
}

2.年龄在十岁以下-10元

namespace StrategyTest
{public class ChildrenDaZhe:IAbsStrategy{/// /// 儿童减10元/// /// /// public double DaZhe(double price){Console.Write("儿童价:");return price - 10;}}
}

3.学生打八折

namespace StrategyTest
{public  class StudentDaZhe:IAbsStrategy{/// /// 学生8折/// /// /// public double DaZhe(double price){Console.Write("学生价:");return price * 0.8;}}
}



4.VIP打5折

namespace StrategyTest
{public class VIPDaZhe:IAbsStrategy{/// /// VIP打5折 积分增加/// /// /// public double DaZhe(double price){Console.Write("VIP价格:");Console.Write("积分增加 +1  
");//积分这里意思一下。。。return price * 0.5;}}
}

 

namespace StrategyTest
{/// /// 电影票 环境类/// 提供两个注入方法(注入为抽象类) 1.构造函数注入 2.方法注入/// public class MovieTicket{private IAbsStrategy abs;//抽象打折private double price;//价格public MovieTicket(){}//构造注入public MovieTicket(IAbsStrategy abs){this.abs = abs;}public double Price{get { return price; }set { price = value; }}//方法注入public void SetStrategy(IAbsStrategy myAbs){this.abs = myAbs;}/// /// 获取打折后的价格/// /// public double GetPrice(){return abs.DaZhe(price);}}
}

 

"1.0" encoding="utf-8" ?>
"Srtiategy" value="StrategyTest.ChildrenDaZhe">

 

 

namespace StrategyTest
{class Program{static void Main(string[] args){string txt = ConfigurationManager.AppSettings["Srtiategy"].ToString();//读取配置文件IAbsStrategy abs = Assembly.Load("StrategyTest").CreateInstance(txt) as IAbsStrategy;//创建实例
MovieTicket move = new MovieTicket(abs);//电影票类 环境类(构造注入)move.Price = 30;//设置原始价格//move.SetStrategy(abs);//方法注入double myPrice= move.GetPrice();//获取价格Console.Write("原始价为:"+move.Price);Console.Write("打完折为:" + myPrice);Console.Read();}}
}

结果: 儿童价: 原始价为:30打完折为:20

如果需要修改为VIP打折  则在配置文件中修改

这是我的第一篇文章,说实话没什么技术含量,写的也很烂。。。。,设计模式挺重要的,所以现在复习下,马上毕业了,希望能有个好的开始,

 

 

 

转载于:https://www.cnblogs.com/StoneSH/archive/2013/04/04/2999422.html

更多相关:

  • #猜价钱 trueprice = 202 price = input("Please guess the price:") while (int(price) != trueprice):if(int(price) > trueprice):price = input("Your price is higher,Please try...

  • ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)➤GitHub地址:https://github.com/strengthen/LeetCode➤原文地...

  • 关于Graphics也有了基本了解下面想说的的是学这个东东干什么呢,到底如何应用目前常见应用1、验证码(参照网上的)2、打印排版(会提到关于条形码大小设置)3、自定义控件 一、验证码 1 class ValidateCode 2 { 3 #region 定义和初始化配置字段 4...

  •   最近公司在做一个医疗项目,使用WinForm界面作为客户端交互界面。在整个客户端解决方案中。使用了MVP模式实现。由于之前没有接触过该设计模式,所以在项目完成到某个阶段时,将使用MVP的体会写在博客里面。   所谓的MVP指的是Model,View,Presenter。对于一个UI模块来说,它的所有功能被分割为三个部分,分别通过M...

  • 关于具体需求,请看前面的博文:DDD领域驱动设计实践篇之如何提取模型,下面是具体的实体、聚合、值对象的代码,不想多说什么是实体、聚合等概念,相信理论的东西大家已经知晓了。本人对DDD表示好奇,没有在真正项目实践过,甚至也没有看过真正的DDD实践的项目源码,处于极度纠结状态,甚至无法自拔,所以告诫DDD爱好者们,如果要在项目里面实践DD...

  • TPL Dataflow是微软面向高并发应用而推出的新程序库。借助于异步消息传递与管道,它可以提供比线程池更好的控制。本身TPL库在DataflowBlock类中提供了不少扩展函数,用起来还是非常方便的,但感觉还是不够全(当然,MS没必要设计大而全的接口),前段时间写个小程序的时候用到了它,当时顺便写了几个扩展函数,这里记录一下,如果...

  • 前言       写系列文章的时候[前言]部分变得无言了,可能来得顺利了点吧: ) 本章中提供的封装均是我用笨办法从<>和<>中拷贝出来并参照VC++代码进行整理的,主要是针对HikServ...

  • Qt默认的QSlider和QSpinbox只能实现整数调整,不能实现浮点的变化,因此设计了如下可实现浮点变化的QFloatSlider和QFloatSpinner: QFloatSlider.h class QFloatSlider : public QSlider {Q_OBJECTpublic:QFloatSlider(QWi...

  • 一、概述 之前的文章介绍过卡尔曼滤波算法进行定位,我们知道kalman算法适合用于线性的高斯分布的状态环境中,我们也介绍了EKF,来解决在非高斯和非线性环境下的机器人定位算法。但是他们在现实应用中存在计算量,内存消耗上不是很高效。这就引出了MCL算法。 粒子滤波很粗浅的说就是一开始在地图空间很均匀的撒一把粒子,然后通过获取机器人的...

  • 1.精度问题 由于是double类型,r=mid 而不是r=mid-12.如果首位两端(f(0)和f(100))同号,证明解不在[1,100]区间内 这是我之所以TE的原因,没有预先判断3.若在这个区间内,则一定可要求出解 所以binarysearch 返回m#include #include ...

  • 代理(Proxy)模式给某一个对象提供一个代理,并由代理对象控制对原对象的引用。 代理模式的英文叫做Proxy或Surrogate,中文都可译成"代理"。所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。 类图:...

  • 题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=41&page=show_problem&problem=1121 题意:给出两点坐标,用一条最短的线(曲线或者直线)连接起来,坐标系中原点处有一个半径为R的圆,连线不能...