传统设计模式(一)策略模式

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

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

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

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

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类的用户 进行购物折价

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/project/

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

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

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

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

在超类中加个方法

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

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

总结:

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

Author:cnblogs 熬夜的虫子

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索class
, public
, 会员
, console
, WriteLine
void
策略设计模式、策略设计模式 java、设计模式之策略模式、ios 策略设计模式、传统市场营销策略,以便于您获取更多的相关知识。

时间: 2024-08-03 12:32:16

传统设计模式(一)策略模式的相关文章

深入理解JavaScript系列(33):设计模式之策略模式详解

 这篇文章主要介绍了深入理解JavaScript系列(33):设计模式之策略模式详解,策略模式定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户,需要的朋友可以参考下     介绍 策略模式定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户. 正文 在理解策略模式之前,我们先来一个例子,一般情况下,如果我们要做数据合法性验证,很多时候都是按照swith语句来判断,但是这就带来几个问题,首先如果增加需求的话

JavaScript设计模式之策略模式

在网上搜索"为什么MVC不是一种设计模式呢?"其中有解答:MVC其实是三个经典设计模式的演变:观察者模式(Observer).策略模式(Strategy).组合模式(Composite).所以我今天选择学习策略模式. 策略模式:定义了一系列家族算法,并对每一种算法单独封装起来,让算法之间可以相互替换,独立于使用算法的客户. 通常我并不会记得"牛顿第一定律"的具体内容,所以我也难保证我会对这个定义记得多久--用FE经常见到的东西来举个例子说明一下: $("d

乐在其中设计模式(C#) - 策略模式(Strategy Pattern)

原文:乐在其中设计模式(C#) - 策略模式(Strategy Pattern)[索引页][源码下载] 乐在其中设计模式(C#) - 策略模式(Strategy Pattern) 作者:webabcd 介绍 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法的变化可独立于使用它的客户. 示例 有一个Message实体类,对它的操作有Insert()和Get()方法,持久化数据在SqlServer数据库中或Xml文件里(两种可互换的算法).由客户端决定使用哪种算法. Me

设计模式之五(策略模式)

原文:设计模式之五(策略模式) 前言 策略模式:它定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户. 策略模式结构图   Strategy:策略类,定义所有支持的算法的公共接口 ConcreteStrategy1,ConcreteStrategy2,ConcreteStrategy3这三个是具体策略类,封装了具体的算法或行为,继承于Strategy Context上下文,用一个ConcreteStrategy来配置,维护一个对Strategy对象

设计模式:策略模式(Strategy)

定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化. 策略模式的角色: 1. 抽象策略角色(Strategy):策略类,通常由一个接口或者抽象类实现 2. 具体策略角色(ConcreteStrategy):包装了相关的算法和行为 3. 环境角色(Context):持有一个策略类的引用,最终给客户端调用 这里引用参考资料3中的例子来详细说明一下策略模式. "赔了夫人又折兵"--这个是<三国演义>里的著名桥段,主要是说刘备要去

【设计模式】—— 策略模式Strategy

模式意图 定义一系列的算法,把他们封装起来,使得算法独立于适用对象. 比如,一个系统有很多的排序算法,但是使用哪个排序算法是客户对象的自有.因此把每一个排序当做一个策略对象,客户调用哪个对象,就使用对应的策略方法. 应用场景 1 当许多的类,仅仅是行为或者策略不同时,可以把行为或策略单独提取出来,这样主体的类就可以进行统一了. 2 需要使用不同的算法. 3 一个类定义了多种行为. 模式结构 Context 环境角色的,策略的调用者 class Context{ private Strategy

php设计模式之策略模式

策略模式: 策略模式是对象的行为模式,用意是对一组算法的封装.动态的选择需要的算法并使用. 策略模式指的是程序中涉及决策控制的一种模式.策略模式功能非常强大,因为这个设计模式本身的核心思想就是面向对象编程的多形性思想. 策略模式的三个角色: 1.抽象策略角色 2.具体策略角色 3.环境角色(对抽象策略角色的引用) 实现步骤: 1.定义抽象角色类(定义好各个实现的共同抽象方法) 2.定义具体策略类(具体实现父类的共同方法) 3.定义环境角色类(私有化申明抽象角色变量,重载构造方法,执行抽象方法)

【设计模式】策略模式Strategy_03

接着上一篇总结继续探讨. 我们之前用自己的方式来实现了JDK的Comparable和Comparator接口,我们下面来看看实际当中JDK给我们的Comparable和Comparator接口. 我们对之前的Dog和Dog的比较类DogWeightComparator的实现进行修改: Dog.java: package cn.edu.hpu.Strategy; public class Dog implements java.lang.Comparable<Dog>{ //狗的身高 priva

大话设计模式之策略模式

        打开百度,搜索"策略"二字,她给你这样的答案:a.可以实现目标的方案集合:b.根据形势发展而制定的行动方针和斗争方法:c. 有斗争艺术,能注意方式方法:d. 计谋,谋略.e.在作当前决策时即将未来的决策考虑在内的一种计划.接着,我们开始搜索"模式"二字,不负众望,她同样给你一个反馈信息:模式是指从生产经验和生活经验中经过抽象和升华提炼出来的核心知识体系.模式(Pattern)其实就是解决某一类问题的方法论.把解决某类问题的方法总结归纳到理论高度,那就

【Java设计模式】策略模式

(转载请注明出处:http://blog.csdn.net/buptgshengod) 1.背景知识    策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法.比如每个人都要"交个人所得税",但是"在美国交个人所得税"和"在中国交个人所得税"就有不同的算税方法.策略模式将不同的算法封装起来,根据客户端的需求,调用不同的对象使用不同的算法,节省了大量的if-else之类的代码量. 2.实现 本例由三种算法组成