博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
结合项目实例 回顾传统设计模式(一)策略模式
阅读量:6226 次
发布时间:2019-06-21

本文共 1986 字,大约阅读时间需要 6 分钟。

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

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

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

所有的会员都具有下列行为

购物,评价,发布商品

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

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

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

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

在超类中加个方法

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

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

 

总结:

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

 

转载于:https://www.cnblogs.com/dubing/archive/2011/09/09/2172212.html

你可能感兴趣的文章
复制延迟排查
查看>>
5.01 列出模式中的表
查看>>
Algs4-1.4DoublingRatio
查看>>
html介绍和head标签
查看>>
(转)C语言位运算详解
查看>>
[题解]Codeforces Round #519 - B. Lost Array
查看>>
Python 学习 —— 进阶篇(装饰器、类的特殊方法)
查看>>
Part 6.系统编程之线程--1(创建,全局变量访问,与进程对比)
查看>>
Unicode和UTF-8
查看>>
笔试算法题(48):简介 - A*搜索算法(A Star Search Algorithm)
查看>>
机器学习-线性回归
查看>>
Editplus的设置
查看>>
wget使用技巧
查看>>
转:Bash脚本15分钟进阶指导
查看>>
excel表格如何限制单元格输入内容
查看>>
认识一下ES6的Reflect和Proxy
查看>>
升级cordova
查看>>
Alpha 冲刺 (10/10)
查看>>
简述mysql数据库配置文件
查看>>
count
查看>>