结合项目实例 回顾传统设计模式(三)装饰者模式

简介:

说到这个模式的项目实例 虫子也满头疼的 所谓装饰者模式说白了动态将职责附加到对象上。如果你在项目某个场景中需要功能扩展根据基类衍生出非常多的子类,那么装饰者模式无疑是很好的。不过其实在实际的项目中,往往大家不直接衍生子类,而是通过组合的方式,根据逻辑讲各种扩展叠加来,对外公布的只是一个标签一个壳而已。

所以这个章节,虫子就虚构一个实例了。还拿电商来说、点券赠品系统。

背景:

1.所有点券、优惠券、赠品券、积分继承同一个基类 基类券

2.不用种类的券可以混合搭配

3.积分根据不同的场景可以配置不同的规则

4.升级礼券在上层礼券基础上添加

一般情况下 大家可以就这样设计了

///   <summary>
    
///  基卡
    
///   </summary>
     public  abstract  class BaseCard
    {      
         public  string decription;
         public  abstract  double cost();
       
    }

     ///   <summary>
    
///  点卡A
    
///   </summary>
     public  class cardA : BaseCard
    {
         public cardA()
        {
            decription =  " cardA ";
        }
         public  override  double cost()
        {
             return  50.00;
        }
    }

     ///   <summary>
    
///  优惠券A
    
///   </summary>
     public  class couponsA : BaseCard
    {
         public couponsA()
        {
            decription =  " couponsA ";
        }
         public  override  double cost()
        {
             return  40.00;
        }
    }

     ///   <summary>
    
///  优惠券B
    
///   </summary>
     public  class couponsB : BaseCard
    {
         public couponsB()
        {
            decription =  " couponsB ";
        }
         public  override  double cost()
        {         
             return  30.00;
        }
    }

     ///   <summary>
    
///  国庆礼券
    
///   </summary>
     public  class GQCard : BaseCard
    {
        cardA a =  new cardA();
        couponsA ca =  new couponsA();
         public GQCard()
        {
            decription =  " GQCard ";
        }
         public  override  double cost()
        {
             return a.cost() + ca.cost();
        }
    }

     ///   <summary>
    
///  国庆升级A等礼券
    
///   </summary>
     public  class GQACard : BaseCard
    {
        cardA a =  new cardA();
        couponsA ca =  new couponsA();
        couponsB cb =  new couponsB();
         public GQACard()
        {
            decription =  " GQACard ";
        }
         public  override  double cost()
        {
             return a.cost() +ca.cost()+ cb.cost();
        }
    }

 

设计模式的原则是类应该对扩展开放对修改关闭,而上述设计在礼券升级种类越来越多的情况下并且现有的礼券已经频繁更新的话 对于庞大的礼券系统肯定是不理想的

那么我们换个思路

 

///   <summary>
    
///  基卡
    
///   </summary>
     public  abstract  class BaseCard
    {      
         public  string decription;
         public  abstract  double cost();
       
    }

     ///   <summary>
    
///  点卡A
    
///   </summary>
     public  class cardA : baseoupons
    {
        BaseCard basec;
         public cardA(BaseCard basec)
        {
             this.basec = basec;
            decription =  " cardA, " + basec.decription;
        }
         public  override  double cost()
        {
             return  50.00 + basec.cost(); 
        }
    }

     ///   <summary>
    
///  优惠券A
    
///   </summary>
     public  class couponsA : baseoupons
    {
        BaseCard basec;
         public couponsA(BaseCard basec)
        {
             this.basec = basec;
            decription =  " couponsA, " + basec.decription;
        }
         public  override  double cost()
        {
             return  40.00 + basec.cost();
        }
    }

     ///   <summary>
    
///  优惠券B
    
///   </summary>
     public  class couponsB : baseoupons
    {
        BaseCard basec;
         public couponsB(BaseCard basec)
        {
             this.basec = basec;
            decription =  " couponsB, " + basec.decription;
        }
         public  override  double cost()
        {
             return  30.00 + basec.cost(); 
        }
    }

     ///   <summary>
    
///  基类礼券
    
