栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

14/23 装饰器模式

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

14/23 装饰器模式

装饰器模式(Decorator Pattern)

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

使用场景:

  1. 扩展一个类的功能。
  2. 动态增加功能,动态撤销。
  3. [AOP设计常见设计、后续博客会讲述…]
1 使用场景一:扩展类功能 1.1 生产上线代码

现在我们写了一个很强大同时又非常复杂的功能。如下为该算法[由于只是模拟故,所以乱写一通]

public interface IOperator
{
    void Operator();
}

public class Operator01 : IOperator
{
    public void Operator()
    {
        for (int i = 0; i < 10; i++)
        {
            for (int j = 0; j < 10; j++)
            {
                Console.WriteLine(i*j);
            }
        }
    }
}
public class Operator02 : IOperator
{
    public void Operator()
    {
        Console.WriteLine("121212312");
        Console.WriteLine("121212312");
        Console.WriteLine("121212312");
        Console.WriteLine("121212312");
    }
}

public class OperatorFactory
{
    public static IOperator GetOperator(OperatorType pOperatorType)
    {
        IOperator pOperator = null;
        switch (pOperatorType)
        {
            case OperatorType.Oper01:
                pOperator = new Operator01();
                break;
            case OperatorType.Oper02:
                pOperator = new Operator02();
                break;
        }
        return pOperator;
    }
}
public enum OperatorType
{
    Oper01,
    Oper02
}

private void btnRunOperator_Click(object sender, EventArgs e)
{
    IOperator pOperator = OperatorFactory.GetOperator(OperatorType.Oper01);
    pOperator.Operator();
}

现在要将Operator01 算子循环调用10次,那么我们为了不将算法重新实现一次,而为了遵循开闭原则我们,将对象包装一层:

public class Operator01 : IOperator
{
    public virtual void Operator()
    {
        for (int i = 0; i < 10; i++)
        {
            for (int j = 0; j < 10; j++)
            {
                Console.WriteLine(i*j);
            }
        }
    }
}
public class Operator01_Batch : Operator01
{
    public override void Operator()
    {
        Console.WriteLine("写入日志信息");
        base.Operator();
    }
}
2.动态增加功能,动态撤销。
public abstract class AbstractEquipment
{
    public int Id { get; set; }
    public string Name { get; set; }
    public abstract void Attack();
}
public class Gun : AbstractEquipment
{
    public override void Attack()
    {
        Console.WriteLine("用枪攻击");
    }
}
class Sword : AbstractEquipment
{
    public override void Attack()
    {
        Console.WriteLine("用剑攻击");
    }
}
public class GunInherit:Gun
{
    public override void Attack()
    {
        base.Attack();
        Console.WriteLine("善恶值增加");
    }
}

//组合
public class EquipmentCombination
{
    private AbstractEquipment _equipment = null;
    public EquipmentCombination(AbstractEquipment equipment)
    {
        _equipment = equipment;
    }
    public void Attack()
    {
        _equipment.Attack();
        Console.WriteLine("善恶值增加");
    }
}
public class BaseEquipmentDecorator : AbstractEquipment
{
    private AbstractEquipment _equipment = null;
    public BaseEquipmentDecorator(AbstractEquipment equipment)
    {
        _equipment = equipment;
    }
    public override void Attack()
    {
        _equipment.Attack();
    }
}
public class EquipmentStrengthenDecorator:BaseEquipmentDecorator
{
    //调用直接父类的指定构造函数
    public EquipmentStrengthenDecorator(AbstractEquipment equipment)
        :base(equipment)
    {
    }
    public override void Attack()
    {
        base.Attack();
        Strengthen();
    }
    public void Strengthen()
    {
        Console.WriteLine("武器被强化");
    }
}

界面调用
        private void button1_Click(object sender, EventArgs e)
        {
            AbstractEquipment gun = new Gun();
            gun = new EquipmentStrengthenDecorator(gun);
            gun.Attack();
        }
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/955523.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号