策略模式,装饰模式 实例

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


问题:

某景区的门票针对不同人群有不同的收费方式:
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;
}
}

posted @ 2018-06-22 15:22  正怒月神  阅读(508)  评论(0编辑  收藏  举报