<装饰模式>比<建造者模式>多了啥(结构型模式)
 动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。当你需要频繁修改或者扩展一个类的功能的时候,就应该考虑使用装饰模式。
 这里的装饰模式,显示的是在扩展方法。应用场景需要好好考虑

如上图所示,Component是定义一个对象接口,可以给这些对象动态地添加职责,ConcreteComponent是定义了一个具体的对象,也可以给这个对象添加一些职责。Decorator,装饰抽象类,继承了Component,从外类来扩展Component类的功能,对于Component来说,是无需知道Decorator的存在的。至于ConcreteDecorator就是具体的装饰对象,起到给Component添加职责的功能。
接口方式 示例代码:
 class Program
    {
        static void Main(string[] args)
        {
            Component c = new ConcerteComponent();
            Decorator d = new ConcreteDecorator();
            d.SetComponent(c);
            d.Operation();
            Console.Read();
        }
    }
  //抽象构件角色
    interface Component
    {
        void Operation();
    }
  //抽象构件角色
    class ConcerteComponent : Component
    {
        public void Operation()
        {
            Console.WriteLine("操作一波");
        }
    }
  //抽象装饰角色
    abstract class Decorator : Component
    {
        Component componet;
        public void SetComponent(Component componet)
        {
            this.componet = componet;
        }
        public virtual void Operation()
        {
            if (componet != null)
            {
                componet.Operation();
            }
        }
    }
  //具体装饰角色
    class ConcreteDecorator : Decorator
    {
        public override void Operation()
        {
            base.Operation();
            AddFunc();
        }
        private void AddFunc()
        {
            Console.WriteLine("再操作一波");
        }
    }
抽象类示例代码:
public class DecoratorPattern
{
    public static void main(String[] args)
    {
        Component p=new ConcreteComponent();
      
        Component d=new ConcreteDecorator();
        d.SetComponent (p);
  
        d.Operation();
    }
}
//抽象构件角色
abstract Component
{
    public abstract   void Operation();
}
//具体构件角色
class ConcreteComponent : Component
{
  
    public override void Operation()
    {
        Console.WriteLine("调用具体构件角色的方法operation()");           
    }
}
//抽象装饰角色
class Decorator : Component
{
    private Component component;   
    public void SetComponent (Component component)
    {
        this.component=component;
    }   
    public override void Operation()
    {
        if(component!=null)
        component.operation();
    }
}
//具体装饰角色
class ConcreteDecorator :Decorator
{
   
    public override void Operation()
    {
        base.operation();
        addedFunction();  //进行额外的装饰方法
    }
    public void addedFunction()
    {
        System.out.println("为具体构件角色增加额外的功能addedFunction()");           
    }
}
装饰者模式与建造者模式区别
- 建造者模式首先是创建型模式。
- 建造者模式的建造过程是必须稳定的,即流程是固定的。
使用情况
- 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
- 处理那些可以撤消的职责。
- 当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的 子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号