设计模式(8)——装饰者模式

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

同样使用了上期桥接模式的Shape的例子。

class Program
{
    static void Main(string[] args)
    {
        Shape square = new Square();
        square.Show();
        Console.WriteLine("--------------");
        Shape redCircle = new RedShapeDecorator(new Circle());
        redCircle.Show();
        Console.Read();
    }
}

abstract class Shape
{
    public abstract void Show();
}

class Square : Shape
{
    public Square()
    {
    }
    public override void Show()
    {
        Console.WriteLine("我是正方形");
    }
}
class Circle : Shape
{
    public Circle()
    {
    }
    public override void Show()
    {
        Console.WriteLine("我是圆形");
    }
}
class Ring : Shape
{
    public Ring()
    {
    }

    public override void Show()
    {
        Console.WriteLine("我是圆环");
    }
}

abstract class ShapeDecorator : Shape
{
    protected Shape decoratedShape;

    public ShapeDecorator(Shape decoratedShape)
    {
        this.decoratedShape = decoratedShape;
    }

    public override void Show()
    {
        decoratedShape.Show();
    }
}
class RedShapeDecorator : ShapeDecorator
{

    public RedShapeDecorator(Shape decoratedShape):base(decoratedShape)
    {
    }

    public override void Show()
    {
        base.Show();
        Console.WriteLine("红色装饰");
    }
}

输出结果

我是正方形
--------------
我是圆形
红色装饰

装饰者模式采用对象组合而非继承的方式实现了再运行时动态地扩展对象功能的能力,而且可以根据需要扩展多个功能,避免了单独使用继承带来的 ”灵活性差“和”多子类衍生问题“。同时它很好地符合面向对象设计原则中 ”优先使用对象组合而非继承“和”开放-封闭“原则。

类图

在这里插入图片描述

优点与缺点

装饰者模式的优点:

  • 装饰这模式和继承的目的都是扩展对象的功能,但装饰者模式比继承更灵活
  • 通过使用不同的具体装饰类以及这些类的排列组合,设计师可以创造出很多不同行为的组合
  • 装饰者模式有很好地可扩展性

装饰者模式的缺点:

  • 装饰者模式会导致设计中出现许多小对象,如果过度使用,会让程序变的更复杂。并且更多的对象会是的差错变得困难,特别是这些对象看上去都很像。

本文主要借鉴了《Gof设计模式》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值