结构型模式

编程入门 行业动态 更新时间:2024-10-26 15:21:26

<a href=https://www.elefans.com/category/jswz/34/1771419.html style=结构型模式"/>

结构型模式

1.你这老母亲的,我哪来的广告?

学习而来,代码是自己敲的。也有些自己的理解在里边,有问题希望大家指出。

装饰器模式的定义与特点

        装饰器(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。  

装饰器模式优点有:

  • 装饰器是继承的有力补充,比继承灵活,在不改变原有对象的情况下,动态的给一个对象扩展功能,即插即用
  • 通过使用不用装饰类及这些装饰类的排列组合,可以实现不同效果
  • 装饰器模式完全遵守开闭原则

装饰器模式的缺点是:

  • 装饰器模式会增加许多子类,过度使用会增加程序得复杂性。  

装饰器模式的结构与实现

        通常情况下,扩展一个类的功能会使用继承方式来实现。但继承具有静态特征,耦合度高,并且随着扩展功能的增多,子类会很膨胀。如果使用组合关系来创建一个包装对象(即装饰对象)来包裹真实对象,并在保持真实对象的类结构不变的前提下,为其提供额外的功能,这就是装饰器模式的目标。下面来分析其基本结构和实现方法。

1. 模式的结构

装饰器模式主要包含以下角色。

  1. 抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。
  2. 具体构件(ConcreteComponent)角色:实现抽象构件,通过装饰角色为其添加一些职责。
  3. 抽象装饰(Decorator)角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
  4. 具体装饰(ConcreteDecorator)角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。

装饰器模式的结构图如图 1 所示。

图1

using DesignPattern.DecoratorPattern;
using System;namespace DesignPattern
{internal class Program{static void Main(string[] args){DecoratorHelper();}#region Pattern - Decoratorstatic void DecoratorHelper(){DrinkDecorator _syrup = new Syrup();DrinkDecorator _coffee = new Coffee();DrinkDecorator _sodaWater = new SodaWater();_syrup = new Ice(_syrup);_coffee = new Sugar(_coffee);_sodaWater = new Mint(_sodaWater);_sodaWater = new Ice(_sodaWater);Console.WriteLine($"{_syrup.Des} {_syrup.Cost}");Console.WriteLine($"{_coffee.Des} {_coffee.Cost}");Console.WriteLine($"{_sodaWater.Des} {_sodaWater.Cost}");Console.ReadLine();}#endregion}
}//======================================================================================namespace DesignPattern.DecoratorPattern
{/// <summary>/// 抽象饮品装饰者类/// </summary>public abstract class DrinkDecorator{/// <summary>/// 名字/// </summary>protected string Name { get; set; }/// <summary>/// 售价/// </summary>protected int Price { get; set; }/// <summary>/// 介绍:名字/// </summary>public abstract string Des { get; }/// <summary>/// 售价/// </summary>public abstract int Cost { get; }}/// <summary>/// 汽水/// </summary>public class SodaWater : DrinkDecorator{public SodaWater(){Name = "汽水";Price = 8;}public override string Des => this.Name;public override int Cost => this.Price;}/// <summary>/// 咖啡/// </summary>public class Coffee : DrinkDecorator{public Coffee(){Name = "咖啡";Price = 15;}public override string Des => this.Name;public override int Cost => this.Price;}/// <summary>/// 果汁/// </summary>public class Syrup: DrinkDecorator{public Syrup(){Name = "果汁";Price = 12;}public override string Des => this.Name;public override int Cost => this.Price;}/// <summary>/// 配料/// </summary>public abstract class Batching : DrinkDecorator{protected readonly DrinkDecorator m_drink;public Batching(DrinkDecorator drink){m_drink = drink;}public override string Des => $"{m_drink.Des} + {this.Name}";public override int Cost => m_drink.Cost + Price;}public class Sugar : Batching{public Sugar(DrinkDecorator drink) : base(drink){Name = "糖";Price = 2;}}public class Ice : Batching{public Ice(DrinkDecorator drink) : base(drink){Name = "冰块";Price = 1;}}public class Mint : Batching{public Mint(DrinkDecorator drink) : base(drink){Name = "薄荷";Price = 3;}}
}

希望大家:点赞,留言,关注咯~    
😘😘😘😘

唠家常

        今日分享结束啦,小伙伴们你们get到了么,你们有没有更好的办法呢,可以评论区留言分享,也可以加QQ:841298494,大家一起进步。

  • 客官,看完get之后记得点赞哟!
  • 小伙伴你还想要别的知识?好的呀,分享给你们😄

今日推荐

  • 博客杂货铺
  • GoF23 种设计模式的分类和功能

更多推荐

结构型模式

本文发布于:2024-02-05 02:35:20,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1673454.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:结构   模式

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!