Study Decorator(学习装饰模式)

来源:互联网 发布:js对dom中的元素截图 编辑:程序博客网 时间:2024/05/16 00:46

 

using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

/// <summary>
///DecoratorStudy 的摘要说明
/// </summary>
public class DecoratorStudy
{
public DecoratorStudy()
{
   //
   //TODO: 在此处添加构造函数逻辑
   //
}

    public abstract class Tank //定义一个坦克地抽象类
    {
        //定义坦克类地两个抽象方法Shot()和Run();
        public abstract void Shot();
//设计方法

        public abstract void Run(); //运行方法
    }

    //定义一个Decorator抽象类继承Tank抽象类某种程度上就可以看成是一个接口
    public abstract class Decorator : Tank //实际上来讲应该是一个接口继承
    {
        //定义以tank的私有变量
        private Tank tank;

        //设置一个构造器接受tank
        public Decorator(Tank tank)
        {
            this.tank = tank;
        }

       //重写Shot()方法
        public override void Shot()
        {
            //用私有变量来调用Shot()方法
            tank.Shot();
            throw new NotImplementedException();
        }

        //重写Run()方法
        public override void Run()
        {
            //用私有变量来调用Run()方法
            tank.Run();
            throw new NotImplementedException();
        }
    }

    //扩展Tank的属性1
    public class DecrotatorA : Decorator
    {

        //构造器是不能继承所以此处我们要重写构造器
        public DecrotatorA(Tank tank)
            : base(tank) //将父类的Tank传给它
        {
       
        }

        public override void Shot()
        {
           //功能扩展
           //扩展地功能写在此处(如红外功能扩展等)
            base.Shot();
        }

        public override void Run()
        {
           //功能扩展
            //扩展地功能写在此处(如红外功能扩展等)
            base.Run();
        }
   
    }

    //扩展Tank的属性2
    public class DecrotatorB : Decorator
    {
        //构造器是不能继承的所以此处我们要重写构造器
        public DecrotatorB(Tank tank)
            : base(tank)//将父类的Tank传给它
        {
       
        }
        public override void Shot()
        {
            //功能扩展
            //扩展地功能写在此处(如水路两用功能扩展等)
            base.Shot();
        }

        public override void Run()
        {
            //功能扩展
            //扩展地功能写在此处(如水路两用功能扩展等)
            base.Run();
        }

    }

   //扩展Tank的属性3
    public class DecrotatorC : Decorator
    {
        //构造器是不能继承的所以此处我们要重写构造器
        public DecrotatorC(Tank tank)
            : base(tank) //将父类的Tank传给它
        {
       
        }
        public override void Shot()
        {
            //功能扩展
            //扩展地功能写在此处(如卫星定位功能扩展等)
            base.Shot();
        }

        public override void Run()
        {
            //功能扩展
            //扩展地功能写在此处(如卫星定位功能扩展等)
            base.Run();
        }

    }

    //怎么用了下面即将介绍
    //比如说现在有一种T50类型地坦克
    public class T50 : Tank
    {
       //重写Shot()和Run()方法
        public override void Shot()
        {
            throw new NotImplementedException();
        }

        public override void Run()
        {
            throw new NotImplementedException();
        }
    }

    //具体地应用
    class App
    {
        public static void Main()
        {
            //实例化一个T50类型地坦克
            Tank tank = new T50();
           
            //增加红外功能的T50类型地坦克
            DecrotatorA Da = new DecrotatorA(tank);

           //增加了红外功能和水路两用功能地坦克
            DecrotatorB Db = new DecrotatorB(Da);

           //增加了红外功能、水路两用功能和卫星定位功能地坦克
            DecrotatorC Dc = new DecrotatorC(Db);
          
          
//这样一个装饰模式就得到了很好地应用
           //如果再想加入一种功能只要在为此功能写一个类就可以了
           //不必在改动大段地代码了
           //是不是很方便

        }
    }

}

 

类关系图

 

原创粉丝点击