【设计模式】装饰者模式
2015-07-16 17:32 佳佳的博客 阅读(252) 评论(0) 编辑 收藏 举报※文件引自OneDrive,有些人可能看不到
代码如下:
IPrice
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace Model 8 { 9 public interface IPrice 10 { 11 decimal Cost { get; set; } 12 } 13 }
BasePrice
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace Model 8 { 9 public class BasePrice : IPrice 10 { 11 private decimal _cost; 12 13 public decimal Cost 14 { 15 get 16 { 17 return _cost; 18 } 19 set 20 { 21 _cost = value; 22 } 23 } 24 } 25 }
TradeDiscountPriceDecorator
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace Model 8 { 9 public class TradeDiscountPriceDecorator : IPrice 10 { 11 private IPrice _basePrice; 12 13 public TradeDiscountPriceDecorator(IPrice price) 14 { 15 _basePrice = price; 16 } 17 18 public decimal Cost 19 { 20 get 21 { 22 return _basePrice.Cost * 0.95m; 23 } 24 set 25 { 26 _basePrice.Cost = value; 27 } 28 } 29 } 30 }
CurrencyPriceDecorator
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace Model 8 { 9 public class CurrencyPriceDecorator : IPrice 10 { 11 private IPrice _basePrice; 12 13 private decimal _exchangeRate; 14 15 public CurrencyPriceDecorator(IPrice price, decimal exchangeRate) 16 { 17 _basePrice = price; 18 _exchangeRate = exchangeRate; 19 } 20 21 public decimal Cost 22 { 23 get 24 { 25 return _basePrice.Cost * _exchangeRate; 26 } 27 set 28 { 29 _basePrice.Cost = value; 30 } 31 } 32 } 33 }
Product
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace Model 8 { 9 public class Product 10 { 11 public IPrice Price { get; set; } 12 } 13 }
ProductService
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace Model 8 { 9 public class ProductService 10 { 11 private IProductRepository _productRepository; 12 13 public ProductService(IProductRepository productRepository) 14 { 15 _productRepository = productRepository; 16 } 17 18 public IEnumerable<Product> GetAllProduct() 19 { 20 IEnumerable<Product> products = _productRepository.FindAll(); 21 22 products.ApplyTradeDiscount(); 23 24 products.ApplyCurrencyMultiplier(0.78m); 25 26 return products; 27 } 28 } 29 }
IProductRepository
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace Model 8 { 9 public interface IProductRepository 10 { 11 IEnumerable<Product> FindAll(); 12 } 13 }
ProductCollectionExtensionMethods
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace Model 8 { 9 public static class ProductCollectionExtensionMethods 10 { 11 public static void ApplyCurrencyMultiplier(this IEnumerable<Product> products, decimal exchangeRate) 12 { 13 foreach (Product p in products) 14 { 15 p.Price = new CurrencyPriceDecorator(p.Price, exchangeRate); 16 } 17 } 18 19 public static void ApplyTradeDiscount(this IEnumerable<Product> products) 20 { 21 foreach (Product p in products) 22 { 23 p.Price = new TradeDiscountPriceDecorator(p.Price); 24 } 25 } 26 } 27 }
Program
1 using DecoratorConsole.Test; 2 using Model; 3 using System; 4 using System.Collections.Generic; 5 6 namespace DecoratorConsole 7 { 8 class Program 9 { 10 static void Main(string[] args) 11 { 12 ProductService service = new ProductService(new TestPorductRepository()); 13 IEnumerable<Product> products = service.GetAllProduct(); 14 15 foreach (Product p in products) 16 { 17 Console.WriteLine(string.Format("Product's Price : {0}", p.Price.Cost)); 18 } 19 20 Console.ReadLine(); 21 } 22 } 23 }
TestPorductRepository
1 using Model; 2 using System; 3 using System.Collections.Generic; 4 using System.Linq; 5 using System.Text; 6 using System.Threading.Tasks; 7 8 namespace DecoratorConsole.Test 9 { 10 public class TestPorductRepository : IProductRepository 11 { 12 public IEnumerable<Product> FindAll() 13 { 14 IEnumerable<Product> products = new Product[] { 15 new Product() { Price = new BasePrice() { Cost = 100m }}, 16 new Product() { Price = new BasePrice() { Cost = 200m }}, 17 new Product() { Price = new BasePrice() { Cost = 50m }}, 18 new Product() { Price = new BasePrice() { Cost = 240.5m }}, 19 new Product() { Price = new BasePrice() { Cost = 500m }}, 20 new Product() { Price = new BasePrice() { Cost = 1000m }}, 21 new Product() { Price = new BasePrice() { Cost = 1500m }}, 22 }; 23 24 return products; 25 } 26 } 27 }
转载请标明原文出处 【liujiajia.me】 !