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

简介:

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

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

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

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

View 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架构中作为基站的程序不适合频繁更新

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

View 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类商品 ");
        }
    }

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

在超类中加个方法

View Code
  public  void setdiscountBehavior(discountBehavior dh)
        {
            dcbehavior = dh;
        }

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

 

总结:

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

 



本文转自 熬夜的虫子  51CTO博客,原文链接:http://blog.51cto.com/dubing/712402

相关文章
|
2月前
|
设计模式 算法 Kotlin
Kotlin - 改良设计模式 - 策略模式
Kotlin - 改良设计模式 - 策略模式
55 4
|
14天前
|
设计模式 存储 缓存
前端必须掌握的设计模式——策略模式
策略模式(Strategy Pattern)是一种行为型设计模式,旨在将多分支复杂逻辑解耦。每个分支类只关心自身实现,无需处理策略切换。它避免了大量if-else或switch-case代码,符合开闭原则。常见应用场景包括表单验证、风格切换和缓存调度等。通过定义接口和上下文类,策略模式实现了灵活的逻辑分离与扩展。例如,在国际化需求中,可根据语言切换不同的词条包,使代码更加简洁优雅。总结来说,策略模式简化了多条件判断,提升了代码的可维护性和扩展性。
|
2月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
52 1
|
2月前
|
设计模式 前端开发 JavaScript
JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式
本文深入探讨了JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式,结合电商网站案例,展示了设计模式如何提升代码的可维护性、扩展性和可读性,强调了其在前端开发中的重要性。
46 2
|
2月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
52 2
|
3月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
本教程详细讲解Kotlin语法,适合深入学习。快速入门可参考“简洁”系列教程。本文通过游泳运动员的案例,介绍策略模式及其在Kotlin中的改良应用,利用高阶函数简化代码结构,提高灵活性。
47 3
|
3月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
本教程详细讲解Kotlin语法,适合深入学习。快速入门可参考“简洁”系列教程。本文介绍策略模式在Kotlin中的应用,通过游泳运动员的例子,展示如何使用接口和高阶函数实现策略模式,使代码更简洁、灵活。
38 2
|
3月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
71 3
|
3月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
34 3
|
3月前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入解析与实践
【10月更文挑战第9天】 策略模式是一种行为设计模式,它允许在运行时选择算法的行为。在PHP开发中,通过使用策略模式,我们可以轻松切换算法或逻辑处理方式而无需修改现有代码结构。本文将深入探讨策略模式的定义、结构以及如何在PHP中实现该模式,并通过实际案例展示其应用价值和优势。
44 1