频道栏目
首页 > 资讯 > 其他综合 > 正文

设计模式之模板方法模式

17-09-01        来源:[db:作者]  
收藏   我要投稿

c#模板方法模式

1.定义

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。

2.实现原理

1.UML类图:
这里写图片描述
2.代码实现:

 abstract  class AbstractClass
    {
        //父类中定义一些抽象行为 放到子类中去实现
        public abstract void PrimitiveOperation1();
        public abstract void PrimitiveOperation2();

        //模板方法,给出逻辑的骨架,而逻辑的组成是一些相应的抽象对象,他们都推迟到子类实现
        public void TemplatedMethod()
        {
            PrimitiveOperation1();
            PrimitiveOperation2();
            Console.WriteLine( "");
        }
    }
//子类A的具体实现
 class ConcreteClassA : AbstractClass
    {
        public override void PrimitiveOperation1()
        {
            Console.WriteLine("具体类A的方法一实现");
        }

        public override void PrimitiveOperation2()
        {
            Console.WriteLine("具体类A的方法二实现");
        }
    }
    //子类B的具体实现
 class ConcreteClassB : AbstractClass
    {
        public override void PrimitiveOperation1()
        {
            Console.WriteLine("具体类B的方法一实现");
        }

        public override void PrimitiveOperation2()
        {
            Console.WriteLine("具体类B的方法二实现");
        }
    }

客户端:
class Program
{
static void Main(string[] args)
{
AbstractClass c;
c = new ConcreteClassA();
c.TemplatedMethod();

        c = new ConcreteClassB();
        c.TemplatedMethod();
        Console.Read();
    }
}

输出:具体类A的方法一实现
具体类A的方法二实现
具体类B的方法一实现
具体类B的方法二实现

3.实例###

试卷的模板实现:
1.UML类图
这里写图片描述
2.代码实现:

 //试卷模板
    class TestPaper
    {
        public void TestQuestion1()
        {
            Console.WriteLine("杨过得到,后来给了郭靖,炼成倚天剑、屠龙刀的玄铁可能是【】 a.球磨铸铁  b. 马口铁 c.高速合金钢");
            Console.WriteLine("答案:" +Answer1());
        }

        protected virtual string Answer1()
        {
            return "";
        }

        public void TestQuestion2()
        {
            Console.WriteLine("杨过得到,后来给了郭靖,炼成倚天剑、屠龙刀的玄铁可能是【】 a.球磨铸铁  b. 马口铁 c.高速合金钢");
            Console.WriteLine("答案:" + Answer2());
        }

        protected virtual string Answer2()
        {
            return "";
        } 
        public void TestQuestion3()
        {
            Console.WriteLine("杨过得到,后来给了郭靖,炼成倚天剑、屠龙刀的玄铁可能是【】 a.球磨铸铁  b. 马口铁 c.高速合金钢");
            Console.WriteLine("答案:" + Answer3());
        }

        protected virtual string Answer3()
        {
            return "";
        }
 //学生A的试卷
    class TestPaperA: TestPaper
    {
        protected override string Answer1()
        {
            return "a";
        }
        protected override string Answer2()
        {
            return "b";
        }
        protected override string Answer3()
        {
            return "c";
        }
    }
  //学生B的试卷
    class TestPaperB:TestPaper
    {
        protected override string Answer1()
        {
            return "b";
        }
        protected override string Answer2()
        {
            return "a";
        }
        protected override string Answer3()
        {
            return "c";
        }
    }

客户端:


    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("A学生试卷");
            TestPaper tpa = new TestPaperA();
            tpa.TestQuestion1();
            tpa.TestQuestion2();
            tpa.TestQuestion3();

            Console.WriteLine("B学生试卷");
            TestPaper tpb = new TestPaperB();
            tpb.TestQuestion1();
            tpb.TestQuestion2();
            tpb.TestQuestion3();
            Console.Read();
        }
    }

输出:
这里写图片描述

4.模板模式的使用场景

当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上实现可能不同时,我们通常考虑用模板方法模式处理

5.优点

通过把不变行为搬移到超类,去除子类中的重复代码。

相关TAG标签
上一篇:算法(求算数平方根)
下一篇:优先队列优化的求最短路和次短路条数以及长度的模板
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站