asp.net 组合模式的一个例子_php教程-查字典教程网
asp.net 组合模式的一个例子
asp.net 组合模式的一个例子
发布时间:2016-12-29 来源:查字典编辑
摘要:复制代码代码如下:usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;...

复制代码 代码如下:

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<T>

{

/// <summary>

/// 是否可以租赁

/// </summary>

bool IsSatisfiedBy(T entity);

/// <summary>

/// 与操作

/// </summary>

ISpecification<T> And(ISpecification<T> other);

/// <summary>

/// 否操作

/// </summary>

ISpecification<T> Not();

}

/// <summary>

/// 基类

/// </summary>

public abstract class CompositeSpecification<T> : ISpecification<T>

{

public abstract bool IsSatisfiedBy(T candidate);

public ISpecification<T> And(ISpecification<T> other)

{

return new AndSpecification<T>(this, other);

}

public ISpecification<T> Not()

{

return new NotSpecification<T>(this);

}

}

/// <summary>

/// 与操作

/// </summary>

public class AndSpecification<T> : CompositeSpecification<T>

{

private ISpecification<T> leftSpecification;

private ISpecification<T> rightSpecification;

public AndSpecification(ISpecification<T> leftSpecification, ISpecification<T> rightSpecification)

{

this.leftSpecification = leftSpecification;

this.rightSpecification = rightSpecification;

}

public override bool IsSatisfiedBy(T entity)

{

return leftSpecification.IsSatisfiedBy(entity) && rightSpecification.IsSatisfiedBy(entity);

}

}

///<summary>

///否操作

/// </summary>

public class NotSpecification<T> : CompositeSpecification<T>

{

private ISpecification<T> innerSpecification;

public NotSpecification(ISpecification<T> innerSpecification)

{

this.innerSpecification = innerSpecification;

}

public override bool IsSatisfiedBy(T entity)

{

return !innerSpecification.IsSatisfiedBy(entity);

}

}

/// <summary>

/// 是否达到最大的规定租赁数

/// </summary>

public class HasReachedMaxSpecification : CompositeSpecification<Customer>

{

public override bool IsSatisfiedBy(Customer entity)

{

return entity.TotalRentNumber > 5;

}

}

/// <summary>

/// 是否激活

/// </summary>

public class CustomerActiveSpecification : CompositeSpecification<Customer>

{

public override bool IsSatisfiedBy(Customer entity)

{

return entity.IsActive;

}

}

/// <summary>

/// 是否欠费

/// </summary>

public class CustomerHasLateFeesSpecification : CompositeSpecification<Customer>

{

public override bool IsSatisfiedBy(Customer entity)

{

return entity.LateFees > 0;

}

}

public class Customer

{

private ISpecification<Customer> hasReachedRentalThreshold;

private ISpecification<Customer> customerIsActive;

private ISpecification<Customer> customerHasLateFees;

public Customer()

{

hasReachedRentalThreshold = new HasReachedMaxSpecification();

customerIsActive = new CustomerActiveSpecification();

customerHasLateFees = new CustomerHasLateFeesSpecification();

}

/// <summary>

/// 用户租赁DVD数量

/// </summary>

public int TotalRentNumber

{

get;

set;

}

/// <summary>

/// 账户是否激活

/// </summary>

public bool IsActive

{

get;

set;

}

/// <summary>

/// 用户之前是否还欠费

/// </summary>

public decimal LateFees

{

get;

set;

}

public bool CanRent()

{

ISpecification<Customer> canRent = customerIsActive.And(hasReachedRentalThreshold.Not()).And(customerHasLateFees.Not());

return canRent.IsSatisfiedBy(this);

}

}

}

相关阅读
推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
  • 大家都在看
  • 小编推荐
  • 猜你喜欢
  • 最新php教程学习
    热门php教程学习
    编程开发子分类