装饰模式(Decorator )

修饰模式,是面向对象编程领域中,一种动态地往一个类中添加新的行为的设计模式。就功能而言,修饰模式相比生成子类更为灵活,这样可以给某个对象而不是整个类添加一些功能。

通过使用修饰模式,可以在运行时扩充一个类的功能。原理是:增加一个修饰类包裹原来的类,包裹的方式一般是通过在将原来的对象作为修饰类的构造函数的参数。装饰类实现新的功能,但是,在不需要用到新功能的地方,它可以直接调用原来的类中的方法。修饰类必须和原来的类有相同的接口。

修饰模式是类继承的另外一种选择。类继承在编译时候增加行为,而装饰模式是在运行时增加行为。

当有几个相互独立的功能需要扩充时,这个区别就变得很重要。在有些面向对象的编程语言中,类不能在运行时被创建,通常在设计的时候也不能预测到有哪几种功能组合。这就意味着要为每一种组合创建一个新类。相反,修饰模式是面向运行时候的对象实例的,这样就可以在运行时根据需要进行组合。

意图:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication19
{
    class Program
    {
        static void Main(string[] args)
        {
            SQLQuery s = new SQLQuery();

            crud1 c = new crud1();
            c.setQuery(s);

            c.getdata();

            Console.Read();

        }
    }

    public abstract class IQuery{
    
    public abstract  void getdata()   ;
    
    }
    public class SQLQuery:IQuery {

        public override  void getdata() {

            Console.WriteLine("读取数据");
        }   
    }

    //这时,读取数据之前,要删除原来的数据,这有又要添加一个方法,删除之前有要干嘛干嘛,这样为了这个getdata这个方法,要在SQLQuery添加两个方法,这个getdata方法可以能我一辈子也不会用到。
    //这是就可以用到 修饰模式了。


    public abstract class crud : IQuery
    {

        protected IQuery Query;
        public void setQuery(IQuery Query) {
            this.Query = Query;
        }
        public override void getdata()
        {
            if(this.Query!=null)
            {
              
                Query.getdata();
            }
        }
     
    
    }


    public class crud1 : crud {

        public override void getdata()
        {
            de();
            base.getdata();
        }

        public void de() { Console.WriteLine("删除"); }
    }




}

 

posted @ 2014-07-10 15:33  欢呼雀跃  阅读(148)  评论(0)    收藏  举报