///   </summary>
     public  class baseoupons : BaseCard
    {
        BaseCard basec;
         public baseoupons(BaseCard basec)
        {
             this.basec = basec;
            decription = basec.decription;
        }
         public baseoupons()
        {
            
        }
         public  override  double cost()
        {
             if (basec !=  null)
            {
                 return basec.cost();
            }
             else
            {
                 return  0;
            }
        }
      
    }

 

 让我们看看装饰者模式的强大

 

  BaseCard a =  new baseoupons();
            a =  new cardA(a);
            a =  new couponsA(a);
            a =  new couponsB(a);

            Console.WriteLine( " 国庆礼券由 "+a.decription+ " 组成 ");
            Console.WriteLine(a.cost().ToString());

            BaseCard b =  new cardA(a);
           
            Console.WriteLine( " 国庆升级礼券由 " + b.decription +  " 组成 ");
            Console.WriteLine(b.cost().ToString());
            Console.ReadLine();

 

总结:继承属于扩展形式之一,但不见得是达到弹性设计的最佳方式,在我们的设计当中应该允许行为可以被扩展,而无需修改现有的代码。就如上述的例子装饰者模式也可以让我们扩展行为。不过装饰者模式也有缺点,它会导致设计中出现许多小对象,如果过度使用,会让程序变得很复杂。



本文转自 熬夜的虫子  51CTO博客,原文链接:http://blog.51cto.com/dubing/712406

相关文章
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性与扩展性本文旨在探讨PHP中常见的设计模式及其应用,帮助开发者编写出更加灵活、可维护和易于扩展的代码。通过深入浅出的解释和实例演示,我们将了解如何使用设计模式解决实际开发中的问题,并提升代码质量。
在软件开发过程中,设计模式是一套经过验证的解决方案模板,用于处理常见的软件设计问题。PHP作为流行的服务器端脚本语言,也有其特定的设计模式应用。本文将重点介绍几种PHP中常用的设计模式,包括单例模式、工厂模式和策略模式,并通过实际代码示例展示它们的具体用法。同时,我们还将讨论如何在实际项目中合理选择和应用这些设计模式,以提升代码的可维护性和扩展性。
370 4
|
设计模式 缓存 安全
【设计模式】【结构型模式】装饰者模式(Decorator)
一、入门 什么是装饰者模式? 装饰者模式(Decorator Pattern)是 Java 中常用的结构型设计模式,它能在不修改原有对象结构的前提下,动态地为对象添加额外的职责。 为什么要装饰者模式?
390 8
|
设计模式 Java 数据安全/隐私保护
Java 设计模式:装饰者模式(Decorator Pattern)
装饰者模式属于结构型设计模式,允许通过动态包装对象的方式为对象添加新功能,提供比继承更灵活的扩展方式。该模式通过组合替代继承,遵循开闭原则(对扩展开放,对修改关闭)。
|
设计模式 Java Kotlin
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
261 2
|
设计模式 Java Kotlin
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
|
设计模式 Java Kotlin
Kotlin - 改良设计模式 - 装饰者模式
Kotlin - 改良设计模式 - 装饰者模式
192 4
|
设计模式 Java Kotlin
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
Kotlin教程笔记(56) - 改良设计模式 - 装饰者模式
|
设计模式 数据库连接 PHP
PHP中的设计模式:如何提高代码的可维护性与扩展性在软件开发领域,PHP 是一种广泛使用的服务器端脚本语言。随着项目规模的扩大和复杂性的增加,保持代码的可维护性和可扩展性变得越来越重要。本文将探讨 PHP 中的设计模式,并通过实例展示如何应用这些模式来提高代码质量。
设计模式是经过验证的解决软件设计问题的方法。它们不是具体的代码,而是一种编码和设计经验的总结。在PHP开发中,合理地使用设计模式可以显著提高代码的可维护性、复用性和扩展性。本文将介绍几种常见的设计模式,包括单例模式、工厂模式和观察者模式,并通过具体的例子展示如何在PHP项目中应用这些模式。
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP开发领域,设计模式是解决常见问题的高效方案集合。它们不是具体的代码,而是一种编码和设计经验的总结。单例模式作为设计模式中的一种,确保了一个类仅有一个实例,并提供一个全局访问点。本文将深入探讨单例模式的基本概念、实现方式及其在PHP中的应用。
单例模式在PHP中的应用广泛,尤其在处理数据库连接、日志记录等场景时,能显著提高资源利用率和执行效率。本文从单例模式的定义出发,详细解释了其在PHP中的不同实现方法,并探讨了使用单例模式的优势与注意事项。通过对示例代码的分析,读者将能够理解如何在PHP项目中有效应用单例模式。

热门文章

最新文章