刷题刷出新高度,偷偷领先!偷偷领先!偷偷领先! 关注我们,悄悄成为最优秀的自己!

面试题

装饰模式 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