策略模式和简单工厂(四)

策略模式由前端触发决定使用某一组算法或逻辑,每一组算法或逻辑不相同,互相不干扰。最后交由一个上下文具体去执行,并可以增加一定公有逻辑。

比如某电商平台搞活动:

普通会员:满100减10块

白银会员:满100减15块  送积分

黄金会员:满100减18块  送积分  参与抽奖

钻石会员:满100减20块  送积分  参与抽奖  免费送货

由会员级别决定执行哪一个活动,建一个枚举:

public enum MemberLevel
{
    /// <summary>
    /// 普通会员
    /// </summary>
    Normal,
    /// <summary>
    /// 白银会员
    /// </summary>
    Silver,
    /// <summary>
    /// 黄金会员
    /// </summary>
    Gold,
    /// <summary>
    /// 钻石会员
    /// </summary>
    Diamond
}

一个用户类:

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public MemberLevel Level { get; set; }
}

我们有1个会员基类,定义一个优惠的方法:

 public abstract class BaseMember
 {
     public abstract void Preferential(decimal customMoney);
 }

4种会员分别实现BaseMember:

/// <summary>
/// 普通会员
/// </summary>
public class NormalUser : BaseMember
{
    public NormalUser()
    {
        Console.WriteLine("普通会员");
    }
    public override void Preferential(decimal customMoney)
    {
        Console.WriteLine("满100减10块");
    }
}

/// <summary>
/// 白银会员
/// </summary>
public class SilverUser: BaseMember
{
    public SilverUser()
    {
        Console.WriteLine("白银会员");
    }
    public override void Preferential(decimal customMoney)
    {
        Console.WriteLine("满100减15块");
        Console.WriteLine("送积分100");
    }
}

 /// <summary>
 /// 黄金会员
 /// </summary>
 public class GoldUser: BaseMember
 {
     public GoldUser()
     {
         Console.WriteLine("黄金会员");
     }
     public override void Preferential(decimal customMoney)
     {
         //if (customMoney > 100)
         //{
             Console.WriteLine("满100减18块");
             Console.WriteLine("送积分100");
             Console.WriteLine("参与抽奖");
         //}
     }
 }
 
 /// <summary>
/// 钻石会员
/// </summary>
public class DiamondUser : BaseMember
{
    public DiamondUser()
    {
        Console.WriteLine("钻石会员");
    }
    public override void Preferential(decimal customMoney)
    {
        //if (customMoney > 100)
        //{
            Console.WriteLine("满100减20块");
            Console.WriteLine("送积分100");
            Console.WriteLine("参与抽奖");
            Console.WriteLine("免费送货");
        //}
    }
}

我们还需要一个简单工厂:(这里可以从配置文件去获取,通过反射来实例化)

public class SimpleFactory
{
    public static BaseMember CreateMember(MemberLevel memberLevel)
    {
       return MemberLevelConfig.MemberDictionary[memberLevel];
    }
}
public static class MemberLevelConfig
{
    public static Dictionary<MemberLevel, BaseMember> MemberDictionary = new Dictionary<MemberLevel, BaseMember>()
    {
        {MemberLevel.Normal,new NormalUser() },
        {MemberLevel.Silver,new SilverUser() },
        {MemberLevel.Gold,new GoldUser() },
        {MemberLevel.Diamond,new DiamondUser() },
    };
    
}

最后我们还需要一个上下文:增加一个公有的逻辑如果金额不够100则无优惠

public class Context
{
    private BaseMember _baseMember;
    private decimal _customMoney;
    public Context(BaseMember baseMember,decimal customMoney)
    {
        _baseMember = baseMember;
        _customMoney = customMoney;
    }
    public void Preferential()
    {
        if (_customMoney < 100)
        {
            Console.WriteLine("金额未满100,不能参加活动");
        }
        else
        {
            _baseMember.Preferential(_customMoney);
        }
    }
}

现在我们的Main方法:

static void Main(string[] args)
{
    User user = new User();
    user.Level = MemberLevel.Silver;
    var member =  SimpleFactory.SimpleFactory.CreateMember(user.Level);
    Console.WriteLine("********************");
    Context.Context context = new Context.Context(member, 180);
    context.Preferential();
    Console.ReadKey();
}
时间: 2024-08-02 09:08:11

策略模式和简单工厂(四)的相关文章

设计模式笔记——策略模式VS简单工厂模式

