.Net Core 装饰模式

装饰模式的定义

动态的对某个对象进行扩展(附加额外的职责), 装饰器是除了继承之外的另外一种为对象扩展功能的方法

.Net Core实现装饰模式的代码
Beverage.cs
1
2
3
4
5
6
7
8
namespace DecoratorPattern.Core
{
public abstract class Beverage
{
public virtual string Description{ get; private set; } = "Unknown Beverage";
public abstract double Cost();
}
}
CondimentDecorator.cs
1
2
3
4
5
6
7
namespace DecoratorPattern.Core
{
public abstract class CondimentDecorator : Beverage
{
public abstract override string Description{ get; }
}
}
Espresso.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using DecoratorPattern.Core;
namespace DecoratorPattern.Coffee
{
public class Espresso : Beverage
{
public Espresso()
{
Description = "Espresso";
}
public override double Cost()
{
return 1.99;
}
}
}
HouseBlend.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using DecoratorPattern.Core;
namespace DecoratorPattern.Coffee
{
public class HouseBlend : Beverage
{
public HouseBlend()
{
Description = "HouseBlend";
}
public override double Cost()
{
return 0.89;
}
}
}
Mocha.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using DecoratorPattern.Core;
namespace DecoratorPattern.Condiments
{
public class Mocha : CodimentDecorator
{
private readonly Beverage beverage;

public Mocha(Beverage beverage) => this.beverage = beverage;

public override string Description => $"{beverage.Description},Mocha";

public override doublr Cost()
{
return 0.20 + beverage.Cost();
}
}
}
Program.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using System;
using DecoratorPattern.Core;
using DecoratorPattern.Coffee;

namespace DecoratorPattern
{
class Program
{
static void Main(string[] args)
{
var beverage = new Espresso();
Console.WriteLine($"{beverage.Description}${beverage.Cost()}");

Beverage beverage2 = new HouseBlend();
beverage2 = new Mocha(beverage2);
Console.WriteLine($"{beverage2.Description}${beverage2.Cost()}");
}
}
}

.Net Core 装饰模式
http://blog.chcaty.cn/2018/04/05/net-core-zhuang-shi-mo-shi/
作者
caty
发布于
2018年4月5日
许可协议