image

编辑人: 人逝花落空

calendar2025-06-14

message4

visits744

装饰模式 Decorator

分析&回答

装饰模式动态地给一个对象添加一些额外的职责,就增加功能来说,它比生成子类更灵活。 也可以这样说,装饰模式把复杂类中的核心职责和装饰功能区分开了,这样既简化了复杂类,有去除了相关类中重复的装饰逻辑。装饰模式没有通过继承原有类来扩展功能,但却达到了一样的目的,而且比继承更加灵活,所以可以说装饰模式是继承关系的一种替代方案。装饰模式解耦了核心和装饰功能,所以也是强调了松耦合

image-1691391888406

实例代码讲解:

/**
 * 最高接口,被装饰者和“装饰品”都继承于此  
  */    
abstract public class Component{
    public abstract void Operation();
}

/**
 * 具体的被装饰者
 */
public class Concretecomponent:Component{
    public override void Operation(){
        Console.Write("具体对象的装饰操作");
    }
}

/**
 * 装饰类
  */    
abstract public class Decorator:Component(){
    protected Component component;

    public void SetComponent(Component component){
        this.component = component;
    }
    public override void Operation(){
        if(component!=null) component.Operation();
    }
}

/**
 * 具体的装饰类A
 */
public class ConcreteDecoratorA:Decorator{
    private string addedState;
    public override void Operation(){
        base.Operation();
        addedState="New State";
        Console.Write("具体装饰A的操作(添加了新的状态)");
    }
}

/**
 * 具体的装饰类B
 */
public class ConcreteDecoratorB:Decorator{
    public override void Operartion(){
        base.Operation();
        AddedBehavior();
        Console.WriteLine("具体装饰B的操作(添加了新的方法)");
    }
    private void AddedBehavior(){
        //添加新的行为  
    }
}

/**
 * client端
 * @param args
 */
static void Main(string[] args)
{
    Concretecomponent c = new Concretecomponent();
    Decorator d1 = new ConcreteDecoratorA();
    Decorator d2 = new ConcreteDecoratorB();

    d1.SetComponent(c);
    d2.SetComponent(d1);//注意这里装饰的是d1,因为这里的d1是装饰了d1的c。  
    d2.Operation();

    Console.ReadLine();
}

反思&扩展


喵呜刷题:让学习像火箭一样快速,快来微信扫码,体验免费刷题服务,开启你的学习加速器!

创作类型:
原创

本文链接:装饰模式 Decorator

版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。
分享文章
share