左右逢源:策略模式

策略模式:它定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的用户。
举一个示例来说:一个代理机票系统,普通用户和vip用户都可以有三种预定和支付方式。按照普通的编程思路,用工厂方法或者简单工厂,在两种用户的对应类里添加设置用户预定和支付的方法就可以了,这样确实也可以解决问题。但是,如果我们的系统需求发生改变(这个经常吧?!),比如说支付和预定方式都增加了,我们的工厂就要相应发生改变,以致代码需要重新编译部署,这不是最好的处理方式。其实这里支付和预定方式都是对应于具体的某种算法,所有算法各自完成的都是相同的工作,只是实现不同,面对算法的变动,剥离出变化点,我们就会想到策略模式。好了,code is cheap.上代码了。
类图:

代码如下:
ContractedBlock.gif ExpandedBlockStart.gif Code
using System;
using System.Data;
using System.Data.SqlClient;
using System.Collections.Generic;
namespace StrategyPattern
{
    
/// <summary>
    
/// 预订方式
    
/// </summary>
    public enum OrderType
    {
        Online, 
// 在线预定
        Telephone, //电话预订
        Counter //直接柜台预订
    }
    
/// <summary>
    
/// 支付方式
    
/// </summary>
    public enum PayType
    {
        Electronic, 
//网上银行
        VirtualMoney,//虚拟货币
        Cash //现金
    }


    
public interface IOrder
    {
        
bool AddOrder();
    }
    
public class OnlineOrder : IOrder
    {
        
public bool AddOrder()
        {
            Console.WriteLine(
"Online order.");
            
return true;
        }
    }
    
public class TelephoneOrder : IOrder
    {
        
public bool AddOrder()
        {
            Console.WriteLine(
"Telephone order.");
            
return true;
        }
    }
    
public class CounterOrder : IOrder
    {
        
public bool AddOrder()
        {
            Console.WriteLine(
"Counter order.");
            
return true;
        }
    }

    
public interface IPay
    {
        
bool Pay();
    }
    
public class ElectronicPay : IPay
    {
        
public bool Pay()
        {
            Console.WriteLine(
"Electronic Pay.");
            
return true;
        }
    }
    
public class VirtualMoneyPay : IPay
    {
        
public bool Pay()
        {
            Console.WriteLine(
"VirtualMoney Pay.");
            
return true;
        }
    }
    
public class CashPay : IPay
    {
        
public bool Pay()
        {
            Console.WriteLine(
"Cash Pay.");
            
return true;
        }
    }

    
/* 策略模式 */
    
public abstract class Customer
    {
        
private string name;
        
public Customer(string name)
        {
            
this.name = name;
        }
        
protected IOrder tmpOrder;
        
protected IPay tmpPay;
        
public void SetOrderType(IOrder order)
        {
            
this.tmpOrder = order;
        }
        
public void SetPayType(IPay pay)
        {
            
this.tmpPay = pay;
        }

        
public void BeginOperation() //这个可以当作简单的模板方法模式应用
        {
            tmpOrder.AddOrder();
            tmpPay.Pay();
        }
    }

    
public class NormalUser : Customer
    {
        
public NormalUser(string name)
            : 
base(name)
        {
            
base.tmpOrder = OrderSimpleFactory.CreateOrderType(OrderType.Counter); //普通客户,默认预订方式:柜台预订,支付方式:现金
            base.tmpPay = PaySimpleFactory.CreatePayType(PayType.Cash);
        }

        
public new void BeginOperation()
        {
            
base.BeginOperation();
        }
    }

    
public class VipUser : Customer
    {
        
public VipUser(string name)
            : 
base(name)
        {
            
base.tmpOrder = OrderSimpleFactory.CreateOrderType(OrderType.Online); //vip客户,默认预订方式:在线预定,支付方式:虚拟货币
            base.tmpPay = PaySimpleFactory.CreatePayType(PayType.VirtualMoney);
        }
        
public new void BeginOperation()
        {
            
base.BeginOperation();
        }
    }


    
/*简单工厂模式*/
    
public class OrderSimpleFactory
    {
        
private static IOrder order = null;
        
public static IOrder CreateOrderType(OrderType oType)
        {
            
switch (oType)
            {
                
default:
                    
break;
                
case OrderType.Online:
                    order 
= new OnlineOrder();
                    
break;
                
case OrderType.Telephone:
                    order 
= new TelephoneOrder();
                    
break;
                
case OrderType.Counter:
                    order 
= new CounterOrder();
                    
break;
            }
            
return order;
        }
    }
    
/*简单工厂模式*/
    
public class PaySimpleFactory
    {
        
private static IPay pay = null;
        
public static IPay CreatePayType(PayType pType)
        {
            
switch (pType)
            {
                
default:
                    
break;
                
case PayType.Electronic:
                    pay 
= new ElectronicPay();
                    
break;
                
case PayType.VirtualMoney:
                    pay 
= new VirtualMoneyPay();
                    
break;
                
case PayType.Cash:
                    pay 
= new CashPay();
                    
break;
            }
            
return pay;
        }
    }

    
public class Program
    {
        
static void Main(string[] args)
        {
            NormalUser nu 
= new NormalUser("jeff");
            VipUser vu 
= new VipUser("Jeff Wong");
            nu.BeginOperation(); 
//默认预订和支付方式
            Console.WriteLine("---------------------------------------------------------------------------");
            vu.BeginOperation(); 
//默认预订和支付方式

            Console.WriteLine(
"---------------------------------------------------------------------------");

            nu.SetOrderType(
new TelephoneOrder());
            nu.SetPayType(
new VirtualMoneyPay());
            
//普通用户 更改预订方式和支付方式

            vu.SetOrderType(
new OnlineOrder());
            vu.SetPayType(
new ElectronicPay());
            
//VIP用户 更改预订方式和支付方式

            nu.BeginOperation();
            Console.WriteLine(
"---------------------------------------------------------------------------");
            vu.BeginOperation();
            Console.Read();
        }
    }

}

上面的实例中,IOrder和IPay相当于策略模式中的Strategy,继承它们的相当于具体算法ConcreteStrategy,而customer(或者继承它的)类相当于Context,维护对Strategy对象的引用。客户端调用时,可以设置不同的策略。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值