装饰模式

简介:

【装饰模式】

  动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。

 

Component是定义一个对象接口,可以给这些对象动态的添加职责。

ConcreteComponent是定义一个具体的对象,也可以给这个对象添加一些职责。

Decorator装饰抽象类,继承了Component类,从外类来扩展Component类的功能,但对于Component来说,是无需知道Decorator类的存在的。至于ConcreteDecorator

就是具体的装饰对象,起到给Component添加职责的功能。

 

【优点】:把类中的装饰功能从类中搬移到类外,这样可以简化原有的类;能有效的把核心职责和装饰功能区分开,而且可以除去相关类中重复的逻辑。

 

【示例代码】

using System;

//Component是定义一个对象接口,可以给这些对象动态的添加职责。

abstract class Componet

{

    public abstract void Operation();

}

// 具体要操作的对象,实现上面的Componet接口,将要添加的职责移到类外。

class ConcreteComponent : Componet

{

    public override void Operation()

    {

        Console.WriteLine("具体对象的操作");

    }

}

// 装饰类基类,也实现Componet接口。并保存一个Componet类的引用。

// 相当于是两次继承。

abstract class Decorator : Componet

{

    protected Componet component;

    public void SetComponent(Componet component)

    {

        this.component = component;

    }

    public override void Operation()

    {

        if (component != null)

        {

            //重写Operation(),实际执行的是Component雷的Operation();

            component.Operation();

        }

    }

}

//进行A装饰;

class ConcreteDecoratorA : Decorator

{

    private string addedState;

    public override void Operation()

    {

        //先完成本来要进行的操作;

        base.Operation();

        addedState="new State";

        Console.WriteLine("对具体对象进行“A装饰”的操作");

    }

}

//进行B装饰;

class ConcreteDecoratorB : Decorator

{

    public override void Operation()

    {

        base.Operation();

        AddedBehavior();

        Console.WriteLine("对具体对象进行“B装饰”的操作");

    }

    private void AddedBehavior()

    { }

}

///////////////////////////////////////////////////////////////////////////////

/*客户端代码*/

class APP

{

     static void Main()

     {

         ConcreteComponent c = new ConcreteComponent();

         ConcreteDecoratorA d1 = new ConcreteDecoratorA();

         ConcreteDecoratorB d2 = new ConcreteDecoratorB();

 

         d1.SetComponent(c);//对c进行A装饰;

         d2.SetComponent(d1);//对d1进行B装饰;

         d2.Operation();

 

         Console.Read();

     }

}  
例子:以人的装扮为例。

【代码实现】

using System;

//Person类

class Person

{

  public Person(){}

  private string name;

  public Person(string name)

  {

    this.name=name;

  }

  public virtual void Show()

  {

    Console.WriteLine("装扮的{0}",name);

  }

}

//服饰类:继承自Person,并维护一个Person的引用。

class Finery:Person

{

  protected Person component;

  //打扮

  public void Decorate(Person component)

  {

    this.component=component;

  }

  public override void Show()

  {

    if(component!=null)

{

  component.Show();

}

  }

}

 

//具体服饰类;继承自装饰类;

class TShirts:Finery

{

  public override void Show()

  {

    base.Show();

    Console.WriteLine("T恤衫"); 

  }

 

}

class Sneakers:Finery

{

  public override void Show()

  {

    base.Show();

    Console.WriteLine("胶底运动鞋");

  }

 

}

class Trousers:Finery

{

  public override void Show()

  {

    base.Show();

Console.WriteLine("短裤");

  }

 

}

class LeatherShoes:Finery

{

  public override void Show()

  {

    base.Show();

Console.WriteLine("皮鞋");

  }

 

}

//客户代码

class App

{

  static void Main()

  {

   Person xs=new Person("小山");

   Console.WriteLine("第一种装扮");

   

   Sneakers sk=new Sneakers();

   Trousers ts=new Trousers();

   TShirts tst=new TShirts();

   

   sk.Decorate(xs);

   ts.Decorate(sk);

   tst.Decorate(ts);

   tst.Show();

  }

}

 

目录
相关文章
|
SQL 机器学习/深度学习 数据采集
Apache Doris Broker数据导入使用示例及介绍
Broker load 是一个异步的导入方式,支持的数据源取决于 Broker 进程支持的数据源。用户需要通过 MySQL 协议 创建 Broker load 导入,并通过查看导入命令检查导入结果。
2003 0
Apache Doris Broker数据导入使用示例及介绍
|
存储 缓存 固态存储
HBase 性能调优第一弹:内存篇
这是使用 HBase 最不可避免的一个话题,就是 HBase 的性能调优,而且通常建立在我们对 HBase 内部运行机制比较了解的基础上进行的,因此无论怎么说,调优这块都是一个相对复杂的事情。这一篇我们先来介绍与 HBase 内存最相关的调优内容。 1. 合理配置 JVM 内存 这里首先涉及 HBase 服务的堆内存设置。一般刚部署的 HBase 集群,默认配置只给 Master 和 RegionServer 分配了 1G 的内存,RegionServer 中 MemStore 默认占 0.4 即 400MB 左右的空间,而一个 MemStore 刷写阈值默认 128M,所以一个 Regi
1222 0
|
SQL Java Android开发
Mat使用详解
Mat使用详解
|
小程序 数据安全/隐私保护 开发者
如何免费制作微信小程序?详细步骤
如何免费制作微信小程序?详细步骤
如何免费制作微信小程序?详细步骤
|
计算机视觉
【方便的Opencv】实现图片合成视频+附带图片生成gif
【方便的Opencv】实现图片合成视频+附带图片生成gif
【方便的Opencv】实现图片合成视频+附带图片生成gif
|
大数据 云栖大会 数据中心
第二届浸没液冷智算产业发展论坛:阿里云新发布两项白皮书
第二届浸没液冷智算产业发展论坛:阿里云新发布两项白皮书
第二届浸没液冷智算产业发展论坛:阿里云新发布两项白皮书
|
机器人 C# 图形学
Unity Shader Graph 制作Dissolve溶解效果
Unity Shader Graph 制作Dissolve溶解效果
533 0
Unity Shader Graph 制作Dissolve溶解效果
|
存储 人工智能 供应链
阿里云发布飞天智算平台,铸就数字经济云服务底座
数字经济蝶变需要强大算力支撑。
1117 0
阿里云发布飞天智算平台,铸就数字经济云服务底座
|
架构师 云栖大会 云计算
分享阿里云ace考试攻略 详解ACP认证考试须知
最近很多朋友都在关注阿里云ace考试,那么这个ACE证书的含金量如何?阿里云ace考试是怎么考的?下面就让认证大使来给大家介绍一下阿里云ace考试攻略,有需要的朋友进来看看吧。
862 1
分享阿里云ace考试攻略 详解ACP认证考试须知
|
存储 云安全 弹性计算
阿里云云计算认证是什么?考试容易过吗?
云计算行业是现在最热门的行业之一,不但各大企业争相研究,国家更是大力支持,而人才缺失却是现在最需解决的困难,各大公司优先选择拥有阿里云云计算的人才,下面跟随小编一起了解一下吧。
1140 0
阿里云云计算认证是什么?考试容易过吗?