0
点赞
收藏
分享

微信扫一扫

设计模式行为型[上]

腊梅5朵 2022-04-18 阅读 110

概念

用来识别对象之间的常用交流模式并加以实现。如此,可在进行这些交流活动时增强弹性。

模板方法

1.基础概念

模板方法模式定义了一个算法的步骤,并允许子类别为一个或多个步骤提供其实践方式。让子类别在不改变算法架构的情况下,重新定义算法中的某些步骤。

2.类图

在这里插入图片描述分析类图我们可以得知:父类给出的是抽象的算法骨架,具体的方法怎么做留给了具体的子类。

代码

  internal class Program
    {
        static void Main(string[] args)
        {
            //调用的时候想用那个具体子类的算法,实例化的就是那个子类的对象
            AbstractClass class1 = new ConcreteClass();
            class1.TemplateMethod();      
        }
    }

    abstract class AbstractClass
    {
        //定义的算法的执行骨架
        public void TemplateMethod()
        {
            //算法的执行顺序
            PrimitiveOperation1();
            PrimitiveOperation2();
            
        }
        //子类里面可以更改的算法
        public abstract void PrimitiveOperation1();
        public abstract void PrimitiveOperation2();
    }

    //具体的子类
    class ConcreteClass : AbstractClass
    {
        //具体子类实现
        public override void PrimitiveOperation1()
        {
            Console.WriteLine("子类对算法的方法1的具体实现");
        }

        public override void PrimitiveOperation2()
        {
            Console.WriteLine("子类对算法的方法2的具体实现");
        }
    }

模板方法如果想要扩展的话,就创建一个新的类来继承模板,将具体的算法的实现进行更改,使用的时候用哪个具体方法,实例化那个具体的对象就可以了。

策略模式

概念 :

策略模式定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。

类图:

在这里插入图片描述策略模式主要由三部分构成

  1. 抽象策略(CashSuper)类:定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现。
  2. 具体策略(CashNormal1)类:实现了抽象策略定义的接口,提供具体的算法实现。
  3. 环境(CashContext)类:持有一个策略类的引用,最终给客户端调用。

代码

        static void Main(string[] args)
        {
            //这里调用的是第一个策略
            CashSuper cashSuper = new CashNormal();
            CashContext cashContext = new CashContext(cashSuper);
            cashContext.GetResult();
        }
           abstract class CashSuper
    {
      //抽象的收费策略
      public  abstract void acceptCash();
    }

    class CashNormal : CashSuper
    {
        //第一种具体策略
        public override void acceptCash()
        {
            Console.WriteLine("这是第一种策略");
        }
    }
    class CashRebate : CashSuper
    {
        public override void acceptCash()
        {
            Console.WriteLine("这是第二种策略");
        }
    }
    class CashReturn : CashSuper
    {
        public override void acceptCash()
        {
            Console.WriteLine("这是第三种策略");
        }
    }
    //保存的策略类的引用
    class CashContext
    {
        private CashSuper cashSuper;
        //传入具体的策略对象
        public CashContext(CashSuper cashSuper)
        {
            this.cashSuper = cashSuper;
        }
        //调用策略类的方法,传入的什么对象,就调用那个策略
        public void GetResult()
        {
             cashSuper.acceptCash();
        }
    }

如果有新增业务的话,新增一个策略子类,继承抽象的策略类,调用的时候通过环境类进行调用就可以了。

举报

相关推荐

0 条评论