vlambda博客
学习文章列表

C#设计模式——装饰模式

This browser does not support music or audio playback. Please play it in WeChat or another browser.
C#设计模式——装饰模式


我希望未来有一天,因为我的代码,让这个世界上的一些人生活的更便利
感觉到一点点幸福或愉悦。不管这些人多还是少。

前言


装饰模式是结构型模式,它的作用在于扩展,当一个产品需要添加一个小零件、小功能时,重新写一个接口,就不那么方便,这时就需要使用装饰模式了。通过动态地给一个对象添加额外的职责。

C#设计模式——装饰模式
C#设计模式——装饰模式

方案思路


装饰模式需要以下4个模块:

1:抽象构建(Component):定义一个抽象接口,用以给这些对象动态地添加职责。

2:具体构建(ConcreteComponent):定义一个具体的对象,也可以给这个对象添加一些职责。

3:装饰类(Decorator): 装饰抽象类,继承了Component,从外类来扩展Component类的功能。

4:具体装饰者(ConcretorDecorator):负责给构建对象添加职责。

在下面的例子中,给手机添加一些小部件,比如贴膜,套手机壳,使用装饰模式就非常灵活的的提供了添加部件的功能,且扩展性很高,也符合单一职责的原则。

C#设计模式——装饰模式
C#设计模式——装饰模式

Code




以下代码经过测试,可直接在项目中使用

/// <summary>

/// 测试类

/// </summary>

public class DecoratorTest : MonoBehaviour

{

    void Start()

    {

        Phone ApplePhone = new ApplePhone();

        //添加保护膜

        ApplePhone = new AddSticker(ApplePhone);

        ApplePhone.ShowInfo();

        //添加保护套

        ApplePhone = new AddShell(ApplePhone);

        ApplePhone.ShowInfo();

    }

}

/// <summary>

/// 手机基类:抽象构建(Component)

/// </summary>

public abstract class Phone

{

    public abstract void ShowInfo();

}

/// <summary>

/// 具体手机:具体构建(ConcreteComponent)

/// </summary>

public class ApplePhone : Phone

{

    public override void ShowInfo()

    {

        Debug.Log("这是苹果手机");

    }

}

/// <summary>

/// 装饰类(Decorator): 装饰抽象类,继承了Component,从外类来扩展Component类的功能

/// </summary>

public abstract class Decorator : Phone

{

    private Phone phone;

    public Decorator(Phone phone)

    {

        this.phone = phone;

    }

    public override void ShowInfo()

    {

        phone.ShowInfo();

    }

}

/// <summary>

/// 贴膜:具体装饰者(ConcretorDecorator)

/// </summary>

public class AddSticker : Decorator

{

    public AddSticker(Phone phone) : base(phone)

    {

    }

    public override void ShowInfo()

    {

        base.ShowInfo();

        AddSticker_Func();

    }

    private void AddSticker_Func()

    {

        Debug.Log("添加了一个保护膜");

    }

}

/// <summary>

/// 手机壳:具体装饰者(ConcretorDecorator)

/// </summary>

public class AddShell : Decorator

{

    public AddShell(Phone phone) : base(phone)

    {

    } 

    public override void ShowInfo()

    {

        base.ShowInfo();

        AddShell_Func();

    }

    private void AddShell_Func()

    {

        Debug.Log("添加了一个手机壳");

    }

}







END




感谢阅读


你知道的越多,你不知道的越多

我是EAST

一个靠互联网苟且偷生的程序员

咱们下期见!





扫描二维码关注我吧