zoukankan      html  css  js  c++  java
  • 策略模式,装饰模式 实例

    最近贴吧正好有人出了个问题,就套用了设计模式,写了一下。


    问题:

    某景区的门票针对不同人群有不同的收费方式:
    1、老年人年满60岁可享受原票价2折优惠
    2、学生凭学生证可以半价购票,但需要提供学生证
    3、身高1米以下儿童免票,1.5米以下人群半价

    4、曾进入过景区3次以上的客户可以享受门票8折优惠


    一,策略模式

    public abstract class Tourist
    {
    public string Namge { get; set; }
    public int Age { get; set; }
    public double Height { get; set; }
    
    
    public int Count { get; set; } 
    
    
    //票价
    private decimal ticketPrice = 150;
    public decimal TicketPrice
    {
    get { return ticketPrice; }
    }
    
    
    //优惠
    public abstract decimal Discount();
    
    
    }
    
    
    //老年人
    public class OldPeople : Tourist
    {
    
    
    public override decimal Discount()
    {
    if(Age>=60)
    return TicketPrice * 0.2m;
    return TicketPrice;
    }
    }
    
    
    //学生
    public class Student : Tourist
    {
    public bool HasCard { get; set; }
    public override decimal Discount()
    {
    if (HasCard)
    return TicketPrice * 0.5m;
    return TicketPrice;
    }
    }
    
    
    //小孩
    public class Childen : Tourist
    {
    public override decimal Discount()
    {
    if (Height < 1)
    return 0;
    else if (Height < 1.5)
    return TicketPrice * 0.5m;
    else
    return TicketPrice;
    }
    }
    
    
    //客户
    public class Customer : Tourist
    {
    public override decimal Discount()
    {
    if (Count >=3)
    return TicketPrice * 0.8m;
    else
    return TicketPrice;
    }
    }

    只要传递相应的Tourist派生类,就能达到策略选择的目的。


    但是这时,又来了一个问题:假设有一个  老年大学生

    666,这可能留级上瘾了吧难过

    这个时候,我们有两种情况:

    1 最优策略(老年人或者大学生中,选择一个最优惠的策略)

    2 折上折(在老年人的折扣上,在打一个大学生折扣。)


    最优策略,就不赘述了,其实还是上面的方法一。

    无非就是将老年人对象和大学生对象,放到一个数组里,然后找一个最便宜的价钱就好了。

    那么我们看一下 折上折!


    二,装饰模式

    通过Decorator类,来保持上一个派生类的引用。

    在执行打折方法前,先执行了上个引用中的打折方法。

    static void Main(string[] args)
    {
    //老人打2折
    OldPeople o = new OldPeople();
    o.Age = 65;
    //学生打5折
    Student s = new Student();
    s.HasCard = true;
    
    
    s.SetComponent(o);
    var disCount = s.Discount();
    Console.WriteLine(disCount);//票价15
    
    
    Console.ReadKey();
    }
    
    
    public interface Component
    {
    decimal Discount();
    
    
    }
    
    
    public class Decorator : Tourist
    {
    protected Component component;
    public void SetComponent(Component component)
    {
    this.component = component;
    }
    public override decimal Discount()
    {
    if (component != null)
    {
    return component.Discount();
    }
    return TicketPrice;
    }
    }
    
    
    public abstract class Tourist : Component
    {
    public string Namge { get; set; }
    public int Age { get; set; }
    public double Height { get; set; }
    
    
    
    
    public int Count { get; set; }
    
    
    
    
    //票价
    private decimal ticketPrice = 150;
    public decimal TicketPrice
    {
    get { return ticketPrice; }
    set { ticketPrice = value; }
    }
    
    
    
    
    
    
    public virtual decimal Discount()
    {
    return TicketPrice;
    }
    }
    
    
    
    
    //老年人
    public class OldPeople : Decorator
    {
    
    
    
    
    public override decimal Discount()
    {
    if (Age >= 60)
    {
    TicketPrice = base.Discount();
    return TicketPrice * 0.2m;
    }
    return TicketPrice;
    }
    }
    
    
    
    
    //学生
    public class Student : Decorator
    {
    public bool HasCard { get; set; }
    public override decimal Discount()
    {
    if (HasCard)
    {
    TicketPrice = base.Discount();
    return TicketPrice * 0.5m;
    }
    return TicketPrice;
    }
    }
    
    
    
    
    //小孩
    public class Childen : Decorator
    {
    public override decimal Discount()
    {
    if (Height < 1)
    return 0;
    else if (Height < 1.5)
    {
    TicketPrice = base.Discount();
    return TicketPrice * 0.5m;
    }
    else
    return TicketPrice;
    }
    }
    
    
    
    
    //客户
    public class Customer : Decorator
    {
    public override decimal Discount()
    {
    if (Count >= 3)
    {
    TicketPrice = base.Discount();
    return TicketPrice * 0.8m;
    } 
    else
    return TicketPrice;
    }
    }

  • 相关阅读:
    C# Dictionary 字典
    int.Parse()与int.TryParse()
    jquery 随机数
    DateGradeView分页绑定
    使用tcpdump抓Android网络包
    Android快速开发框架——AndroidAnnotations(Code Diet)
    浅谈 android-query
    Android网络框架技术
    PHP: 深入了解一致性哈希
    png图片压缩优化
  • 原文地址:https://www.cnblogs.com/hanjun0612/p/9779711.html
Copyright © 2011-2022 走看看