手机
当前位置:查字典教程网 >编程开发 >php教程 >asp.net 组合模式的一个例子
asp.net 组合模式的一个例子
摘要:复制代码代码如下: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);

}

}

}

【asp.net 组合模式的一个例子】相关文章:

一个PHP+MSSQL分页的例子

自己动手做一个SQL解释器

php 类自动载入的方法

PHP实现多线程的两个方法

一个php作的文本留言本的例子(一)

使用无限生命期Session的方法

php线性表的入栈与出栈实例分析

PHP5在Apache下的两种模式的安装

PHP模拟SQL Server的两个日期处理函数

Session的工作方式

精品推荐
分类导航