• 技术文章 >php教程 >php手册

    asp.net 组合模式的一个例子

    2016-06-13 11:57:00原创466

    复制代码 代码如下:


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    namespace Test
    {
    class Program
    {
    static void Main(string[] args)
    {
    var customer = new Customer
    {
    IsActive = true,
    LateFees = 100M,
    TotalRentNumber = 10
    };
    Console.WriteLine(customer.CanRent());
    Console.ReadKey();
    }
    }
    public interface ISpecification
    {
    ///


    /// 是否可以租赁
    ///

    bool IsSatisfiedBy(T entity);
    ///
    /// 与操作
    ///

    ISpecification And(ISpecification other);
    ///
    /// 否操作
    ///

    ISpecification Not();
    }
    ///
    /// 基类
    ///

    public abstract class CompositeSpecification : ISpecification
    {
    public abstract bool IsSatisfiedBy(T candidate);
    public ISpecification And(ISpecification other)
    {
    return new AndSpecification(this, other);
    }
    public ISpecification Not()
    {
    return new NotSpecification(this);
    }
    }
    ///
    /// 与操作
    ///

    public class AndSpecification : CompositeSpecification
    {
    private ISpecification leftSpecification;
    private ISpecification rightSpecification;
    public AndSpecification(ISpecification leftSpecification, ISpecification rightSpecification)
    {
    this.leftSpecification = leftSpecification;
    this.rightSpecification = rightSpecification;
    }
    public override bool IsSatisfiedBy(T entity)
    {
    return leftSpecification.IsSatisfiedBy(entity) && rightSpecification.IsSatisfiedBy(entity);
    }
    }
    ///
    ///否操作
    ///

    public class NotSpecification : CompositeSpecification
    {
    private ISpecification innerSpecification;
    public NotSpecification(ISpecification innerSpecification)
    {
    this.innerSpecification = innerSpecification;
    }
    public override bool IsSatisfiedBy(T entity)
    {
    return !innerSpecification.IsSatisfiedBy(entity);
    }
    }
    ///
    /// 是否达到最大的规定租赁数
    ///

    public class HasReachedMaxSpecification : CompositeSpecification
    {
    public override bool IsSatisfiedBy(Customer entity)
    {
    return entity.TotalRentNumber > 5;
    }
    }
    ///
    /// 是否激活
    ///

    public class CustomerActiveSpecification : CompositeSpecification
    {
    public override bool IsSatisfiedBy(Customer entity)
    {
    return entity.IsActive;
    }
    }
    ///
    /// 是否欠费
    ///

    public class CustomerHasLateFeesSpecification : CompositeSpecification
    {
    public override bool IsSatisfiedBy(Customer entity)
    {
    return entity.LateFees > 0;
    }
    }
    public class Customer
    {
    private ISpecification hasReachedRentalThreshold;
    private ISpecification customerIsActive;
    private ISpecification customerHasLateFees;
    public Customer()
    {
    hasReachedRentalThreshold = new HasReachedMaxSpecification();
    customerIsActive = new CustomerActiveSpecification();
    customerHasLateFees = new CustomerHasLateFeesSpecification();
    }
    ///
    /// 用户租赁DVD数量
    ///

    public int TotalRentNumber
    {
    get;
    set;
    }
    ///
    /// 账户是否激活
    ///

    public bool IsActive
    {
    get;
    set;
    }
    ///
    /// 用户之前是否还欠费
    ///

    public decimal LateFees
    {
    get;
    set;
    }
    public bool CanRent()
    {
    ISpecification canRent = customerIsActive.And(hasReachedRentalThreshold.Not()).And(customerHasLateFees.Not());
    return canRent.IsSatisfiedBy(this);
    }
    }
    }

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

    相关文章推荐

    • [namespace]PHP命名空间的使用基础,namespace命名空间• PHP封装的一个支持HTML、JS、PHP重定向的多功能跳转函数• php利用新浪接口查询ip获取地理位置• PHP中的XML拉模式解析• php mysql 数据库类
    1/1

    PHP中文网