结合项目实例 回顾传统设计模式(一)策略模式

本文深入探讨了策略模式在电商会员系统设计中的应用,通过实例展示了如何利用策略模式解决不同会员角色的特定行为需求,如购物、评价、商品推广等。文章进一步阐述了在面对频繁需求变更和不同会员分类时,如何采用接口和策略模式来提高代码的灵活性和可维护性。通过实例代码演示了如何动态设定会员行为,以及如何在超类中添加方法以实现‘随时’调整会员行为的功能。最后,总结了策略模式的核心价值,即针对接口编程,实现算法变化的独立性,从而提升系统的扩展性和稳定性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

虫子以前在一家电商公司 会员的模块在这里分类很明确

不同的会员所具有的权限和行为不同,大多程序员会使用标准的oo技术,设计一个会员超类SuperUser,并让各种商家会员继承此超类

到这里无可厚非,但是在下面个过程中你可以就慢慢体会策略模式与你在代码里不停写逻辑判断所带来的区别有多大

所有的会员都具有下列行为
购物,评价,发布商品

ExpandedBlockStart.gifView Code
public abstract class SuperUser
    {
        public SuperUser()
        {
        }
        public void shopping()
        {
            Console.WriteLine("shopping");
        }
        public void Comment()
        {
            Console.WriteLine("Comment");
        }
        public abstract void Promote();
        
    }
    public class UserA : SuperUser
    {
        public override void Promote()
        {
            Console.WriteLine("推广A类商品");
        }
    }
    public class UserB : SuperUser
    {
        public override void Promote()
        {
            Console.WriteLine("推广B类商品");
        }
    }

因为不同商家会员只能推广指定类型的商品所以这里Promote方法抽象出来

好吧 现在我们来了一个新需求 对于B类的用户 进行购物折价

加在什么地方 超类? 不 并不是所有的会员都拥有折价 逻辑判断? 是个方法 不过对于不断需求的变更 在庞大臃肿的领域模型中 时间长了 也hold不住 更何况还不停有不同的商家会员分类加进来 并且在大型web架构中作为基站的程序不适合频繁更新

既然这样 利用接口如何 对改变关闭 对扩展开放

ExpandedBlockStart.gifView Code
public interface discountBehavior
    {
         void discount();
    }

    public class diswithB : discountBehavior
    {
        public void discount()
        {
            Console.WriteLine("能打折扣呃");
        }
    }

    public class Nodis : discountBehavior
    {
        public void discount()
        {
            Console.WriteLine("不能打折扣");
        }
    }

    public abstract class SuperUser
    {
        public SuperUser()
        {
        }
        public void shopping()
        {
            Console.WriteLine("shopping");
        }
        public void Comment()
        {
            Console.WriteLine("Comment");
        }
        public abstract void Promote();

        public discountBehavior dcbehavior;
        public void discount()
        {
            dcbehavior.discount();
        }
        
    }
    public class UserA : SuperUser, discountBehavior
    {
        public UserA()
        {
            dcbehavior = new Nodis();
        }
        public override void Promote()
        {
            Console.WriteLine("推广A类商品");
        }
    }
    public class UserB : SuperUser, discountBehavior
    {
        public UserB()
        {
            dcbehavior = new diswithB();
        }
        public override void Promote()
        {
            Console.WriteLine("推广B类商品");
        }
    }

下面我们再来试试动态设定行为

在超类中加个方法

ExpandedBlockStart.gifView Code
 public void setdiscountBehavior(discountBehavior dh)
        {
            dcbehavior = dh;
        }

这样就可以“随时”调用这个方法 改变会员的行为

 

总结:

策略模式:针对接口编程,而不是针对实现编程。多用组合少用继承。策略模式定义了算法簇,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值