首页 > 其他分享 >设计模式-策略模式

设计模式-策略模式

时间:2023-11-05 10:56:28浏览次数:37  
标签:策略 price readonly 模式 public 算法 var 设计模式 decimal

策略模式:定义一系列的算法,将每个算法分别封装起来,让它们可以互相替换。

策略模式用于算法的自由切换和扩展,它是使用较为广泛的设计模式之一。策略模式对应于解决某一问题的一个算法族,允许用户从该算法中任选一个算法解决某一问题,同时可以方便地更换算法或者增加新算法。

策略模式实现了算法定义和算法使用分离,它通过继承和多态的机制实现对算法族的使用和管理,是一个简单实用的设计模式。

img

//以下使用的是顶级语句
//未使用依赖注入的调用
//var ef = new EFCoreRepository();
//var redis = new RedisRepostitory();
//var appService = new AppService(redis);
//appService.Create(null);


//使用依赖注入的调用 
using Microsoft.Extensions.DependencyInjection;

var services=new ServiceCollection(); //服务容器,依赖注入容器,IoC控制反转
services.AddScoped<IRepository,EFCoreRepository>();//添加作用域
//services.AddScoped<IRepository, RedisRepostitory>();//添加作用域
services.AddScoped<AppService>();

var builder=services.BuildServiceProvider();//生成服务提供程序

var  appService=builder.GetRequiredService<AppService>();//获取所需服务
appService.Create(null);
public class EFCoreRepository : IRepository //EF仓储
{
    public void Add(object entity)
    {
        Console.WriteLine("EF Core的仓储");
    }
}

public class RedisRepostitory : IRepository
{
    public void Add(object entity)
    {
        Console.WriteLine("Redis的仓储");

    }
}
public interface IRepository  //仓储
{
    void Add(object entity);
    
}


class AppService
{
    private readonly IRepository _repository;
    public AppService(IRepository repository)
    { 
        this._repository = repository;
    }
    public void Create(object entity)
    {
        _repository.Add(entity);
    }
}

下面是一个电影票根据不同用户类型打折的实例

using Microsoft.Extensions.DependencyInjection;
using System.Globalization;
using System.Reflection;
using System.Runtime.CompilerServices;

var service = new ServiceCollection();
service.AddScoped<IStrategy, StudentStrategy>()
       .AddScoped<AppService>();
var builder = service.BuildServiceProvider();
var appSerivce=builder.GetRequiredService<AppService>();
appSerivce.Price = 50;
Console.WriteLine("电影票原价50元");
Console.WriteLine(appSerivce.Price);




class StudentStrategy : IStrategy
{
    readonly string _name = "学生";
    readonly Double _discount = 0.8;

    public decimal Calculate(decimal price)
    {

        Console.WriteLine(_name + "票:");
        return price * (decimal)_discount;
    }

}
class ChildrenStrategy : IStrategy
{
    readonly string _name = "儿童";
    readonly Double _discount = 10;

    public decimal Calculate(decimal price)
    {
        Console.WriteLine(_name + "票:");
        return price * (decimal)_discount;
    }
}
class VIPStrategy : IStrategy
{
    readonly string _name = "VIP";
    readonly Double _discount = 0.5;
    public decimal Calculate(decimal price)
    {
        Console.WriteLine(_name + "票:");
        return price * (decimal)_discount;
    }
}

/// <summary>
/// 算法策略接口
/// </summary>
public interface IStrategy
{

    decimal Calculate(decimal price);
}

public class AppService
{
    private decimal _price;
    private readonly IStrategy _strategy;
    public AppService(IStrategy strategy)
    {
        _strategy = strategy;
    }

    public decimal Price
    {
        get => _strategy.Calculate(_price);
        set => _price = value;
    }

}

标签:策略,price,readonly,模式,public,算法,var,设计模式,decimal
From: https://www.cnblogs.com/bcd589/p/17810274.html

相关文章

  • 介绍LiteCVR安防视频平台地图视图模式的开发与设计
    随着AI技术的应用,视频监控系统也越来越智能。基于深度学习的智能视频安防系统可实现人脸精准识别与特征提取,支持对海量人脸数据的高效检索,动态布控,深度分析等,系统提供人像实时采集、人脸去重、实时动态布控、以脸搜脸、特征检索、人证核验、同行人分析、人员轨迹分析、异常人员徘徊......
  • Cocos 2.x- 屏幕适配、对齐策略
    在《Cocos2.x-HelloWorld飞机大战游戏》,简单实现了一个Cocos2.xHelloWorld程序,但是在不同的机型的运行效果,会出现黑边的情况,在查看CocosCreator的手册之后,发现了一个简单的解决方案,这里记录一下处理过程。1.环境搭建为了不对原来的代码进行大的调整,这里单独创建了一个......
  • openGauss学习笔记-114 openGauss 数据库管理-设置安全策略-设置帐号有效期
    openGauss学习笔记-114openGauss数据库管理-设置安全策略-设置帐号有效期114.1注意事项创建新用户时,需要限制用户的操作期限(有效开始时间和有效结束时间)。不在有效操作期内的用户需要重新设定帐号的有效操作期。114.2操作步骤以操作系统用户omm登录数据库主节点。使......
  • 设计模式—结构型模式之适配器模式
    设计模式—结构型模式之适配器模式将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,适配器模式分为类结构型模式(继承)和对象结构型模式(组合)两种,前者(继承)类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少......
  • 小程序性能提速大作战:缓存策略助你事半功倍!
    引言:嘿,各位小程序开发小伙伴们,你是不是在优化小程序性能的道路上磕磕绊绊,感觉进展缓慢?别担心,小编今天要和你聊聊小程序性能优化的秘密武器——缓存策略。我们不来搞得太严肃,就是要玩得爽!背景:小程序性能优化的关键之一就是减少不必要的数据请求,缓存策略正是为此而生。我们的目标是......
  • 企业集成模式-第二章
    二、集成模式2.1引言企业集成是指让不同的应用协同工作,提供一组统一的功能。这些应用可以是内部定制开发的,也可以从第三方开发商购买。它们可能运行在多台计算机上,分别有不同的平台,甚至在地理位置上也是分散的。有些应用可能由企业外的商业合作伙伴或客户运行。还有些应用在设......
  • 企业集成模式-第三章
    三、消息传递系统3.1引言1)消息传递的基本概念通道:是一个虚拟管道消息:能通过通道传送的一个原子数据包管道和过滤器:在最简单的情况下,消息传递系统会把消息直接从发送者的计算机传送给接收者的计算机。但是,在消息从最初的发送者那里发出,直到最后的接收者接收到以前,往往需要对......
  • 设计模式
    一、工厂模式1、简单工厂模式通过一个具体的工厂类,根据传入不同的参数,生成实际对象2、工厂方法模式在工厂方法模式中,不再由单一的工厂类生产产品,而是由工厂类的子类实现具体的产品创建。当增加一个产品时,只需增加一个相应的工厂类的子类,实现生产这种产品,从而解决简单工厂生产......
  • 软件设计实验7:单例模式
    实验7:单例模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解单例模式的动机,掌握该模式的结构;2、能够利用单列模式解决实际问题。 [实验任务一]:学号的单一仿照课堂的身份证的例子,实现每个同学仅有一个学号这一问题。实验要求:1. 画出对应的类图;  2......
  • 软件设计实验6:原型模式
     实验6:原型模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解原型模式的动机,掌握该模式的结构;2、能够利用原型模式解决实际问题。 [实验任务一]:向量的原型用C++完成数学中向量的封装,其中,用指针和动态申请支持向量长度的改变,使用浅克隆和深克隆复制向量......