C# 设计模式:装饰器模式与代理模式的区别

打印 上一主题 下一主题

主题 956|帖子 956|积分 2868

C# 设计模式:装饰器模式与代理模式的区别

在软件设计中,装饰器模式(Decorator Pattern)和代理模式(Proxy Pattern)都是结构型设计模式,它们的目标都是通过对对象举行包装,来增长或改变对象的行为。固然它们有一些相似之处,但现实上,它们的设计初衷和利用场景有所差别。本文将通过对比这两种模式,资助大家更好地明白它们的区别和应用场景。
1. 装饰器模式与代理模式的相似性

装饰器模式和代理模式在表面上有肯定的相似性,主要体如今以下几个方面:


  • 都涉及到对对象的包装:无论是装饰器模式照旧代理模式,都通过一个包装类来代理或装饰原有对象。
  • 都可以加强对象的功能:通过包装,装饰器模式和代理模式都可以在不改变原有对象代码的情况下,添加新的功能或行为。
然而,它们的核心差别在于目标和实现方式。
2. 装饰器模式 (Decorator Pattern)

目标:装饰器模式的目标是动态地为一个对象添加额外的功能或行为。装饰器通常是为了加强对象的功能,不会改变对象本身的行为。
特点


  • 装饰器模式的关键是递归地装饰对象。它通常是一个实现了雷同接口或继承了雷同类的对象,可以在运行时增长或修改被装饰对象的行为。
  • 装饰器模式可以在不修改原始对象的情况下,给对象动态地添加功能。
应用场景


  • 必要为一个对象添加额外的职责和行为,而又不想改变对象的结构。
  • 得当用在“责任链”或“动态行为扩展”场景中。
示例:C# 装饰器模式

  1. using System;
  2. // 定义接口
  3. public interface ICar
  4. {
  5.     void Assemble();
  6. }
  7. // 具体组件:普通汽车
  8. public class BasicCar : ICar
  9. {
  10.     public void Assemble()
  11.     {
  12.         Console.WriteLine("Assembling a basic car.");
  13.     }
  14. }
  15. // 装饰器:高级汽车
  16. public class SportsCar : ICar
  17. {
  18.     private ICar car;
  19.     public SportsCar(ICar car)
  20.     {
  21.         this.car = car;
  22.     }
  23.     public void Assemble()
  24.     {
  25.         car.Assemble();
  26.         Console.WriteLine("Adding features of sports car.");
  27.     }
  28. }
  29. // 装饰器:豪华汽车
  30. public class LuxuryCar : ICar
  31. {
  32.     private ICar car;
  33.     public LuxuryCar(ICar car)
  34.     {
  35.         this.car = car;
  36.     }
  37.     public void Assemble()
  38.     {
  39.         car.Assemble();
  40.         Console.WriteLine("Adding features of luxury car.");
  41.     }
  42. }
  43. // 客户端代码
  44. class Program
  45. {
  46.     static void Main()
  47.     {
  48.         ICar sportsCar = new SportsCar(new BasicCar());
  49.         sportsCar.Assemble();  // 组装运动型车
  50.         Console.WriteLine();
  51.         ICar sportsLuxuryCar = new LuxuryCar(new SportsCar(new BasicCar()));
  52.         sportsLuxuryCar.Assemble();  // 组装豪华运动型车
  53.     }
  54. }
复制代码
运行结果
  1. Assembling a basic car.
  2. Adding features of sports car.
  3. Assembling a basic car.
  4. Adding features of sports car.
  5. Adding features of luxury car.
复制代码
3. 代理模式 (Proxy Pattern)

目标:代理模式的目标是通过控制访问来间接地管理对某个对象的操作。代理通常是为了控制对真实对象的访问,可以是为了延迟实例化、权限控制或做一些前置处理等。
特点


  • 代理模式的关键是控制对目标对象的访问。代理可以控制目标对象的创建、访问、权限检查等行为。
  • 代理模式的代理类通常实现与被代理类雷同的接口,可以通过代理类来调用目标对象的方法。
  • 代理有时用于控制资源的访问,比方通过假造代理延迟加载,或者通过安全代理控制对敏感资源的访问。
应用场景


  • 必要在客户端和真实对象之间插入一个代理,以控制对真实对象的访问。
  • 用于懒加载(假造代理)、权限控制(掩护代理)或日志监控等场景。
示例:C# 代理模式

  1. using System;
  2. // 定义接口
  3. public interface IRealSubject
  4. {
  5.     void Request();
  6. }
  7. // 真实对象:实际操作的对象
  8. public class RealSubject : IRealSubject
  9. {
  10.     public void Request()
  11.     {
  12.         Console.WriteLine("Request is being processed by the RealSubject.");
  13.     }
  14. }
  15. // 代理类:控制访问的代理
  16. public class Proxy : IRealSubject
  17. {
  18.     private RealSubject realSubject;
  19.     public void Request()
  20.     {
  21.         if (realSubject == null)
  22.         {
  23.             realSubject = new RealSubject();  // 延迟实例化
  24.         }
  25.         Console.WriteLine("Proxy: Checking access before forwarding request.");
  26.         realSubject.Request();  // 转发请求
  27.     }
  28. }
  29. // 客户端代码
  30. class Program
  31. {
  32.     static void Main()
  33.     {
  34.         IRealSubject proxy = new Proxy();
  35.         proxy.Request();  // 通过代理访问
  36.     }
  37. }
复制代码
运行结果
  1. Proxy: Checking access before forwarding request.
  2. Request is being processed by the RealSubject.
复制代码
4. 装饰器模式与代理模式的区别

方面装饰器模式 (Decorator)代理模式 (Proxy)目标动态地添加功能或责任,使得对象的行为得到加强。控制对对象的访问,可能会在请求进步行权限检查或懒加载等操作。行为装饰器改变或扩展对象的行为,不影响原有对象的接口。代理不改变对象的行为,主要用于控制访问权限。实现方式装饰器是一个封装对象并实现雷同接口的类。代理实现与被代理对象雷同的接口,控制对对象的访问。应用场景用于动态地为对象添加功能,通常不涉及对对象访问的控制。用于控制对对象的访问,比方延迟加载、权限控制等。功能重点扩展功能和责任控制访问(懒加载、权限控制等) 5. 总结

尽管装饰器模式和代理模式看起来很相似,都是通过包装对象来加强或控制对象的行为,但它们有差别的设计目标和利用场景。装饰器模式主要用于加强对象的功能,而代理模式则主要用于控制访问,尤其是延迟加载、权限控制等。明白这两者的区别,可以资助我们在开发中做出更加合适的设计决策。
在现实开发中,当你必要扩展对象的功能时,可以考虑利用装饰器模式;而当你必要控制对象的访问或者做一些额外的管理时,可以考虑利用代理模式。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

勿忘初心做自己

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表