策略模式VS简单工厂模式   策略模式(Strategy)它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户. 1.组成 -抽象策略角色: 策略类,通常由一个接口或者抽象类实现. -具体策略角色:包装了相关的算法和行为. -环境角色:持有一个策略类的引用,最终给客户端调用. 2.应用场景 - 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为. -需要在不同情况下使用不同的策略(算法),或者策略还可能在未来

设计模式之策略模式&amp;amp;简单工厂模式

学习设计模式已经有非常长一段时间了,事实上先前已经敲过一遍了.可是老认为没有学到什么,认识也不够深刻.如今趁着重构机房,再又一次来过,也不晚. 事实上在敲了机房之后,看看模式,事实上,曾经非常难理解.非常难看懂的代码一眼就能够看懂了,趁着有点感觉了.早点收获吧. 简单工厂模式: 简单地说简单工厂模式:非常easy变化的地方,就能够用到简单工厂模式. 实例: 举个样例:我们在逛商场时.正好商场促销,各种优惠活动:有满300返100 ,有打8折的.抽奖等等吧. 促销来讲,各种优惠活动事实上就是变化.

策略模式和简单工厂

策略算法类: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace StrategyDemo { abstract class Strategy { public abstract void BillInterface(); } class ConcreteStrategyA : Strategy { public override void BillInte

策略模式与简单工厂模式

1,简单工厂模式 a) 有一个抽象的接口用来表示工厂需要生产的产品共性:然后各个具体的产品类实现该抽象接口. b) 工厂只需要持有产品的抽象接口,工厂接收一个 TYPE 参数来决定生产何种产品. c) 对于客户而言,当他需要某种类型的产品时,只需要获得工厂对象,然后将产品的 TYPE参数传递给工厂,由工厂创建他所需要的产品. 2,策略模式 策略,本质上是一种算法.当客户需要处理某件事情时,由于所处的环境不同,他可以采取不同的方式(策略)去处理.因此,客户关注的是如何方便得获取所需的策略. a)

java笔记--策略模式和简单工厂模式

策略模式: --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3884781.html "谢谢-- 为什么使用:策略模式主要用于有很多不同的方式来解决同一个问题的情景.如:文件的保存:可保存成txt,也可保存成xml.另外压缩文件.商场的促销策略等是类似的 如何使用:需要定义一个接口或者抽象类来表示各种策略的抽象,由于在选择适当的策略上有些不方便,需要不断地判断需要的类型,因此需要用简单工厂方法来实现判断过程 例子: 用策略模式实现图

策略模式结合简单工厂模式

概述 策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少各种算法类与使用算法类之间的耦合. 场景 超市收营员收钱,有打几折.满多少返现.正常收费等活动来最终算出客户应该付多少现金. 1.现金收款超类 package com.gzy.designpattern.strategyandfactory; /* * @program: mybatis-plus * @description: 现金收款超类 * @aut

策略模式+单例模式+简单工厂模式:推送服务

一.功能: 实现  获取数据  —>根据用户订阅清单进行推送 —> 这里的推送方式:QQ.Email.App.插件等等 用户可多选推送方式. 二.实现 1.推送方式—枚举(位运算): [Flags] public enum PushType { QQ = 0, Email = 2 } 2.策略模式:抽象推送策略 public interface IPush { bool Push(object data); } 3.QQ推送+Email推送 QQ推送:单例模式—静态创建QQ推送服务,线程安全.

策略模式与简单工厂模式的结合使用

Java设计模式中的策略模式(Strategy Patten)定义了一组算法,将每个算法都封装起来,并且可使它们之间可以相互替换,在客户端调用它们时可以互不影响. 策略模式主要由三个角色组成 1.抽象策略角色:通常是一个接口或抽象类实现,我们的具体策略类就是继承或实现这个抽象角色. 2.具体策略角色:我们在这些类中写策略和算法,继承或实现抽象策略角色. 3.环境角色:环境角色中拥有一个抽象策略角色的引用,供客户端调用,该角色把客户端跟策略类的实现分离. 从上面的三个策略模式的角色中,我们就大概可

策略模式结合简单工厂

public interface ITurn { string GetUrl(); } public class NatiuBase:ITurn { public string StartDate { get; set; } public string EndDate { get; set; } public string PDUId { get; set; } public string Type { get; set; } public NatiuBase(DD d) { this.Star