设计模式(17)----- 策略模式

概念:

策略模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户。

意图:

定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。

主要解决:

在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。

优点:

  1. 算法可以自由切换。
  2. 避免使用多重条件判断。
  3. 扩展性良好。

缺点:

  1. 客户端必须要知道所有的策略类,否则你不知道该使用那个策略,所以策略模式适用于提前知道所有策略的情况下。
  2. 策略类数量增多(每一个策略类复用性很小,如果需要增加算法,就只能新增类)

模式的结构

策略模式的主要角色如下。

抽象策略(Strategy)类:

定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现。

具体策略(Concrete Strategy)类:

实现了抽象策略定义的接口,提供具体的算法实现。

环境(Context)类:

持有一个策略类的引用,最终给客户端调用。

实现类图:
在这里插入图片描述

抽象策略(Strategy)类:计算工资

public abstract class 计算工资
{
    private int baseSalary;//基础工资
    private int subsidy;//补贴
    public 计算工资(int baseSalary, int subsidy)
    {
        this.baseSalary = baseSalary;
        this.subsidy = subsidy;
    }
    //得到当前工资总数
    virtual public int GetSalary()
    {
        return baseSalary + subsidy;
    }
}

具体策略(Concrete Strategy)类:
程序员工资算法

public class 程序员工资算法 : 计算工资
{
    private int projectBonus;//项目奖金

    public 程序员工资算法(int baseSalary, int subsidy)
        : base(baseSalary, subsidy)
    { }
    public int ProjectBonus
    {
        set { projectBonus = value; }
        get { return projectBonus; }
    }
    //加上项目奖金
    public override int GetSalary()
    {
        return base.GetSalary() + this.projectBonus;
    }
}

测试员工资算法

public class 测试员工资算法 : 计算工资
{
    private int bugs;//发现Bug数

    public int Bugs { get => bugs; set => bugs = value; }

    public 测试员工资算法(int baseSalary, int subsidy)
        : base(baseSalary, subsidy)
    { }
    //每发现一个Bug200块钱
    public override int GetSalary()
    {
        return base.GetSalary() + bugs * 200;
    }
}

环境(Context)类:员工

public class 员工
{
    private string job;//职业
    计算工资 startegy;//选择哪种算法

    public string Job { get => job; set => job = value; }

    public 员工(计算工资 startegy)
    {
        this.startegy = startegy;
    }
    public int GetSalary()
    {
        return startegy.GetSalary();
    }
    //做工作
    public void DoWork()
    {
        throw new System.NotImplementedException();
    }
}

测试:

using System;

class Program
{
    static void Main(string[] args)
    {
        程序员工资算法 stategy = new 程序员工资算法(10000, 2000);
        员工 c = new 员工(stategy);
        stategy.ProjectBonus = 10000;
        c.Job = "程序员";
        Console.WriteLine(c.Job + c.GetSalary());

        测试员工资算法 stategy1 = new 测试员工资算法(10000, 2000);
        员工 c1 = new 员工(stategy1);
        stategy1.Bugs = 20;
        c1.Job = "测试员";
        Console.WriteLine(c1.Job + c1.GetSalary());

        Console.Read();
    }
}

输出示例:

在这里插入图片描述
设计模式------首页

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值