模式说法之——装饰

简介: 我们通常可以使用继承来实现功能的拓展,如果这些需要拓展的功能的种类很繁多,那么势必生成很多子类,增加系统的复杂性,同时,使用继承实现功能拓展,我们必须可预见这些拓展功能,这些功能是编译时就确定了,是静态的。

我们通常可以使用继承来实现功能的拓展,如果这些需要拓展的功能的种类很繁多,那么势必生成很多子类,增加系统的复杂性,同时,使用继承实现功能拓展,我们必须可预见这些拓展功能,这些功能是编译时就确定了,是静态的。

 

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

 

 

 

(一)代码

public abstract class Component

    {

        public abstract void Do1();

        public abstract void Do2();

    }

 

    public class ConcreteComponent : Component

    {

        public override void Do1()

        {

            Console.WriteLine("第一件事。");

        }

 

        public override void Do2()

        {

            Console.WriteLine("第二件事。");

        }

    }

 

    public abstract class Decorator : Component

    {

        Component _component;

 

        public Decorator(Component component)

        {

            _component = component;

        }

 

 

        public override void Do1()

        {

            _component.Do1();

        }

 

        public override void Do2()

        {

            _component.Do2();

        }

    }

 

    public class ConcreteDecorator1 : Decorator

    {

        public ConcreteDecorator1(Component component):base(component)

        {

       

        }

 

        public override void Do1()

        {

            base.Do1();

            Console.WriteLine("听着音乐!");

        }

    }

 

    public class ConcreteDecorator2: Decorator

    {

        public ConcreteDecorator2(Component component)

            : base(component)

        {

 

        }

 

        public override void Do2()

        {

            base.Do1();

            Console.WriteLine("吃着零食!");

        }

    }

(二)测试

[Test]

        public void TestDecorator()

        {

            Component c1 = new ConcreteComponent();

 

            Decorator.Decorator d = new ConcreteDecorator1(c1);

 

            d.Do1();

 

        }

结果:

 

第一件事。听着音乐!

 

 

 

博客园大道至简

http://www.cnblogs.com/jams742003/

转载请注明:博客园

目录
相关文章
|
芯片 异构计算
【FPGA】高云FPGA之数字钟实验->HC595驱动数码管(一)
【FPGA】高云FPGA之数字钟实验->HC595驱动数码管
412 2
|
Java
异步技巧之CompletableFuture
异步技巧之CompletableFuture
120 2
|
弹性计算 运维 数据安全/隐私保护
3分钟部署 幻兽帕鲁(Palworld) 联机服务
幻兽帕鲁最近在游戏圈非常火,最高在线人数已逼近200万。官方服务器亚历山大,游戏开发商也提供了搭建私人专用服务器的方案,既可以保证稳定的游戏体验,也可以和朋友一起联机游戏,而且还能自定义经验翻倍等游戏里的一些选项。
3分钟部署 幻兽帕鲁(Palworld) 联机服务
|
Python Windows
xlrd库报错【AttributeError: ‘ElementTree‘ object has no attribute ‘getiterator‘】
xlrd库报错【AttributeError: ‘ElementTree‘ object has no attribute ‘getiterator‘】
372 0
|
机器学习/深度学习 算法 数据挖掘
R语言中的支持向量机(SVM)与K最近邻(KNN)算法实现与应用
【9月更文挑战第2天】无论是支持向量机还是K最近邻算法,都是机器学习中非常重要的分类算法。它们在R语言中的实现相对简单,但各有其优缺点和适用场景。在实际应用中,应根据数据的特性、任务的需求以及计算资源的限制来选择合适的算法。通过不断地实践和探索,我们可以更好地掌握这些算法并应用到实际的数据分析和机器学习任务中。
|
存储 编译器 C语言
还在为每次打开程序的输入烦恼吗,这篇文章让你不在迷茫
在之前我们编写的程序中,我们总要录入一些数据给予程序用于计算,但是当我们退出程序后录入的数据会销毁,因为此时数据都是存放在内存中。等到下次再运行程序时,数据又得从新录入,这样就非常的难受。
164 0
还在为每次打开程序的输入烦恼吗,这篇文章让你不在迷茫
|
Java 编译器 Go
经验大分享:SCJP之赋值
经验大分享:SCJP之赋值
62 0
|
iOS开发 开发者
苹果iOS App Store上架操作流程
苹果iOS App Store上架操作流程
|
Java API 开发工具
Jetpack 之 LifeCycle 组件使用详解
LifeCycle 是一个可以感知宿主生命周期变化的组件。常见的宿主包括 Activity/Fragment、Service 和 Application。LifeCycle 会持有宿主的生命周期状态的信息,当宿主生命周期发生变化时,会通知监听宿主的观察者。
255 0
Jetpack 之 LifeCycle 组件使用详解
|
Android开发
Android Studio修改字体大小
.菜单栏:File --Settings --Appearance & Behavior -- Appearance ,右边Override default fonts by(not recommended)
534 0
Android Studio修改字体大小