设计模式学习之策略模式

目录

定义

策略模式定义了一系列的用于同一事务的算法,并将每一个算法封装起来,而且使它们可以相互替换。

引言

策略模式是设计模式中常用的基本的模式之一,在很多的业务场景中都会有涉及到,所以今天在这里对设计模式进行讲解;个人能力有限,不足之处还请多谅解以及指明。

模式讲解

本文将以小狗做为对象来进行模式的分析讲解;

需求描述

    现需要开发一个对小狗进行管理的软件,该软件将用来管理小狗的肤色、品种、类型等;在客户选择不同小狗时客户可以了解到所选择小狗的个性化的信息。
PS:这个只是一个简单的需求,并不是很严谨,主要是为了有一个大概的场景;当然,要实现这个需求有很多方法。

实现思路

首先我们需要创建一个小狗的基类,这个基类中包含了小狗的品种、类型的描述,然后我们在基类中实现共同的方法(品种、类型),因为肤色每个小狗都不一样,所以放到了类中进行定义;然后我们要个性化的显示这些属性,所以我们在基类中定义一个display的方法,然后在子类中实现,最后的UML图如下:
UML图

具体实现

    /// <summary>
    /// 狗的基类
    /// </summary>
    public abstract class Dog
    {
        protected string Bread = "哈巴狗";

        protected string Type = "真的是一只狗,活的!";

        public abstract void  DisplayDog();
    }

    public class GreenDog : Dog
    {
        public override void DisplayDog()
        {
            string Color = "绿色";
            Console.WriteLine(string.Format("Bread:{0},Type:{1},Color:{2},I'm a GreenDog",Bread,Type,Color));
        }
    }

    public class BlackDog : Dog
    {
        public override void DisplayDog()
        {
            string Color = "黑色";
            Console.WriteLine(string.Format("Bread:{0},Type:{1},Color:{2},I'm a BlackDog", Bread, Type, Color));
        }
    }

    public class client
    {
        public void Select()
        {
            Dog greendog=new GreenDog();
            Dog blackdog=new BlackDog();
            greendog.DisplayDog();
            blackdog.DisplayDog();

        }
    }

调用client的Select方法后会看到如下结果:

Bread:哈巴狗,Type:真的是一只狗,活的!,Color:绿色,I'm a BlackDog
Bread:哈巴狗,Type:真的是一只狗,活的!,Color:黑色,I'm a BlackDog

可以看到这是我们想要的结果,实现了不同的狗有不同的显示方式(个性化显示)。
然后需求变更了,客户告诉我们每个小狗都会汪汪叫,然后我们在Dog里面加一个会叫的方法并在子类中调用,实现了所有小狗会叫的功能;但是问题来了,玩具狗来了,玩具狗不会叫,结果也会叫了,怎么办?怎么办?

问题这样解决

玩具狗也有会叫的,真正的狗叫的方法也有些不一样(有一些),所以Dog基类中加一个会叫的方法对于新的需求不适应了那我们怎么改呢?
这个地方可以想想(提示:玩具狗不会叫哦)
UML图如下:
UML图
在这里我们直接将狗会叫的行为独立出来,将Dog基类修改为抽象类,在Dog抽象类开添加对叫这个行为的支持,然后将具体的行为延迟到子类中实例化,让子类来决定会不会,叫的具体行为是什么;这里还有一个更好的方式就是让子类继承Dog类和相应的行为类;UML图如下:
UML图
这个好处比上一个更加的灵活(建议使用这一种)偶合性也更低,这样如果我们再添加一只狗或者狗的行为时就不用再去抽象类开进行修改,只需要在相应的子类中添加狗的行就可以,这也就是组合原则。

总结

策略模式用很直白的话说就是将相同的行为抽象到父类中,再将多变的一些行为在子类中进行定义或者使用其它的类,再让子类根据自己的所需要的行为来对这些行为进行重组,并通过让客户对父类的调用来决定最终使用什么行为组合使用什么策略。

优缺点

(来自百度百科的引用)

    优点:
1、 策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码转移到父类里面,从而避免重复的代码。
2、 策略模式提供了可以替换继承关系的办法。继承可以处理多种算法或行为。如果不是用策略模式,那么使用算法或行为的环境类就可能会有一些子类,每一个子类提供一个不同的算法或行为。但是,这样一来算法或行为的使用者就和算法或行为本身混在一起。决定使用哪一种算法或采取哪一种行为的逻辑就和算法或行为的逻辑混合在一起,从而不可能再独立演化。继承使得动态改变算法或行为变得不可能。
3、 使用策略模式可以避免使用多重条件转移语句。多重转移语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重转移语句里面,比使用继承的办法还要原始和落后。
    缺点:
1、客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道所有的算法或行为的情况。
2、 策略模式造成很多的策略类,每个具体策略类都会产生一个新类。有时候可以通过把依赖于环境的状态保存到客户端里面,而将策略类设计成可共享的,这样策略类实例可以被不同客户端使用。换言之,可以使用享元模式来减少对象的数量。

转载请注明出自【可理喻的小的的专栏

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值