【设计模式】装饰者模式

代码如下:

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 }

时间: 2024-10-08 06:47:32

【设计模式】装饰者模式的相关文章

【笔记】设计模式——装饰者模式

实现一个类似QQavator功能的代码 1.原始实现 1 //存在的问题: 2 //1.wear*方法出现重复代码,可以重构:实质上为代码结构一致,输出内容相同,可以通过在定义一个基类,在基类中定义抽象的Wear*,在子类中重写: 3 //2.倘若需求中新增某种服饰,需要修改Person类代码,不符合开放--封闭原则: 4 //3.客户端中代码暴露了具体装饰细节,理想情况下只需要提供装饰顺序,装饰细节封装起来: 5 class Person 6 { 7 private string name;

设计模式 - 装饰者模式(Decorator Pattern) Java的IO类 使用方法

装饰者模式(Decorator Pattern) Java的IO类 使用方法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26716823 装饰者模式(decorator pattern)参见: http://blog.csdn.net/caroline_wendy/article/details/26707033 Java的IO类使用装饰者模式进行扩展, 其中FilterInputStream类, 就是装饰者(decora

java设计模式------装饰着模式

java设计模式-------装饰者模式 装饰者模式 Decorator模式(别名Wrapper):动态将职责附加到对象上,若要扩展功能,装饰者提供了比继承更具弹性的代替方案.主要有组件(components)和装饰器(Decorator)组成.要求components和Decorator实现相同的接口或者抽象类(具体类的局限性太大). 设计原则.模式特点.适用性 - 1. 多用组合,少用继承. 利用继承设计子类的行为,是在编译时静态决定的,而且所有的子类都会继承到相同的行为.然而,如果能够利用

设计模式---装饰者模式(学习笔记)

首先看装饰者模式的定义:动态的将责任附加到对象上.若要扩展功 能,装饰者提供了比继承更有弹性的替代方案! 先看看<大话设计模式>给出的类图: 实际上,装饰者模式就是:把装饰者对象当成"包装者",换言之,把要装饰的对象作为参数传递到装饰对象里去,然后进行操作.(如果理解不对,希望给指正),下面看代码来理解这个类图: 这是装饰者和需要装饰的具体对象共同的接口: public abstract class Component { abstract void Operation()

设计模式 - 装饰者模式(Decorator Pattern) 详解

装饰者模式(Decorator Pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26707033 装饰者模式(Decorator Pattern):动态地将责任附加到对象上. 若要扩展功能, 装饰者提供了比继承更有弹性的替代方案. 使用方法: 1. 首先创建组件(Component)父类, 所有类,具体组件(Concrete Component)和装饰者(Decorator)都属于这一类型, 可以进行扩展

Java设计模式——装饰者模式

JAVA 设计模式 装饰者模式 用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式. 结构 图-装饰者模式结构图 Component : 定义一个对象接口,可以给这些对象动态地添加职责. interface Component {     public void operation(); } ConcreteComponent : 实现 Component 定义的接口. clas

5分钟读书笔记之 - 设计模式 - 装饰者模式

本章讨论的是一种为对象增添特性的技术,它并不使用创建新子类这种手段. 装饰者模式可以透明地把对象包装在具有同样接口的另一对象之中,这样一来,你可以给一些方法添加一些行为,然后将方法调用传递给原始对象.相对于创建子类来说,使用装饰者模式对象是一种更灵活的选择. 装饰者可用于为对象增加功能.它可以用来替代大量子类. 考虑前面的自行车类,你现在可能提供一些配件供用户选择,装饰者模式要求我们只需要创建选件类,这些类与四种自行车类都要实现Bicycle接口,但是他们只被用作这些自行车类的包装类.在这个例子

说说设计模式~装饰器模式(Decorator)

装饰器模式,也叫又叫装饰者模式,顾名思义,将一个对象进行包裹,包装,让它变成一个比较满意的对象,这种模式在我们平时项目开发中,经常会用到,事实上,它是处理问题的一种技巧,也很好的扩展了程序,让程序代码不那么死板! 何时能用到它? 1. 需要扩展一个类的功能,或给一个类添加附加职责. 2. 需要动态的给一个对象添加功能,这些功能可以再动态的撤销. 3. 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实. 4. 当不能采用生成子类的方法进行扩充时. 其中我们认为第四种

PHP设计模式-装饰器模式

1.概念: 装饰器模式又叫做装饰者模式,是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.传统的编程模式都是子类继承父类实现方法的重载,使用装饰器模式,只需添加一个新的装饰器对象,更加灵活,避免类数目和层次过多. 2.角色: Component(被装饰对象基类):定义一个对象接口,以规范准备接受附加责任的对象. ConcreteComponent(具体被装饰对象):具体组件角色,即将要被装饰增加功能的类. Decorator(装饰者基类):装饰器接口. ConcreteDecor

java设计模式-装饰者模式

定义: 在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 概述: 1.装饰者和被装饰对象有相同的超类型. 2.你可以用一个或多个装饰者包装一个对象. 3.既然装饰者和被装饰对象有相同的超类型,所以在任何需要原始对象(被包装的)的场合 ,可以用装饰过的对象代替它. 4.装饰者可以在所委托被装饰者的行为之前与/或之后,加上自己的行为,以达到特定的目的. 5.对象可以在任何时候被装饰,所以可以在运行时动态地.不限量地用你喜欢的装饰者